2012-01-08 14 views
-1

私は正射投影を使用しています。ワールド座標を使用してテクスチャを世界に描画できます。 HUDオブジェクトの場合は、最初はうまく動作しますが、カメラを持って移動すると、すべてのHUDテクスチャが世界に沿って移動するので、カメラの視野から遅かれ早かれ出て行きます。スクリーン/クライアント座標にテクスチャを直接描画

HUDを描画するには、クライアント座標(左上または中央を(0,0)として描画)を使用して描画する必要があります。どのようにそれを行う上の任意のアイデアですか?私はこれにはかなり新しいので、私はより詳細なヘルプに感謝します。

ありがとうございます!

答えて

2

IDビューと投影行列を設定すると、すべての座標が単に画面に通過します。ポストプロジェクションおよびw分割-1、-1は左下、1,1は右上を表し、0,0が中心です。

ここで、スクリーン座標を渡すには、0,1、z、1024,768、zとなるようにワールドマトリックスを設定する必要があります)は1、-1、z、1と出てきます(zは特定の深さを与えるために使用され、HUD要素を重ね合わせるために使用できます)。線形代数の良い理解はここで多くの助けになります。あなたはそれを書くとしたら

基本的に、あなたはあなたの行列を覚えていれば、あなたがこのような何かを得るので、次の

xout = (x/(width * 0.5f)) - 1.0f; 
yout = -((y/(height * 0.5f)) - 1.0f); 
zout = z; 
wout = 1.0f; 

にしてください。

m00, m01, m02, m03, 
m10, m11, m12, m13, 
m20, m21, m22, m23, 
m30, m31, m32, m33, 

マトリクス拡張は、以下のように、X座標の入力は、常に最初の列によって変換されるようなものである:覚えて

xout = m00 * x + m10 * y + m20 * z + m30 * w; 

まず最初は、三重のdirectX(X、Yに渡される座標点であります、z)は4倍(x、y、z、1)に拡張されます。

このようにして、m10とm20が0の場合、効果的にxにある値を掛けて、その後に値がm30に追加されることを簡単に確認できます。

xoutを計算する方法の元の説明に戻ると、m00を「1.0f /(width * 0.5f)」に設定し、m30を-1.0fに設定すると、 。したがって、仮定:

xscale = 1.0f/(width * 0.5f); 
yscale = -1.0f/(height * 0.5f); 
zscale = 1.0f; 
xtrans = -1.0f; 
ytrans = 1.0f; 
ztrans = 0.0f; 

を次のように続いて、我々は世界の行列を定義することができます。今

xscale,  0,  0,  0 
    0, yscale,  0,  0 
    0,  0, zscale,  0 
xtrans, ytrans, ztrans,  1 

あなたの世界行列として行列セット(アイデンティティへのビューと投影を設定することを忘れないでください)と入力することができますあなたの画面座標を使用した座標。

+0

ありがとうございます!私はビューをアイデンティティに設定すると効果的です。投影がアイデンティティであったときにうまく動作しませんでした。ちょうど私が(0、0)のように中心を持つようになったので、原点を何とか左上に移動することも可能ですか? – CyberMew

+0

@Cyber​​Mew:私のポストの残りの部分では、これがうまくいくような世界の行列を選択する方法が説明されています。また、投影行列をアイデンティティに設定していない場合は、投影行列が結果として生じる画像を歪曲させるため、問題が発生します。 – Goz

関連する問題