我一直在尝试开发3D游戏。我经历了 this 教程,发现我不太了解实际制作游戏。
我目前正在尝试将纹理添加到他在教程中使用的二十面体(在“查看基本绘图”部分中),但我无法在多个方面获得纹理。其他方面完全不可见,没有合理的理由(它们在我添加纹理之前完全显示出来)。
以下是我的主要问题:
如何在不使用百万个顶点和颜色来模拟结果的情况下正确显示纹理?
如何根据我可以在其他功能中设置的变量移动对象?
答案 0 :(得分:3)
尝试将您的二十面体视为低多边形球体。我想Lamarche的二十面体的中心位于0,0,0。看看本教程,它是为directX编写的,但它解释了球体纹理映射http://www.mvps.org/directx/articles/spheremap.htm的一般原理。我在我的项目中使用它并且效果很好。您可以通过应用各种变换矩阵来移动3D对象。你应该有这样的东西
glPushMatrix();
glTranslatef();
draw icosahedron;
glPopMatrix();
根据上面提到的教程,以下是我为半球形状编写texCoords的代码片段
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,它真的很快。
希望这有助于:)