尝试使用带有C ++和OpenGL的heightfeild算法渲染地形时遇到问题

时间:2017-08-24 15:14:34

标签: c++ opengl

我使用高度场地形算法在我正在开发的游戏中构建地形。我正在使用C ++和OpenGL来编写游戏代码。我使用的引擎来自一本名为OpenGL游戏编程的书。

我将引擎加载到一个专用于渲染的函数中,该函数包含大部分OpenGL代码。

要绘制地形,我有一个功能,它将所有坐标包裹在一个地方,我对地形中的所有物体都有一个,包括高度场地形。我的问题是地形以奇怪的角度绘制。我的原始代码使用传递给存储坐标的数组的值的变量,但这会在数组的Y坐标中标记错误,我无法运行代码。 Y坐标由最初声明为unsigned char指针的数组填充,并强制转换为float类型的数组。我已经废除了Y索引中的数组和变量,并用普通值替换它们,这使我能够运行游戏,但是地形呈现出尴尬的角度。我在我的代码中渲染了其他对象,例如建筑物和混凝土地面,我的高度代码与我已经呈现的其他东西非常相似。 我提供了一个代码示例和一个屏幕截图,我希望有人能解决这个问题。

void CTerrain::DrawMountains(float xPos, float yPos, float zPos)
{
    glPushMatrix();
    glTranslatef(xPos, yPos, zPos);

    for (int z = 0; z < MAP_Z; z++)
    {
        for(int x = 0; x < MAP_X; x++)
        {
            terrain[x][z][0] = float(x)*MAP_SCALE;
            terrain[x][z][1] = (float)((z*32+x)*3);//replaced imageData[(z*32+x)*3]; with values imageData declared as a unsigned char pointer
            terrain[x][z][2] = float(z)*MAP_SCALE;
        } 
    }

    for (int z = 0; z < 32-1; z++)
    {
        glBegin(GL_TRIANGLE_STRIP);
        for (int x = 0; x < 32-1; x++) 
        {
            //draw vertex 0

            /*glColor3f(terrain[x][z][1]/255.0f, terrain[x][z][1]/255.0f, terrain[x][z][1]/255.0f);*/
            glTexCoord2f(0.0f, 0.0f);//changed both from 0.0f to 1.0f 
            glVertex3f(terrain[x][z][0], terrain[x][z][1], terrain[x][z][2]);

            //draw vertex 1

            /*glColor3f(terrain[x+1][z][1]/255.0f, terrain[x+1][z][1]/255.0f,  terrain[x+1][z][1]/255.0f);*/
            glTexCoord2f(1.0f, 0.0f);
            glVertex3f(terrain[x+1][z][0], terrain[x+1][z][1], terrain[x+1][z][2]);

            //draw vertex 2

            /*glColor3f(terrain[x][z+1][1]/255.0f, terrain[x][z+1][1]/255.0f, terrain[x][z+1][1]/255.0f);*/
            glTexCoord2f(0.0f, 1.0f);
            glVertex3f(terrain[x][z+1][0], terrain[x][z+1][1], terrain[x][z+1][2]);

            //draw vertex 3

            /*glColor3f(terrain[x+1][z+1][1]/255.0f, terrain[x+1][z+1][1]/255.0f, terrain[x+1][z+1][1]/255.0f);*/
            glTexCoord2f(1.0f, 1.0f);//changed both from 1.0f to 0.0f
            glVertex3f(terrain[x+1][z+1][0], terrain[x+1][z+1][1], terrain[x+1][z+1][2]); 

            glEnd(); //added both glEnd and glPopMatrix
        glPopMatrix();
        }
    }
}

地形渲染的屏幕截图:

screen shot of the terrain rendering


更新

感谢Rabbid76的回答和解释。我知道我已经通过从Y几何中取出变量MAP_Z创建了一个线性方程式,但我这样做是为了使代码工作。我尝试了你的代码,但它又在地形数组的Y坐标中标记了一个错误。我提供了我的原始代码,看看你或任何人是否可以告诉我它为什么一直使用imageData标记地形数组中Y坐标的错误。 MAP_XMAP_ZMAP_SCALE都声明为宏,而imageData声明为无符号字符指针

void CTerrain::DrawMountains(float xPos, float yPos, float zPos)
{
    for (int z = 0; z < MAP_Z; z++)
    {
        for(int x = 0; x < MAP_X; x++)
        {
            terrain[x][z][0] = float(x)*MAP_SCALE;
            terrain[x][z][1] = (float) imageData[(z*MAP_Z+x)*3];
            terrain[x][z][2] = float(z)*MAP_SCALE;
        } 
    }

    glTranslatef(xPos, yPos, zPos);

    for (int z = 0; z < MAP_Z-1; z++)   
    {
        glBegin(GL_TRIANGLE_STRIP);
        for (int x = 0; x < MAP_X-1; x++) 
        {
            //draw vertex 0

            glColor3f(terrain[x][z][1]/255.0f, terrain[x][z][1]/255.0f, terrain[x][z][1]/255.0f);
            glTexCoord2f(0.0f, 0.0f);
            glVertex3f(terrain[x][z][0], terrain[x][z][1], terrain[x][z][2]);

            //draw vertex 1

            glColor3f(terrain[x+1][z][1]/255.0f, terrain[x+1][z][1]/255.0f,  terrain[x+1][z][1]/255.0f);
            glTexCoord2f(1.0f, 0.0f);
            glVertex3f(terrain[x+1][z][0], terrain[x+1][z][1], terrain[x+1][z][2]);

            //draw vertex 2

            glColor3f(terrain[x][z+1][1]/255.0f, terrain[x][z+1][1]/255.0f, terrain[x][z+1][1]/255.0f);
            glTexCoord2f(0.0f, 1.0f);
            glVertex3f(terrain[x][z+1][0], terrain[x][z+1][1], terrain[x][z+1][2]);

            //draw vertex 3

            glColor3f(terrain[x+1][z+1][1]/255.0f, terrain[x+1][z+1][1]/255.0f, terrain[x+1][z+1][1]/255.0f);
            glTexCoord2f(1.0f, 1.0f);
            glVertex3f(terrain[x+1][z+1][0], terrain[x+1][z+1][1], terrain[x+1][z+1][2]);

        }
        glEnd(); 
    }
}

0 个答案:

没有答案