为什么Android的frustumM生成的矩阵与红皮书不同?

时间:2012-07-28 02:23:13

标签: android opengl-es

Android的截头模式的工作方式似乎很有趣。如果我查看OpenGL红皮书,生成的矩阵如下所示:
http://www.glprogramming.com/red/images/Image23.gif
Songho.ca似乎同意这一点:
http://www.songho.ca/opengl/files/gl_projectionmatrix_eq16.png

然而,一个组件乘以Android的frustumM乘以2,而不是在其他示例矩阵中。这是它似乎正在做的事情:

一切似乎在功能上匹配,除了第一行,第三列。为什么要乘以2?这是android.opengl.Matrix的frustumM方法的代码行,它生成第三列的前三个元素:

final float A = 2.0f * ((right + left) * r_width);
final float B = (top + bottom) * r_height;
final float C = (far + near) * r_depth;

使用r_width,r_height,r_depth定义为:

final float r_width  = 1.0f / (right - left);
final float r_height = 1.0f / (top - bottom);
final float r_depth  = 1.0f / (near - far);

以“最终浮动A”开头的行似乎错误地乘以2.

这是Android代码中的错误,还是我错过了什么?我知道如果平截头体是对称的,那么该术语就会取消。当运行具有不对称平截头体的代码时,生成的矩阵实际上是不同的,当相同的向量与那些不同的矩阵相乘时,生成的向量也是不同的。

3 个答案:

答案 0 :(得分:3)

这是Android的一个错误。请参阅http://code.google.com/p/android/issues/detail?id=35646

答案 1 :(得分:1)

((我只是发表评论,但我不允许。)

谢谢你们的见解。我只需要添加

mMyMatrix[8] /= 2f;

Matrix.frustrumM(mMyMatrix, ...)

解决我的宽高比问题:)

答案 2 :(得分:1)

是的,如果你用( - 比率,比率,-1,1,1,10)参数设置调用函数,它不会导致问题,但如果你调用(右!= -1 *左) ),它使事情变得不同。

当我检查源代码时,我发现了这个问题。叹息。