8

Android 的 frustumM 的工作方式似乎有些有趣。如果我查看 OpenGL 红皮书,生成的矩阵如下所示:(来源:glprogramming.com Songho.ca 似乎同意这一点:(来源:songho.ca







但是,一个组件使用 Android 的 frustumM 乘以 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);

以“final float A”开头的行似乎错误地乘以 2。

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

4

3 回答 3

4

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

于 2012-08-01T16:31:32.060 回答
1

(((我更愿意发表评论,但我不允许。))

谢谢你们的洞察力。我只需要添加

mMyMatrix[8] /= 2f;

Matrix.frustrumM(mMyMatrix, ...)

解决我的纵横比问题:)

于 2013-06-06T23:10:09.593 回答
1

是的,如果你调用带有 (-ratio, ratio, -1, 1, 1, 10) 参数集的函数,它不会引起问题,但是如果你使用 (right != -1 * left) 调用,它让事情变得不同。

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

于 2013-11-21T04:22:04.997 回答