简体   繁体   English

如何在Ogre3d和PhysX中使用16位高度图

[英]How to use 16bit heightmaps with Ogre3d and PhysX

I'm using Ogre3D and PhysX. 我正在使用Ogre3D和PhysX。

When I load a terrain from an 8bit height map, it looks normal on Visual Debugger. 当我从8位高度图加载地形时,在Visual Debugger上看起来很正常。

Look at first image: http://img44.imageshack.us/gal.php?g=44927650.jpg 看第一张图片: http : //img44.imageshack.us/gal.php?g=44927650.jpg

But when I save the height map as a 16bit image, I get what you see on second image. 但是,当我将高度图另存为16位图像时,我得到了第二幅图像上看到的图像。

Here's the code, thats works normal with 8bit PNG: 这是代码,多数民众赞成在8位PNG正常工作:

    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);

What should I change to get 16bit or higher image loaded working? 我应该更改什么才能使16位或更高的图像加载正常工作?

PS: Sorry for bad English PS:对不起,英语不好

Your pOrigSrc is a uchar, which is 8 bits, so you're not getting the correct offset when you do this: 您的pOrigSrc是一个8位的uchar,因此在执行此操作时您没有得到正确的偏移量:

pSrc = pOrigSrc + column*mPageSize +row;

You can fix this by first grabbing the stride of your image before your loops, something like this: 您可以通过以下方法解决此问题:在循环之前先抓住图像的步幅,如下所示:

int imageStride = mImage.getBPP() / 8;

and then multiply your calculated offset by the stride, something like this: 然后将计算出的偏移量乘以步幅,如下所示:

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

That should allow you to use both 8-bit and 16-bit height maps. 那应该允许您同时使用8位和16位高度图。 PhysX only supports 16-bit height maps, so you can't go higher than that. PhysX仅支持16位高度图,因此不能超过此高度。

现在,您代码中的所有字符都必须为short,并且您需要一次遍历文件2个字节,而不是1个字节。因为8位是1个字节(char或uchar的大小),而16位是2个字节字节,一个short或无符号short的大小。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM