6

そのため、すべてがどのように機能するかをよりよく理解するために、独自のカスタム 3D 変換パイプラインを作成しています。すべてを画面に適切にレンダリングすることができたので、戻ってクリッピングを確認しようとしています。

私の理解では、パースペクティブ分割後の x または y 値が [-1, 1] の境界外にあり、私の場合は z 値が [0, 1] の境界外にある場合、頂点をクリッピングする必要があります。 .

ただし、それを実装すると、z 値は常に -1.xxxxxxxxxxx になり、xxxxxxx は非常に小さい数値になります。

少し長くなってしまい、申し訳ありませんが、できる限りの情報を提供したかったのです。

最初の規則:

マトリックスが次のように見える左利きのシステムを使用しています。

[m00, m01, m02, m03]
[m10, m11, m12, m13]
[m20, m21, m22, m23]
[m30, m31, m32, m33]

そして、私のベクトルは次のような列です:

[x]
[y]
[z]
[w]

私のカメラは次のように設定されています。

PI/4 のラジアン単位の垂直 FOV。

アスペクト比 1。 (スクエア ビュー ポート)

ニア クリップ値 1。

1000 のファー クリップ値。

0 の初期ワールド x 位置。

0 の初期ワールド y 位置。

-500 の初期ワールド Z 位置。

カメラは位置 Z 軸 (0, 0, 1) を見下ろしています

頂点を指定すると、パイプラインは次のように機能します。

ステップ 1:頂点にカメラ行列を掛けます。

ステップ 2:頂点に射影行列を掛けます。

射影行列は次のとおりです。

[2.41421, 0,       0,         0]
[0        2.41421, 0,         0]
[0,       0,       1.001001,  1]
[0,       0,       -1.001001, 0]

ステップ 3: x、y、および z コンポーネントに 1/w を掛けます。

ステップ 4: [ここが問題] 境界外の場合は頂点をクリップします。

ステップ 5:画面座標に変換します。

私が持っている頂点の例は

(-100, -100, 0, 1)

カメラ行列を掛けた後、次のようになります。

(-100, -100, 500, 1)

カメラに対して、その頂点は左と下に 100 単位、500 単位先にあるため、これは理にかなっています。また、1 のニア クリップと 1000 のファー クリップの間にあります。W は 1 のままです。

射影行列を掛けた後、次のようになります。

(-241.42135, -241.42135, 601.600600, -600.600600)

これは意味があるかどうかわかりません。x と y は正しいようですが、透視分割の次のステップが奇妙であるため、z と w については確信が持てません。

パースペクティブ分割の後、次のようになります。

(0.401966, 0.401966, -1.001665, 1)

ここでも x と y は意味があり、どちらも [-1, 1] の範囲内にあります。しかし、z 値は、まだ錐台内にあるはずですが、明らかに範囲外です。W は 1 に戻りますが、これもまた理にかなっています。

もう一度小説をお詫びしますが、誰かが私が間違っていることを理解するのを手伝ってくれることを願っています.

ありがとう!

4

2 に答える 2

3

わかりました、問題が何であるかを理解したようです。

私の射影行列は次のとおりです。

[2.41421, 0,       0,         0]
[0        2.41421, 0,         0]
[0,       0,       1.001001,  1]
[0,       0,       -1.001001, 0]

しかし、実際には転置して次のようにする必要があります。

[2.41421, 0,       0,         0]
[0        2.41421, 0,         0]
[0,       0,       1.001001,  -1.001001]
[0,       0,       1,         0]

このマトリックスを使用すると、x 値と y 値は期待どおりに維持され、z 値は [0, 1] 内に制限され、ファー クリップ プレーンの近くにある場合にのみその範囲を超えます。

唯一の問題は、右利き用のシステムを使用しているのか、左利き用のシステムを使用しているのかについて、かなり混乱していることです。

私が知っているのは、今ではそれが機能するということだけです...

于 2010-07-16T14:57:08.963 に答える
2

私はここで大袈裟かもしれませんが、射影マトリックスと遠近分割の目的は、画面上のその点の 2D 位置を発見することだと考えました。その場合、数学はこれら 2 つの x 値と y 値を見つけることを目的としているため、残りの z 値は必ずしも意味を持ちません。

更新:私はそれを理解したと思います。あなたの計算はすべて正しいです。あなたが説明するカメラと錐台には、Z = 1に近いクリッピング平面があるため、(-100, 100, 0) の例の点は実際にはクリッピング平面の外側にあるため、-1 のすぐ下の z-buffer 値が完璧になります検出。

錐台内の z 座標 (z 座標 2 など) を持つサンプル ポイントを試してください。

于 2010-07-15T13:31:26.350 に答える