0

正射投影を使用しており、スクリーン スペースから点を投影解除しようとしています。

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

var w2 = ScreenWidthInPixels/2;
var h2 = ScreenHeightInPixels/2;

view  = Matrix.LookAtLH(new Vector3(0, 0, -1), new Vector3(0, 0, 0), 
                        Vector3.UnitY);
proj  = Matrix.OrthoOffCenterLH(-w2, w2, -h2, h2, 0.1f, 10f);

Point を非投影にする方法pは次のとおりです。ポイントは画面ピクセルで指定されます。

var m = Vector3.Unproject(p, 0, 0, ScreenWidthInPixels, ScreenHeightInPixels, 
                  0.1f, 10f, // znear and zfar
                  view *proj);

コードが機能しません。マトリックスmには のみが含まれていNanます。反転しようとするview * projと、ゼロのみのマトリックスが返されます。

したがって、私の問題は正投影行列と関係があると思われます。

ここに私の質問があります:

  • この問題は、OrthoOffCenterLH プロジェクションの値が大きいためにアンダーフローが発生した可能性がありますか?
  • x,y,width,heightで渡す必要があるパラメーターは何Unproject(...)ですか?
  • minZパラメータとmaxZパラメータにはどのような意味がありますUnproject(...)か?
  • で何を渡すかは重要p.ZですUnproject(...)か?
4

1 に答える 1

3

残念ながら、SharpDXのドキュメントは現在オンラインではありません。したがって、私の説明は、コードを見つけた古いバージョンに基づいている可能性があります。

OrthoOffCenterLHプロジェクションの値が大きいため、アンダーフローが原因で問題が発生する可能性がありますか?

どのような大きな値ですか?画面の幅と高さは2000未満だと思います。それは間違いなく大きくありません。これについては心配しないでください。

Unproject(...)のx、y、width、heightに渡す必要のあるパラメーターは何ですか?

これらはビューポートの寸法です。ビューと投影行列がベクトルをクリップ空間に変換するため、これが必要です。これは通常、xとyの場合は[-1、1]、zの場合は[0、1]です。最初に、位置を画面スペースからクリップスペースに変換する必要があります。それがそれらの値の目的です。

Unproject(...)のminZおよびmaxZパラメーターにはどのような意味がありますか?

これは、入力ベクトルのzコンポーネントをエンコードする方法です。また、座標を画面スペースに正規化するためにも使用されます。一般に、0と1のままにしておくことができます。

Unproject(...)でpZに何を渡すかは重要ですか?

はい、もちろん。このパラメータは、ビュー錐台/立方体の深さを指定します。を渡すとminZ、前面のポイントの投影されていない座標が取得されます。パスするとmaxZ、裏面の位置になります。間にあるすべての値は、間にある座標になります。これは、2Dポイントが3Dポイントの光線全体にマッピングされるためです。

結論として、このUnproject方法は正射影行列で機能するはずです。あなたの場合、結果view*projはスケーリングと平行移動の単純な組み合わせであり、完全に反転可能である必要があります。結果の逆数にゼロのみが含まれていることを確認しますか?その場合は、元の行列を質問に追加してください。多分何か他のことが起こっています。

于 2012-12-19T20:54:52.297 に答える