0

我正在尝试以等距相机角度绘制多个立方体。这是绘制一个的代码。(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控制的,对吧?(“视图”部分)。

4

2 回答 2

1

您的“相机”变换(模型视图)似乎是正确的,但看起来您正在使用透视投影 - 如果您想要等距投影,则需要更改投影矩阵。

看起来您在绘制每个对象时正在将相机旋转应用于每个对象。相反,如果您的用例如此简单,请模拟一个 2 深的矩阵堆栈,因此您只需拥有相机矩阵和每个立方体的矩阵。

  1. 设置您的投影和相机矩阵 - 保留对您的相机矩阵的引用。
  2. 对于每个立方体生成单独的立方体变换矩阵(它可能应该只包含平移 - 没有旋转,所以立方体保持轴对齐 - 我认为这就是你想要的)。
  3. 将您的立方体矩阵乘以相机矩阵并将其用作模型视图矩阵。

请注意,对于您渲染的每个立方体,相机矩阵将保持不变,但模型视图矩阵会将立方体的单独转换矩阵和相机矩阵合并到单个模型视图矩阵中。这相当于旧的矩阵堆栈方法glPushMatrixglPopMatrix(在 GLES 2.0 中不可用)。如果您需要更复杂的对象层次结构(立方体在其“本地”坐标空间中具有子对象),那么您可能应该实现自己的完整矩阵堆栈,而不是上面讨论的 2 深等效项。

于 2013-04-11T23:01:28.743 回答
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);
于 2013-04-11T23:41:04.250 回答