在GLKMatrixStack上使用投影矩阵

时间:2014-01-20 01:09:51

标签: ios matrix opengl-es glkit

鉴于此设置:

GLKMatrixStackRef transformHierarchy = GLKMatrixStackCreate (kCFAllocatorDefault);

float aspect = (float)self.drawableWidth / (float)self.drawableHeight;
float fov = PI * 0.125;
float height = 10.0f;
float cameraOffset = -height / (2.0f * tanf (fov / 2.0f));

GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective (fov, aspect, 0.01f, 1000.0f);
GLKMatrix4 T = GLKMatrix4MakeTranslation (0.0f, 0.0f, cameraOffset);

我希望这两个选项在堆栈顶部创建一个相同的矩阵。选项A:

GLKMatrixStackLoadMatrix4 (transformHierarchy, projectionMatrix);
GLKMatrixStackTranslate (transformHierarchy, 0.0f, 0.0f, cameraOffset);

选项B:

GLKMatrixStackLoadMatrix4 (transformHierarchy, GLKMatrix4Multiply (projectionMatrix, T));

选项A给我一个黑屏:

3.351560 0.000000 0.000000 0.000000
0.000000 5.027339 0.000000 0.000000
0.000000 0.000000 -1.000020 25.117201 
0.000000 0.000000 -1.000000 0.000000

选项B(否则相同的矩阵但非零m44)给出了我期望的视觉效果:

3.351560 0.000000 0.000000 0.000000
0.000000 5.027339 0.000000 0.000000
0.000000 0.000000 -1.000020 25.117201
0.000000 0.000000 -1.000000 25.136698

所以我找到了黑屏的解决方案,但使用GLKMatrixStackTranslate()的结果让我感到惊讶。我在这里错过了什么吗?将投影+世界矩阵放在堆栈的底部(后面跟着模型转换)不被认为是一种好的做法吗?

更新

修正了我的cameraOffset数学中的错误和更新的矩阵输出以匹配,尽管它对所描述的问题没有影响。同样为了清楚起见,我将矩阵值(从xcode复制/粘贴,以行主要顺序显示)转换为column-major(如OpenGL解释它们)。

还向Apple提交了一个错误,询问这是否是预期的行为。

1 个答案:

答案 0 :(得分:0)

为了记录,Apple确定我在这个问题上的错误报告是错误15419952的重复。我希望人们不会遇到这么多,因为他们通常可能会将投影矩阵与模型转换堆栈分开。无论如何,问题中提出的解决方法都可以正常工作。