そのため、すべてがどのように機能するかをよりよく理解するために、独自のカスタム 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 に戻りますが、これもまた理にかなっています。
もう一度小説をお詫びしますが、誰かが私が間違っていることを理解するのを手伝ってくれることを願っています.
ありがとう!