鉴于此设置:
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提交了一个错误,询问这是否是预期的行为。
答案 0 :(得分:0)
为了记录,Apple确定我在这个问题上的错误报告是错误15419952的重复。我希望人们不会遇到这么多,因为他们通常可能会将投影矩阵与模型转换堆栈分开。无论如何,问题中提出的解决方法都可以正常工作。