youqiwong's picture
Upload folder using huggingface_hub
0c51b93 verified
class GameMesh : public Scene
{
public:
GameMesh(const char* name, int scene) : Scene(name), mScene(scene) {}
void Initialize()
{
Mesh* level = ImportMeshFromBin(GetFilePathByPlatform("../../data/testzone.bin").c_str());
level->Normalize(100.0f);
level->Transform(TranslationMatrix(Point3(0.0f, -5.0f, 0.0f)));
level->CalculateNormals();
Vec3 lower, upper;
level->GetBounds(lower, upper);
Vec3 center = (lower+upper)*0.5f;
NvFlexTriangleMeshId mesh = CreateTriangleMesh(level);
AddTriangleMesh(mesh, Vec3(), Quat(), 1.0f);
delete level;
int group = 0;
// rigids
if (mScene == 0)
{
float radius = 0.05f;
for (int z=0; z < 80; ++z)
for (int x=0; x < 80; ++x)
CreateParticleGrid(
center - Vec3(-16.0f, 0.0f, 15.0f) + 2.0f*Vec3(x*radius*2 - 1.0f, 1.0f + radius, 1.f + z*2.0f*radius) + Vec3(Randf(radius), 0.0f, Randf(radius)),
2, 2 + int(Randf(0.0f, 4.0f)), 2, radius*0.9f, Vec3(0.0f), 1.0f, true, 1.0f, NvFlexMakePhase(group++, 0), 0.0f);
// separte solid particle count
g_numSolidParticles = g_buffers->positions.size();
g_params.radius = radius;
g_params.dynamicFriction = 0.3f;
g_params.dissipation = 0.0f;
g_params.fluidRestDistance = g_params.radius*0.5f;
g_params.viscosity = 0.05f;
g_params.numIterations = 2;
g_params.numPlanes = 1;
g_params.sleepThreshold = g_params.radius*0.3f;
g_params.maxSpeed = g_numSubsteps*g_params.radius/g_dt;
g_params.collisionDistance = radius*0.5f;
g_params.shapeCollisionMargin = g_params.collisionDistance*0.05f;
g_numSubsteps = 2;
g_emitters[0].mEnabled = true;
g_emitters[0].mSpeed = 2.0f*(g_params.radius*0.5f)/g_dt;
// draw options
g_drawPoints = true;
g_drawMesh = false;
}
// basic particles
if (mScene == 1)
{
float radius = 0.1f;
CreateParticleGrid(center - Vec3(2.0f, 7.0f, 2.0f) , 32, 64, 32, radius*1.02f, Vec3(0.0f), 1.0f, false, 0.0f, NvFlexMakePhase(0, eNvFlexPhaseSelfCollide), 0.0f);
g_params.radius = radius;
g_params.dynamicFriction = 0.1f;
g_params.dissipation = 0.0f;
g_params.numIterations = 4;
g_params.numPlanes = 1;
g_params.particleCollisionMargin = g_params.radius*0.1f;
g_params.restitution = 0.0f;
g_params.collisionDistance = g_params.radius*0.5f;
g_params.shapeCollisionMargin = g_params.collisionDistance*0.05f;
g_numSubsteps = 2;
// draw options
g_drawPoints = true;
}
// fluid particles
if (mScene == 2)
{
float radius = 0.1f;
float restDistance = radius*0.6f;
CreateParticleGrid(center - Vec3(0.0f, 7.0f, 2.0f) , 32, 64, 32, restDistance, Vec3(0.0f), 1.0f, false, 0.0f, NvFlexMakePhase(0, eNvFlexPhaseSelfCollide | eNvFlexPhaseFluid), 0.0f);
g_params.radius = radius;
g_params.dynamicFriction = 0.1f;
g_params.dissipation = 0.0f;
g_params.numPlanes = 1;
g_params.fluidRestDistance = restDistance;
g_params.viscosity = 0.5f;
g_params.numIterations = 3;
g_params.smoothing = 0.5f;
g_params.relaxationFactor = 1.0f;
g_params.restitution = 0.0f;
g_params.smoothing = 0.5f;
g_params.collisionDistance = g_params.radius*0.5f;
g_params.shapeCollisionMargin = g_params.collisionDistance*0.05f;
g_numSubsteps = 2;
// draw options
g_drawPoints = false;
g_drawEllipsoids = true;
g_drawDiffuse = true;
g_lightDistance = 5.0f;
}
// cloth
if (mScene == 3)
{
float stretchStiffness = 1.0f;
float bendStiffness = 0.8f;
float shearStiffness = 0.8f;
int dimx = 32;
int dimz = 32;
float radius = 0.05f;
int gridx = 8;
int gridz = 3;
for (int x=0; x < gridx; ++x)
{
for (int y=0; y < 1; ++y)
{
for (int z=0; z < gridz; ++z)
{
CreateSpringGrid(center - Vec3(9.0f, 1.0f, 0.1f) + Vec3(x*dimx*radius, 0.0f, z*1.0f), dimx, dimz, 1, radius*0.95f, NvFlexMakePhase(0, eNvFlexPhaseSelfCollide | eNvFlexPhaseSelfCollideFilter), stretchStiffness, bendStiffness, shearStiffness, 0.0f, 1.0f);
}
}
}
Vec3 l, u;
GetParticleBounds(l, u);
Vec3 center = (u+l)*0.5f;
printf("%f %f %f\n", center.x, center.y, center.z);
g_params.radius = radius*1.0f;
g_params.dynamicFriction = 0.4f;
g_params.staticFriction = 0.5f;
g_params.dissipation = 0.0f;
g_params.numIterations = 8;
g_params.drag = 0.06f;
g_params.sleepThreshold = g_params.radius*0.125f;
g_params.relaxationFactor = 2.0f;
g_params.collisionDistance = g_params.radius;
g_params.shapeCollisionMargin = g_params.collisionDistance*0.05f;
g_windStrength = 0.0f;
g_numSubsteps = 2;
// draw options
g_drawPoints = false;
}
}
virtual void PostInitialize()
{
// just focus on the particles, don't need to see the whole level
Vec3 lower, upper;
GetParticleBounds(lower, upper);
g_sceneUpper = upper;
g_sceneLower = lower;
}
virtual void CenterCamera(void)
{
g_camPos = Vec3((g_sceneLower.x+g_sceneUpper.x)*0.5f, min(g_sceneUpper.y*1.25f, 6.0f), g_sceneUpper.z + min(g_sceneUpper.y, 6.0f)*2.0f);
g_camAngle = Vec3(0.0f, -DegToRad(15.0f), 0.0f);
}
int mScene;
};