basketball_code / softgym /PyFlex /bindings /scenes /localspacecloth.h
youqiwong's picture
Upload folder using huggingface_hub
0c51b93 verified
class LocalSpaceCloth : public Scene
{
public:
LocalSpaceCloth (const char* name) : Scene(name) {}
void Initialize()
{
float stretchStiffness = 1.0f;
float bendStiffness = 1.0f;
float shearStiffness = 1.0f;
float radius = 0.1f;
CreateSpringGrid(Vec3(0.5f, 1.45f, -0.5f), 32, 20, 1, radius*0.5f, NvFlexMakePhase(0, eNvFlexPhaseSelfCollide | eNvFlexPhaseSelfCollideFilter), stretchStiffness, bendStiffness, shearStiffness, Vec3(0.0f), 1.0f);
int c1 = 1;
int c2 = 20;
// add tethers
for (int i=0; i < int(g_buffers->positions.size()); ++i)
{
float minSqrDist = FLT_MAX;
if (i != c1 && i != c2)
{
float stiffness = -0.8f;
float give = 0.01f;
float sqrDist = LengthSq(Vec3(g_buffers->positions[c1])-Vec3(g_buffers->positions[c2]));
if (sqrDist < minSqrDist)
{
CreateSpring(c1, i, stiffness, give);
CreateSpring(c2, i, stiffness, give);
minSqrDist = sqrDist;
}
}
}
for (int i=0; i < g_buffers->positions.size(); ++i)
{
if (g_buffers->positions[i].x == 0.5f)
g_buffers->positions[i].w = 0.0f;
}
translation = Vec3(0.0f, 1.0f, 0.0f);
size = Vec3(0.5f, 1.1f, 0.6f);
rotation = 0.0f;
rotationSpeed = 0.0f;
linearInertialScale = 0.25f;
angularInertialScale = 0.25f;
AddBox(size, translation);
// initialize our moving frame to the center of the box
NvFlexExtMovingFrameInit(&meshFrame, translation, Quat());
g_numSubsteps = 2;
g_params.radius = radius;
g_params.dynamicFriction = 0.f;
g_params.restitution = 0.0f;
g_params.shapeCollisionMargin = 0.05f;
g_params.numIterations = 6;
// draw options
g_drawPoints = false;
}
virtual void DoGui()
{
imguiSlider("Rotation", &rotationSpeed, 0.0f, 20.0f, 0.1f);
imguiSlider("Translation", &translation.x, -2.0f, 2.0f, 0.001f);
imguiSlider("Linear Inertia", &linearInertialScale, 0.0f, 1.0f, 0.001f);
imguiSlider("Angular Inertia", &angularInertialScale, 0.0f, 1.0f, 0.001f);
}
virtual void Update()
{
rotation += rotationSpeed*g_dt;
// new position of the box center
Vec3 newPosition = translation;//meshFrame.GetPosition() + Vec3(float(g_lastdx), 0.0f, float(g_lastdy))*0.001f;
Quat newRotation = QuatFromAxisAngle(Vec3(0.0f, 1.0f, 0.0f), rotation);
NvFlexExtMovingFrameUpdate(&meshFrame, newPosition, newRotation, g_dt);
// update all the particles in the sim with inertial forces
NvFlexExtMovingFrameApply(
&meshFrame,
&g_buffers->positions[0].x,
&g_buffers->velocities[0].x,
g_buffers->positions.size(),
linearInertialScale,
angularInertialScale,
g_dt);
// update collision shapes
g_buffers->shapePositions.resize(0);
g_buffers->shapeRotations.resize(0);
g_buffers->shapePrevPositions.resize(0);
g_buffers->shapePrevRotations.resize(0);
g_buffers->shapeGeometry.resize(0);
g_buffers->shapeFlags.resize(0);
AddBox(size, newPosition, newRotation);
UpdateShapes();
}
Vec3 size;
Vec3 translation;
float rotation;
float rotationSpeed;
float linearInertialScale;
float angularInertialScale;
NvFlexExtMovingFrame meshFrame;
NvFlexTriangleMeshId mesh;
};