我使用高度场地形算法在我正在开发的游戏中构建地形。我正在使用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();
}
}
}
地形渲染的屏幕截图:
感谢Rabbid76的回答和解释。我知道我已经通过从Y几何中取出变量MAP_Z
创建了一个线性方程式,但我这样做是为了使代码工作。我尝试了你的代码,但它又在地形数组的Y坐标中标记了一个错误。我提供了我的原始代码,看看你或任何人是否可以告诉我它为什么一直使用imageData标记地形数组中Y坐标的错误。 MAP_X
,MAP_Z
和MAP_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();
}
}