如何将纹理映射到二十面体的侧面?

3

我一直在尝试开发一个3D游戏。我看了this教程,发现我不太了解如何制作游戏。

我目前正在尝试向教程中使用的二十面体(在“查看基本绘图”部分)添加纹理,但我无法在多个面上显示纹理。其他面没有任何逻辑原因完全不可见(它们在我添加纹理之前完美地显示出来)。

以下是我的主要问题:

  • 如何使纹理正确显示,而不使用数百万个顶点和颜色来模拟结果?

  • 如何根据其他函数中可以设置的变量移动对象?


1
我的建议是不要自己做。使用像Unity这样的已经有人做好的东西。创建如纹理立方体等形状很简单,但是获取纹理面和物体之类的东西确实涉及大量顶点和一些麻烦事。这就是为什么最好留给专业人员来处理。更不用说在让角色穿过表面走路时必须处理的所有物理问题了。或者使用像Cocos2D这样的东西制作你的2D游戏。 - Stephen Furlani
@StephenFurlani 我所做的涉及汽车,而不是人。我已经在代码中制作了很多汽车,但它们中没有一个有纹理。 - Justin
1
我想手工制作它们,因为我需要它们都完美无缺。在大多数3D建模程序中,我使用它们的形状来创建我想要的东西时会遇到问题。现在,请有人告诉我如何添加纹理? - Justin
1个回答

3

尝试将您的二十面体视为低多边形球体。我想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,它非常快。

希望这可以帮助你 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接