首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取包含Heightmap的.raw文件

读取包含Heightmap的.raw文件
EN

Stack Overflow用户
提问于 2017-07-12 00:30:42
回答 1查看 1.1K关注 0票数 0

我正在使用lib噪音库生成一个随机地形,并将其保存在一个以米为单位测量其海拔点的.raw文件中。这个地形文件包含16位签名的大端值,按顺序排列,从南到北排列.这是我用来读取文件的代码。

代码语言:javascript
复制
struct HeightMapType
    {
        float x, y, z;
        float nx, ny, nz;
        float r, g, b;
    };

bool Terrain::LoadRawFile()
{
    int error, i, j, index;
    FILE* filePtr;
    unsigned long long imageSize, count;
    unsigned short* rawImage;


    // Create the float array to hold the height map data.
    m_heightMap = new HeightMapType[m_terrainWidth * m_terrainHeight];
    if(!m_heightMap)
    {
        return false;
    }

    // Open the 16 bit raw height map file for reading in binary.
    error = fopen_s(&filePtr, m_terrainFilename, "rb");
    if(error != 0)
    {
        return false;
    }

    // Calculate the size of the raw image data.
    imageSize = m_terrainHeight * m_terrainWidth;

    // Allocate memory for the raw image data.
    rawImage = new unsigned short[imageSize];
    if(!rawImage)
    {
        return false;
    }

    // Read in the raw image data.
    count = fread(rawImage, sizeof(unsigned short), imageSize, filePtr);
    if(count != imageSize)
    {
        return false;
    }

    // Close the file.
    error = fclose(filePtr);
    if(error != 0)
    {
        return false;
    }

    // Copy the image data into the height map array.
    for(j=0; j<m_terrainHeight; j++)
    {
        for(i=0; i<m_terrainWidth; i++)
        {
            index = (m_terrainWidth * j) + i;

            // Store the height at this point in the height map array.
            m_heightMap[index].y = (float)rawImage[index];
        }
    }

    // Release the bitmap image data.
    delete [] rawImage;
    rawImage = 0;

    // Release the terrain filename now that it has been read in.
    delete [] m_terrainFilename;
    m_terrainFilename = 0;

    return true;
}

代码不返回任何错误,但这是呈现的结果:rawFileRendering

我用另一个保存在原始文件中的高度图(由rastertek提供)测试了代码,它可以工作。

你知道为什么渲染的场景是这样的吗?谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-12 01:01:52

两个问题:

  1. 您使用unsigned short,但是您在描述中说数字是签名的。所以你应该用signed short代替
  2. 你什么也做不了。如果您在一台小终端机器上,您应该将您的值从大端到小端点转换。

您可以使用以下方法来转换endianness:

代码语言:javascript
复制
short endianConvert(short x) {
    unsigned short v = (unsigned short)x;
    return (short)(v>>8|v<<8);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45046456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档