【问题标题】:OpenGL draw multiple isometric cubesOpenGL绘制多个等距立方体
【发布时间】:2013-04-12 14:23:08
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c opengl-es opengl-es-2.0 glkit


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      作为参考,这里有一篇帮助我理解它的文章。这有点数学,但可以很好地直观地解释事物。

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

      我最终保留了透视投影,因为我不想要真正的等距投影。关键是要以正确的顺序进行,因为移动相机是移动物体的逆过程。请参阅 cmets 和文章。工作代码:

      // 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);
      

      【讨论】:

      • 好 - 我很高兴你能明白。您不需要像这样为每个立方体重新计算相机矩阵。如果您在外面计算相机矩阵,那么只需对每个立方体执行cameraMatrix * objTranslate。 :)
      猜你喜欢
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多