Android の frustumM の動作がおかしいようです。OpenGL レッド ブックを確認すると、生成された行列は次のようになります: (ソース: glprogramming.com )
Songho.ca はこれに同意しているようです: (ソース: songho.ca )
ただし、Android の frustumM では 1 つのコンポーネントが 2 倍され、他のサンプル マトリックスではそうではありません。これが何をしているように見えるかです:
最初の行、3 番目の列を除いて、すべてが機能的に一致しているようです。なぜそれが2倍になるのですか?3 番目の列の最初の 3 つの要素を生成する 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 のコードの間違いですか、それとも単に何か足りないのでしょうか? 錐台が対称である場合、用語が相殺されることを私は知っています。非対称の錐台を使用してコードを実行すると、生成される行列は実際には異なり、同じベクトルにそれらの異なる行列を乗算した場合の結果のベクトルも異なります。