2013-04-11 93 views
0

我想繪製多個立方體在等角攝像機角度。這是繪製一個的代碼。 (iOS上帶有GLKit的OpenGL ES 2.0)。OpenGL繪製多個等角立方體

float startZ = -4.0f; 

// position 
GLKMatrix4 modelViewMatrix = GLKMatrix4Identity;  
modelViewMatrix = GLKMatrix4Translate(modelViewMatrix, location.x, location.y, location.z + startZ); 

// isometric camera angle 
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, GLKMathDegreesToRadians(45), 1.0, 0, 0); 
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, GLKMathDegreesToRadians(45), 0.0, 1.0, 0); 

self.effect.transform.modelviewMatrix = modelViewMatrix; 

[self.effect prepareToDraw]; 
glDrawArrays(GL_TRIANGLES, 0, 36); 

的問題是,它首先被翻譯,然後旋轉,這意味着與多於一個的箱,它們不排隊(它們看起來像鑽石的鏈。每一個是在適當的位置和旋轉,使角落重疊)。

Cubes

我已經嘗試切換順序,這樣的旋轉平移前,但他們不顯示在所有。我的頂點數組綁定到以原點爲中心的單位立方體。

我真的不明白如何控制與物體分開的相機。我用投影矩陣旋轉了一段時間而沒有得到它。據我瞭解,相機應該用modelViewMatrix進行控制,對吧? (「查看」部分)。

回答

1

您的'相機'變換(模型視圖)似乎是正確的,但它看起來像您使用透視投影 - 如果您想要等距,您將需要更改您的投影矩陣。

看起來您正在將照相機旋轉應用到繪製它的每個對象上。相反,如果你的用例很簡單,模擬2深度矩陣堆棧,所以你只需要你的相機矩陣和每個立方體的矩陣。

  1. 設置您的投影和相機矩陣 - 保留對您的相機矩陣的參考。
  2. 對於每個立方體生成單個立方體變換矩陣(應該可能僅包含平移 - 不旋轉,因此立方體保持軸對齊 - 我認爲這是您要做的)。
  3. 將您的立方體矩陣向後乘以攝像機矩陣,並將其用作模型視圖矩陣。

請注意,相機矩陣對於您渲染的每個立方體都將保持不變,但模型視圖矩陣將立方體的單獨變換矩陣和相機矩陣合併到單個模型視圖矩陣中。這相當於舊的矩陣堆棧方法glPushMatrixglPopMatrix(在GLES 2.0中不可用)。如果您需要更復雜的對象層次結構(其中多維數據集在其「本地」座標空間中具有子對象),那麼您應該實現自己的完整矩陣堆棧,而不是上面討論的2深度等價物。

0

作爲參考,這裏有一篇文章幫助我理解它。這是一個有點猥瑣,但很直觀地解釋事情。

http://db-in.com/blog/2011/04/cameras-on-opengl-es-2-x/

我結束了保持透視投影,因爲我不希望真正的等距。關鍵是要按照正確的順序進行,因爲移動相機與移動物體相反。查看評論和文章。工作代碼:

// the one you want to happen first is multiplied LAST 
// camRotate * camScale * camTranslate * objTranslate * objScale * objRotate; 

// TODO cache the camera matrix 
// the camera angle remains the same for all objects 
GLKMatrix4 camRotate = GLKMatrix4MakeRotation(GLKMathDegreesToRadians(45), 1, 0, 0); 
camRotate = GLKMatrix4Rotate(camRotate, GLKMathDegreesToRadians(45), 0, 1, 0); 
GLKMatrix4 camTranslate = GLKMatrix4MakeTranslation(4, -5, -4.0); 
GLKMatrix4 objTranslate = GLKMatrix4MakeTranslation(location.x, location.y, location.z); 

GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(camRotate, camTranslate); 
modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, objTranslate); 

self.effect.transform.modelviewMatrix = modelViewMatrix; 

[self.effect prepareToDraw]; 
glDrawArrays(GL_TRIANGLES, 0, 36); 
+0

好 - 我很高興你明白了。你不需要重新計算像這樣的每個立方體的相機矩陣。如果您在外面計算相機矩陣,那麼只需對每個立方體執行'cameraMatrix * objTranslate'。 :) – jhabbott 2013-04-12 09:31:43