私はXNA 4.0を使用しており、Vector3を使って、その座標を画面上に表すVector2に変換しようとしています。 あなたはViewport.Projectを使うことができますが、これは私に完璧な結果をもたらしますが、私はこれを行うための独自の方法を作る必要があります。 GPUの代わりに、すべての頂点をフレームごととCPU上で2D座標に変換する必要があります。 提供されているプロジェクトメソッドを使用すると、私が望むものより少し遅くなります。 "z"値も返しますが、私は使用しません。私はただ(x、y)を可能な限り単純な方法で返すだけです。3Dベクトルから2Dへの投影スクリーン座標
これまで私がこれまでに思いついたことは、ほぼ正しい結果を得ています。しかしなく、かなりそこはまだ
private Vector2 ScreenCoords(Vector3 v)
{
return new Vector2(
viewProj.M11 * v.X + viewProj.M21 * v.Y + viewProj.M31 * v.Z + viewProj.M41,
viewProj.M12 * v.X + viewProj.M22 * v.Y + viewProj.M32 * v.Z + viewProj.M42);
}
viewProjだけで(にviewMatrix * ProjectionMatrix)である
画面中央部の頂点は常に(0、0)として戻ってきているようだが、私は少しの結果をめちゃくちゃ取得頂点が画面座標を変えるとき(私がカメラを動かすとき) 頂点が左に動くと、私の投影結果のXが小さくなり、頂点が下に移動すると、私の投影結果のYが増えます。 少なくとも私はその権利を持っていますが、彼らが変わる率は正確でも一貫していません。
編集:ここでそれを行うための最速の方法は、([1、-1]この範囲で座標を返すことに注意してください)、おそらく、どのように行うのです
private Vector2 ScreenCoords(Vector3 v)
{
float
w = viewProj.M14 * v.X + viewProj.M24 * v.Y + viewProj.M34 * v.Z + viewProj.M44;
return new Vector2(
(viewProj.M11 * v.X + viewProj.M21 * v.Y + viewProj.M31 * v.Z + viewProj.M41)/w,
(viewProj.M12 * v.X + viewProj.M22 * v.Y + viewProj.M32 * v.Z + viewProj.M42)/w);
}
ここでは、ビューポートを使用する比較でありますだから私は、フレームごとに、突出をたくさんやっている他の誰のためにこのようなものをお勧めします152
- のいずれか1なし143
FPS - プロジェクトと
FPS - - 81
ScreenCoordsとFPS .Projectは、2D座標を取得します。あなたはその透視投影がhomogeneus座標を必要と認識すべき
これは私に感謝した必要がありました! 私は変換やプロジェクトのようなものを使わないで、自分の数学を使って答えを得ようとしています。 誰かが望むように新しいメソッドを上にポストする。 – Frobot
後ろの数学が分かっているのは良いことですが、この変換はシェーダの中でより効率的に使用されていると思います。 – Blau
はい、また変換は、私が必要としないのでカットした部分であるzバッファのピクセルの値を取得します。 うまくいけば、シェイダーの中で私のアルゴリズム全体を実装することができ、CPUの2D画面座標を見つける必要がなくなり、ずっと速くなる – Frobot