|
|
|
|
|
|
| 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; |
|
|
| |
| 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); |
|
|
| |
| 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; |
| |
| |
| 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; |
|
|
| |
| Vec3 newPosition = translation; |
| Quat newRotation = QuatFromAxisAngle(Vec3(0.0f, 1.0f, 0.0f), rotation); |
|
|
| NvFlexExtMovingFrameUpdate(&meshFrame, newPosition, newRotation, g_dt); |
|
|
| |
| NvFlexExtMovingFrameApply( |
| &meshFrame, |
| &g_buffers->positions[0].x, |
| &g_buffers->velocities[0].x, |
| g_buffers->positions.size(), |
| linearInertialScale, |
| angularInertialScale, |
| g_dt); |
|
|
| |
| 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; |
| }; |
|
|