2009-06-26 6 views
2

Ogre3DとPhysXを使用しています。Ogre3dとPhysXで16bitハイトマップを使用する方法

8ビット高さマップから地形を読み込むと、Visual Debuggerで通常のように見えます。最初の画像で

ルック: http://img44.imageshack.us/gal.php?g=44927650.jpg

しかし、私は16ビットイメージとして高さマップを保存するとき、私はあなたが第二の画像に表示されるものを得ます。

ここでのコードは、8ビットPNGで、通常のthatsの作品です:

mSceneMgr->setWorldGeometry("terrain.cfg"); 
    mTSM=static_cast<TerrainSceneManager*>(sceneMgr); 

    TerrainOptions mTerrainOptions = mTSM->getOptions(); 

    //load heihgtmap 
    Image mImage; 
    mImage.load("isl_h_ph.png", ResourceGroupManager::getSingleton().getWorldResourceGroupName()); //load image 

    //write image buffer to pOrigSrc 
    const uchar* pOrigSrc = mImage.getData(); 
    const uchar* pSrc; 
    // image size to mPageSize 
    size_t mPageSize = mTerrainOptions.pageSize; 

    NxActorDesc ActorDesc; 

    //set number of segments 
    heightFieldDesc = new NxHeightFieldDesc; 
    heightFieldDesc->nbColumns  = mPageSize; 
    heightFieldDesc->nbRows   = mPageSize; 
    heightFieldDesc->verticalExtent = -1000; 
    heightFieldDesc->convexEdgeThreshold = 0; 

    heightFieldDesc->samples  = new NxU32[mPageSize*mPageSize]; //constructor for every sample? 
    heightFieldDesc->sampleStride = sizeof(NxU32);     //some sample step = number of samples 

    pSrc = pOrigSrc; 
    char* currentByte = (char*)heightFieldDesc->samples;  //current sample mb? 
    LogManager::getSingletonPtr()->logMessage("+++Heightmap---"); 
    for (NxU32 row = 0; row < mPageSize; row++) 
    { 
     for (NxU32 column = 0; column < mPageSize; column++) //cycle around samples 
     { 
      pSrc = pOrigSrc + column*mPageSize +row; 

      //NxReal s = NxReal(row)/NxReal(mPageSize); 
      //NxReal t = NxReal(column)/NxReal(mPageSize); 

      NxI16 height = (NxI32)(*pSrc++); 
     NxU32 matrixOffset = (row % gMatrixSize) * gMatrixSize + (column % gMatrixSize); 

      //LogManager::getSingletonPtr()->logMessage(Ogre::StringConverter::toString(height)); 
      NxHeightFieldSample* currentSample = (NxHeightFieldSample*)currentByte; 
      currentSample->height = height; 
     currentSample->materialIndex0 = gMatrix[matrixOffset][1]; 
     currentSample->materialIndex1 = gMatrix[matrixOffset][2]; 
     currentSample->tessFlag = gMatrix[matrixOffset][0]; 
      currentByte += heightFieldDesc->sampleStride; 
     } 
    } 

    heightField = mScene->getPhysicsSDK().createHeightField(*heightFieldDesc); 

    NxHeightFieldShapeDesc heightFieldShapeDesc; 
    heightFieldShapeDesc.heightField = heightField; 
    heightFieldShapeDesc.shapeFlags  = NX_SF_FEATURE_INDICES | NX_SF_VISUALIZATION; 
    heightFieldShapeDesc.group = 1; 
    heightFieldShapeDesc.heightScale = 18.8f;//1 в Physx = 255 в огре 
    heightFieldShapeDesc.rowScale  = mTerrainOptions.scale.x; 
    heightFieldShapeDesc.columnScale = mTerrainOptions.scale.z; 
    heightFieldShapeDesc.meshFlags = NX_MESH_SMOOTH_SPHERE_COLLISIONS; 
    heightFieldShapeDesc.materialIndexHighBits = 0; 
    heightFieldShapeDesc.holeMaterial = 2; 
    ActorDesc.shapes.pushBack(&heightFieldShapeDesc); 

は、私が16ビット以上のイメージロード作業を取得するために何を変更する必要がありますか?

PS:あなたはあなたがこれを行うときに正しいオフセット取得していないので、悪い英語のため申し訳ありません

答えて

1

あなたpOrigSrcは、8ビットであるUCHAR、次のとおりです。

pSrc = pOrigSrc + column*mPageSize +row; 

あなたがこの問題を解決することができこのように、最初にループする前に、画像のストライドをつかんで、何か:その後、

int imageStride = mImage.getBPP()/8; 

と掛け、あなたの歩幅でオフセット計算し、このような何か:

pSrc = pOrigSrc + (column*mPageSize +row)*imageStride; 

これは、8ビットと16ビットの両方の高さマップを使用できるようにする必要があります。 PhysXは16ビットの高さマップのみをサポートしているため、それ以上は上手くいくことはできません。

+0

おかげで今では=少し見栄え) が、それでもダメ http://img34.imageshack.us/i/new161.jpg/ –

0

コード内のすべての文字は短くする必要があり、1回ではなく2バイトずつ移動する必要があります.8ビットは1バイト(charまたはucharのサイズ)なので、 16ビットは2バイトで、shortまたはunsigned shortのサイズです。

+0

のみのgetDataリターン場合は、短い取得する方法をUCHAR –

関連する問題