Я пытаюсь загрузить HeightmapTerrainShape в OgreBullet (в основном), используя демонстрационный код, но моя сетка ландшафта смещена по отношению к HeightmapTerrainShape. Я понятия не имею, почему это происходит. Это мой код:
void TerrainLoader::setTerrainPhysics(Ogre::Image *imgPtr)
{
unsigned page_size = terrainGroup->getTerrainSize();
Ogre::Vector3 terrainScale(4096 / (page_size-1), 600, 4096 / (page_size-1));
float *heights = new float[page_size*page_size];
for(unsigned y = 0; y < page_size; ++y)
{
for(unsigned x = 0; x < page_size; ++x)
{
Ogre::ColourValue color = imgPtr->getColourAt(x, y, 0);
heights[x + y * page_size] = color.r;
}
}
OgreBulletCollisions::HeightmapCollisionShape *terrainShape = new OgreBulletCollisions::HeightmapCollisionShape(
page_size,
page_size,
terrainScale,
heights,
true
);
OgreBulletDynamics::RigidBody *terrainBody = new OgreBulletDynamics::RigidBody(
"Terrain",
OgreInit::level->physicsManager->getWorld()
);
imgPtr = NULL;
Ogre::Vector3 terrainShiftPos(terrainScale.x/(page_size-1), 0, terrainScale.z/(page_size-1));
terrainShiftPos.y = terrainScale.y / 2 * terrainScale.y;
Ogre::SceneNode *pTerrainNode = OgreInit::sceneManager->getRootSceneNode()->createChildSceneNode();
terrainBody->setStaticShape(pTerrainNode, terrainShape, 0.0f, 0.8f, terrainShiftPos);
//terrainBody->setPosition(terrainBody->getWorldPosition()-Ogre::Vector3(0.005, 0, 0.005));
OgreInit::level->physicsManager->addBody(terrainBody);
OgreInit::level->physicsManager->addShape(terrainShape);
}
Вот как это выглядит при включенном ящике отладки:
Мой мир размером 4096 * 600 * 4096, и каждый кусок — 64 * 600 * 64
heights[x + y * page_size] = color.r;
Эта линия дает вам отрицательные значения. Если вы комбинируете отрицательные значения высоты местности с ландшафтом огровой пули, вы получаете неправильный ограничивающий диалог.
Вам нужно использовать интервал 0-1 для значений высоты.
Была такая же проблема с фильтром шума Perlin, который дает вам значения от -1 до 1.
Других решений пока нет …