|
|
| class FlagCloth: public Scene |
| { |
| public: |
|
|
| FlagCloth(const char* name) : Scene(name) {} |
|
|
| void Initialize() |
| { |
| int dimx = 64; |
| int dimz = 32; |
| float radius = 0.05f; |
|
|
| float stretchStiffness = 0.9f; |
| float bendStiffness = 1.0f; |
| float shearStiffness = 0.9f; |
| int phase = NvFlexMakePhase(0, eNvFlexPhaseSelfCollide); |
| |
| CreateSpringGrid(Vec3(0.0f, 0.0f, -3.0f), dimx, dimz, 1, radius, phase, stretchStiffness, bendStiffness, shearStiffness, 0.0f, 1.0f); |
|
|
| const int c1 = 0; |
| const int c2 = dimx*(dimz-1); |
|
|
| g_buffers->positions[c1].w = 0.0f; |
| g_buffers->positions[c2].w = 0.0f; |
|
|
| |
| for (int i=0; i < int(g_buffers->positions.size()); ++i) |
| { |
| |
| swap(g_buffers->positions[i].y, g_buffers->positions[i].z); |
| g_buffers->positions[i].y *= -1.0f; |
|
|
| g_buffers->velocities[i] = RandomUnitVector()*0.1f; |
|
|
| float minSqrDist = FLT_MAX; |
|
|
| if (i != c1 && i != c2) |
| { |
| float stiffness = -0.8f; |
| float give = 0.1f; |
|
|
| 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; |
| } |
| } |
| } |
| |
| g_params.radius = radius*1.0f; |
| g_params.dynamicFriction = 0.25f; |
| g_params.dissipation = 0.0f; |
| g_params.numIterations = 4; |
| g_params.drag = 0.06f; |
| g_params.relaxationFactor = 1.0f; |
|
|
| g_numSubsteps = 2; |
|
|
| |
| g_drawPoints = false; |
| g_drawSprings = false; |
| g_windFrequency *= 2.0f; |
| g_windStrength = 10.0f; |
|
|
| } |
|
|
| void Update() |
| { |
| const Vec3 kWindDir = Vec3(3.0f, 15.0f, 0.0f); |
| const float kNoise = fabsf(Perlin1D(g_windTime*0.05f, 2, 0.25f)); |
| Vec3 wind = g_windStrength*kWindDir*Vec3(kNoise, kNoise*0.1f, -kNoise*0.1f); |
| |
| g_params.wind[0] = wind.x; |
| g_params.wind[1] = wind.y; |
| g_params.wind[2] = wind.z; |
| } |
| }; |
|
|
|
|