2013-04-11 90 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