我试着在一个等轴测的相机角度画多个立方体。下面是绘制一个的代码。(在iOS上使用GLKit的OpenGL ES 2.0 )。
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);
问题是它首先平移,然后旋转,这意味着如果有多个盒子,它们不会对齐(它们看起来像一串菱形链条。每个角都在适当的位置并旋转,以便角重叠)。
我试着改变顺序,使旋转在平移之前,但它们根本不显示。我的顶点数组被绑定到一个以原点为中心的单位立方体。
我真的不明白如何控制相机和物体分开。我在投影矩阵上折腾了一段时间,但没有得到它。据我所知,摄像头应该是用modelViewMatrix控制的,对吧?( "View“部分)。
发布于 2013-04-12 07:01:29
你的‘相机’变换(模型视图)看起来是正确的,但是看起来你使用的是透视投影--如果你想等轴测,你需要改变你的投影矩阵。
它看起来像是在绘制对象时将摄影机旋转应用于每个对象。相反,如果你的用例如此简单,那么模拟一个2深的矩阵堆栈,这样你就只有你的相机矩阵和每个立方体的矩阵。
请注意,渲染的每个立方体的相机矩阵将保持不变,但模型视图矩阵将立方体的各个变换矩阵和相机矩阵合并到单个模型视图矩阵中。这相当于旧的矩阵堆栈方法glPushMatrix
和glPopMatrix
(在GLES 2.0中不可用)。如果你需要更复杂的对象层次结构(其中立方体在它们的“局部”坐标空间中有子对象),那么你可能应该实现你自己的完整矩阵堆栈,而不是上面讨论的2层深度的等效堆栈。
发布于 2013-04-12 07:41:04
作为参考,这里有一篇文章帮助我理解它。它有点数学,但很好地直观地解释了事情。
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);
https://stackoverflow.com/questions/15958540
复制相似问题