2011-03-16 51 views
3

我一直在尝试开发3D游戏很长一段时间。我通过 this 教程,发现我并不知道真正做出游戏。如何将纹理映射到二十面体的两侧?

我目前正在尝试添加一个纹理到他在教程中使用的二十面体(在“看基本绘图”部分),但我无法获得多于一侧的纹理。其他方面是完全不可见的,因为没有合乎逻辑的理由(直到我添加纹理后才完美呈现)。

这里是我的主要问题:

  • 如何使纹理显示不正确使用万个顶点和颜色模仿的结果?

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

+1

我的意见是不。使用别人已经像Unity一样的东西。像纹理立方体一样创建形状很简单,像纹理面和物体这样的东西确实涉及到大量顶点和废物。这就是为什么最好留给职业选手的原因。不要管所有你必须处理的物理作为一个角色走过一个表面的一部分。那个,或者使用类似Cocos2D的东西来制作你的2D游戏。 – 2011-03-16 19:07:27

+0

@StephenFurlani我正在做的事涉及汽车,而不是人。我在代码中制作了大量的汽车,但他们中没有一个具有纹理。 – Justin 2011-03-16 20:24:12

+1

我想用手工制作它们,因为我需要它们都是正确的。在大多数3D建模程序中,我使用它们的形状来创建我想要的东西时遇到问题。现在,请有人告诉我如何为它添加纹理? – Justin 2011-03-17 18:29:28

回答

3

试着把你的二十面体想象成一个低聚球体。我猜拉马尔克的二十面体的中心位置是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,它真的很快。

希望这有助于:)