2011-03-16 47 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,它真的很快。

希望這有助於:)