1

私は現在、シーンからオブジェクトをカリングするために使用できる錐台を備えた Camera クラスを実装しようとしています。錐台の境界を見つけるために、システム座標空間 (各辺が [-1..1] の範囲の立方体) をPVM 行列の逆数で変換しています。これは問題なく動作しているようですが...

テスト目的で原点 (0, 0, 0, 1) を逆 PVM 行列で変換すると、(0, 0, 0, 0 ) が得られます。デバッグ中に PVM 行列の特定の値が与えられた理由を正確に知っていますが、私が知る限り、ユークリッド ポイントは (0, 0, 0) 、0 の aw から生じる NaN の束ではありません。ここで何を忘れていますか? wで割ってはいけないのでしょうか? 私の行列は間違っていますか?ぶらぶら...

詳細:

射影行列は、次の方法で定義されます (Java で LWJGL を使用)。

/** fieldOfView is in radians, aspectRatio is simply width / height. */
public static Matrix4f makeProjectionMatrix(Matrix4f dest, float fieldOfView, float aspectRatio, float nearPlane, float farPlane)
{
    float y_scale = GLUtils.cotan(fieldOfView * .5f);
    float x_scale = y_scale / aspectRatio;
    float frustumLength = farPlane - nearPlane;

    dest.setIdentity();
    dest.m00 = x_scale;
    dest.m11 = y_scale;
    dest.m22 = -(farPlane + nearPlane) / frustumLength;
    dest.m23 = -1f;
    dest.m32 = -2f * nearPlane * farPlane / frustumLength;
    dest.m33 = 0f;

    return dest;
}

* http://unspecified.wordpress.com/2012/06/21/calculating-the-gluperspective-matrix-and-other-opengl-matrix-maths/に基づく

m33 は常に 0 であることに注意してください。これは、たまたま逆行列にも当てはまります (上記の式が与えられたすべての逆行列に当てはまると思います)。

モデルとビューはどちらも単位行列であり、射影は上記から変更されていないため、逆PVM 行列によって変換された座標 (0, 0, 0, x)は常に 0 の w を生成します...そうですか?

ジレンマを引き起こす行列の例:

元の投影:

1.732 0     0  0
0     1.732 0  0
0     0     0 -2
0     0    -1  0

逆投影:

.577 0    0   0
0    .577 0   0
0    0    0  -1
0    0   -.5  0

計算ミスが明らかな場合は、追加のコードを投稿していただければ幸いです。

4

1 に答える 1

1

コメントに加えて:

az of 0 は aw of 0 を生成します。これは、射影行列がそうするように指示しているためです;) 射影空間では、az of 0 は射影の原点にあると言われています。見えるようにするには、投影の前にある必要があります。それ以外の場合、投影の中心と頂点位置の両方がまったく同じ場所を占めます。これが、w が 0 (またはそれに近い) のジオメトリが描画されるのを防ぐために、ニアプレーンを使用する理由です。

于 2013-02-14T09:15:24.557 に答える