this:
Code: Select all
Ogre::TerrainGroup * pGroup=((Ogre::TerrainPagedWorldSection *)section)->getTerrainGroup();
long x,y;
pGroup->unpackIndex(page->getID(), &x, &y);
Ogre::Terrain * pTerrain=pGroup->getTerrain(x,y);
float * data=pTerrain->getHeightData();
Ogre::Vector3 tpos=pTerrain->getPosition();
btVector3 pos(tpos.x,tpos.y,tpos.z);
float * pDataConvert= new float[pTerrain->getSize() *pTerrain->getSize()];
for (int i=0;i<pTerrain->getSize();i++)
memcpy(pDataConvert+pTerrain->getSize()*i
, pTerrain->getHeightData() + pTerrain->getSize()-i-1
,sizeof(float)*pTerrain->getSize());
pEngine->putTerrainData(
pTerrain->getSize(),
pTerrain->getSize(),
pTerrain->getHeightData(),
pTerrain->getMinHeight(),
pTerrain->getMaxHeight(),
pos,
pTerrain->getWorldSize()/(pTerrain->getSize()-1) );
delete []pDataConvert;
Code: Select all
void BulletEngine::putTerrainData(float w,float h,float* data,float minH,float maxH,btVector3& pos,float scale)
{
bool useFloatData=true;
bool flipQuadEdges=false;
int upIndex = 1;
btHeightfieldTerrainShape* heightFieldShape =
new btHeightfieldTerrainShape(w,h,data,1,minH,maxH,upIndex,PHY_FLOAT,flipQuadEdges);
groundShape = heightFieldShape;
heightFieldShape->setUseDiamondSubdivision(true);
heightFieldShape->setLocalScaling(btVector3(scale,1,scale));
btTransform groundTransform;
groundTransform.setIdentity();
groundTransform.setOrigin(pos);
collisionShapes.push_back(groundShape);
//using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects
btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform);
btRigidBody* body = new btRigidBody(0.0, myMotionState,groundShape );
body->setFriction(30);
body->setHitFraction(30);
body->setUserPointer(&bodyType[TERRAINTYPE]);
//add the body to the dynamics world
dynamicsWorld->addRigidBody(body);
}
help!


