0

(ほとんど) デモ コードを使用して、OgreBullet に HeightmapTerrainShape をロードしようとしていますが、地形メッシュが 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 です

4

1 に答える 1

1
heights[x + y * page_size] = color.r;

この行は負の値を示します。負の地形の高さの値をオーガの弾丸地形と組み合わせると、間違ったバウンディング ボックスの会話が発生します。

高さの値には intervall 0-1 を使用する必要があります。

-1 から 1 までの値を与えるパーリン ノイズ フィルターで同じ問題が発生しました。

于 2012-12-14T17:25:40.867 に答える