/// one-time class and physics initialization void Terrain::initialize(void) { // std::cerr << "initializing...\n"; /* This code is inside cPhysics class */ // set up basic state /* m_upAxis = 1; // start with Y-axis as "up" m_type = PHY_FLOAT; m_model = eRadial;//eFractal; m_isDynamic = true; // set up the physics world m_collisionConfiguration = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldMin(-1000,-1000,-1000); btVector3 worldMax(1000,1000,1000); m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); m_constraintSolver = new btSequentialImpulseConstraintSolver(); m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); // initialize axis- or type-dependent physics from here this->resetPhysics(); */ clearWorld(); // get new heightfield of appropriate type m_rawHeightfieldData = getRawHeightfieldData(eRadial, PHY_FLOAT, m_minHeight, m_maxHeight); bool flipQuadEdges = false; // width, height, *heightmapData, scale, minHeight, maxHeight, upAxis, heightMapDatatype, flipQuadEdges btHeightfieldTerrainShape * heightfieldShape = new btHeightfieldTerrainShape(s_gridSize, s_gridSize, m_rawHeightfieldData, s_gridHeightScale, m_minHeight, m_maxHeight, m_upAxis, PHY_FLOAT, flipQuadEdges); assert(heightfieldShape); // scale the shape btVector3 localScaling = getUpVector(m_upAxis, s_gridSpacing, 1.0); heightfieldShape->setLocalScaling(localScaling); // stash this shape away cPhysics::Get().getCollisionShapes().push_back(heightfieldShape); //m_collisionShapes.push_back(heightfieldShape); // set origin to middle of heightfield btTransform tr; tr.setIdentity(); tr.setOrigin(btVector3(0,-20,0)); // create ground object float mass = 0.0; //localCreateRigidBody(mass, tr, heightfieldShape); //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: btRigidBody* body = cPhysics::Get().GetNewBody(heightfieldShape, mass, cVec3(0, -20, 0)); }
/// called whenever key terrain attribute is changed void TerrainDemo::resetPhysics(void) { // remove old heightfield clearWorld(); // reset gravity to point in appropriate direction m_dynamicsWorld->setGravity(getUpVector(m_upAxis, 0.0, -s_gravity)); // get new heightfield of appropriate type m_rawHeightfieldData = getRawHeightfieldData(m_model, m_type, m_minHeight, m_maxHeight); btAssert(m_rawHeightfieldData && "failed to create raw heightfield"); bool flipQuadEdges = false; btHeightfieldTerrainShape * heightfieldShape = new btHeightfieldTerrainShape(s_gridSize, s_gridSize, m_rawHeightfieldData, s_gridHeightScale, m_minHeight, m_maxHeight, m_upAxis, m_type, flipQuadEdges); btAssert(heightfieldShape && "null heightfield"); // scale the shape btVector3 localScaling = getUpVector(m_upAxis, s_gridSpacing, 1.0); heightfieldShape->setLocalScaling(localScaling); // stash this shape away m_collisionShapes.push_back(heightfieldShape); // set origin to middle of heightfield btTransform tr; tr.setIdentity(); tr.setOrigin(btVector3(0,-20,0)); // create ground object float mass = 0.0; localCreateRigidBody(mass, tr, heightfieldShape); }