1

LWJGL で作業して、独自のマトリックスを使用して単純なクワッドを表示しようとしています。私はしばらく探し回っていて、いくつかのパースペクティブ マトリックスの実装を見つけました。特に次の 2 つです。

[cot(fov/2)/a 0          0                  0]
[0            cot(fov/2) 0                  0]
[0            0          -f/(f-n)          -1]
[0            0          -f*n/(f-n)         0]

と:

[cot(fov/2)/a 0          0                      0]
[0            cot(fov/2) 0                      0]
[0            0          -(f+n)/(f-n)          -1]
[0            0          -(2*f*n)/(f-n)         0]

予想どおり、これらは両方とも同じ効果を提供します(ここここから取得しました、 それぞれ)。問題は、これにモデルビュー行列、次に頂点を掛けてから、x、y、z の各値をその w の値で割ると画面座標が得られることを理解していることです。より具体的には、これらのいずれかにモデルビュー マトリックスを掛けてから頂点 (10, 10, 0, 1) を掛けると、aw=0 になります。それ自体が大きな打撃です。行列が間違っているか、何かが完全に欠落していると結論付けます。私の実際のテスト プログラムでは、カメラの位置が (0,0,0) にあり、回転がない場合でも、頂点が画面に表示されません。正と負の多くの異なる z 値を試して、それが単なるクリッピング プレーンであるかどうかを確認しました。ここで何か不足していますか?

編集: 何度もチェックした後、直面している問題を絞り込みました。最大の問題は、z 軸が指定した範囲 (n から f) に再マッピングされていないように見えることです。オブジェクトを z 軸に沿って移動すると、オブジェクトが少しズームインまたはズームアウトし、範囲 [-1, 1] を超えると存在しなくなります。これも私をより混乱させていると思います。ファー プレーンを 100 に設定し、ニア プレーンを 0.1 に設定すると、それ以外のように動作します。

4

1 に答える 1

1

予想通り、これらはどちらも同じ効果をもたらします

2 番目の射影行列の形式は非常に標準的ですが、最初の形式は異なる効果をもたらします。z==1とがある場合w==0、射影は次のようになります。

マトリックス 1:-f/(f-n) / -f*n/(f-n) = f / f*n = 1 / n

マトリックス 2:-(f+n)/(f-n) / -(2*f*n)/(f-n) = (f+n) / (2*f2n)

結果は明らかに違います。常に 2 番目の形式を使用する必要があります。

これらのいずれかにモデルビュー マトリックスを掛けてから頂点 (10, 10, 0, 1) を掛けると、aw=0 になります。それ自体が大きな打撃です

焦点距離dの場合、投影は次のように計算されます (アスペクト比は無視されます)。

x'= d*x/z = x / w
y'= d*y/z = y / w

どこ

w = z / d

これがあればz==0、すでに目の中にあるポイントを投影したいということであり、その先のポイントのみdが表示されます。実際には、このポイントは(near) と(far)zの範囲内にないため、クリップされます (は正の定数として期待されます)。nfn

于 2013-09-08T02:22:46.477 に答える