我一直在尝试开发一个3D游戏。我看了this教程,发现我不太了解如何制作游戏。
我目前正在尝试向教程中使用的二十面体(在“查看基本绘图”部分)添加纹理,但我无法在多个面上显示纹理。其他面没有任何逻辑原因完全不可见(它们在我添加纹理之前完美地显示出来)。
以下是我的主要问题:
如何使纹理正确显示,而不使用数百万个顶点和颜色来模拟结果?
如何根据其他函数中可以设置的变量移动对象?
我一直在尝试开发一个3D游戏。我看了this教程,发现我不太了解如何制作游戏。
我目前正在尝试向教程中使用的二十面体(在“查看基本绘图”部分)添加纹理,但我无法在多个面上显示纹理。其他面没有任何逻辑原因完全不可见(它们在我添加纹理之前完美地显示出来)。
以下是我的主要问题:
如何使纹理正确显示,而不使用数百万个顶点和颜色来模拟结果?
如何根据其他函数中可以设置的变量移动对象?
尝试将您的二十面体视为低多边形球体。我想Lamarche的二十面体中心位于0,0,0处。请查看此教程,它是针对DirectX编写的,但解释了球体纹理映射的一般原理:http://www.mvps.org/directx/articles/spheremap.htm。我在我的项目中使用它,效果很好。您可以通过应用各种变换矩阵来移动3D对象。您应该有类似这样的东西。
glPushMatrix();
glTranslatef();
draw icosahedron;
glPopMatrix();
GLfloat *ellipsoidTexCrds;
Vector3D *ellipsoidNorms;
int numVerts = *numEllipsoidVerticesHandle;
ellipsoidTexCrds = calloc(numVerts * 2, sizeof(GLfloat));
ellipsoidNorms = *ellipsoidNormalsHandle;
for(int i = 0, j = 0; i < numVerts * 2; i+=2, j++)
{
ellipsoidTexCrds[i] = asin(ellipsoidNorms[j].x)/M_PI + 0.5;
ellipsoidTexCrds[i+1] = asin(ellipsoidNorms[j].y)/M_PI + 0.5;
}
我大约一年半前写过这篇内容,但我记得我计算了我的顶点法线,使它们等于规范化的顶点。这是可能的,因为当你有一个以(0,0,0)为中心的球形体时,顶点基本上描述了从球体中心发出的射线。将它们标准化,你就得到了顶点法线。
顺便说一句,如果你打算在iPhone上使用3D引擎,使用Ogre3D,它非常快。
希望这可以帮助你 :)