5

3D ポイントをラスタライズする過程で、単純な透視投影を実行しようとしています。ここにすべてのマトリックスとその他の情報があります。すべての行列は行優先です。座標系は右手です。

カメラは [0,0,-1] にあり、ポイントは [0,0,0] にあります (行列演算では w=1)。

モデル ビュー マトリックス (カム マトリックスの逆、つまり、tx = 0;ty = 0; tz = 1):

[1 0 0 tx]
[0 1 0 ty]
[0 0 1 tz]
[0 0 0 1 ]

パースペクティブ マトリックス:

[f/aspect,0,0,0]
0,f,0,0
0,0,-(near+far)/(near-far),2*far*near/(near-far)
0,0,1,0]

ビューポートは正方形なので、アスペクトは 1 です。遠方 = 100 および近方 = 0.1 f = 1/tan(fovDegress*M_PI/360);

結果のマトリックスは次のとおりです。

1.94445, 0,        0,        0
0,       1.944445, 0,        0
0,       0,        1.020202, -2.020202
0,       0,        1,        0

ここで、モデル ビュー マトリックスを適用し、次に射影マトリックスをポイント ベクトルに適用して、新しいポイント Pv = {x,y,z,w} を取得します。次に、正規化された座標 x' = x/w を取得します。y' = y/w; z' = z/w; x' と y' は、点が錐台にある限り、常に [-1,1] の間にあります。しかし、z' の場合はそうではありません。ポイントがカメラの近くに近づくにつれて、z' 値は指数関数的に増加します。ポイントが [0,0,0] にある場合、z' 値は -1 に等しくなります。

ここで、いくつかの行を切り取る必要があるため、z' 値が [1,-1] の間にある必要があります。私の手順の何が問題なのか疑問に思っています。ありがとうございました。

4

1 に答える 1

3

あなたが経験しているのは、遠近法の深度マッピングの非線形性です。錐台射影行列を使用すると、これは視点からの距離に応じて 1/x の法則に従います。

編集:

マトリックスを再確認してください。錐台マトリックスが間違っています。正しい錐台行列は

f/aspect, 0,                      0,                     0
0,        f,                      0,                     0
0,        0, -(far+near)/(far-near), 2*far*near/(far-near)
0,        0,                      1,                     0

それでも、原点に近づくとゼロ除算になります。ベクトル (0,0,0,1) をそのものに通すだけで、クリップ空間で (x=0,y=0,z=2*far*near/(far-near),w=0) になります。 . そして、等次除算 {x,y,z}/(w=0) ← が爆発します。

于 2011-05-04T14:32:25.617 に答える