【问题标题】:Why does the matrix generated by Android's frustumM differ from the Redbook's?为什么Android的frustumM生成的矩阵和红皮书的不一样?
【发布时间】:2019-08-23 01:16:55
【问题描述】:

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

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      mMyMatrix[8] /= 2f;
      

      之后

      Matrix.frustrumM(mMyMatrix, ...)

      解决我的长宽比问题:)

      【讨论】:

        【解决方案3】:

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

        我在查看源代码时发现了这个问题。叹息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-25
          • 1970-01-01
          • 2013-11-26
          • 1970-01-01
          相关资源
          最近更新 更多