2012-02-25 8 views
0

ワールド空間からスクリーン空間に変換しようとしています。しかし、私が使用しているライブラリが行列を扱う方法のために、私はワールド、ビュー、および投影行列の集大成のみを取り出すことができます。私はそれ自体で検査することはできません。ここでの例行列である:ワールド空間の原点をスクリーン空間に変換する方法は?

(1.65879, -0.000909163, -1.4656, -1721.39) 
(1.20199, -1.64605, 1.36146, 3048.55) 
(0.450536, 0.75107, 0.510306, 9264.52) 
(0.444465, 0.740951, 0.50343, 9339.69) 

Iは、スクリーン空間内のオブジェクトの位置を見つけることは原点を変換する単純な問題であろうと仮定した[(0、0、0)の点は、この値によって。しかし、これは明らかに間違っている:

D3DMATRIX matrix; 
D3DXVECTOR4 position; 
D3DXVECTOR4 input; 
D3DVIEWPORT9 viewport; 

GetVertexShaderConstantF(0, (float *)&matrix, 4); 
GetViewport(&viewport); 

input.x = 0.0f; 
input.y = 0.0f; 
input.z = 0.0f; 
input.w = 1.0f; 

D3DXVec4Transform(&position, &input, (D3DXMATRIX *)&matrix); 
float x = ((position.x/position.w) * 0.5f + 0.5f) * viewport.Width + viewport.X; 
float y = (1.0f - ((position.y/position.w) * 0.5f + 0.5f)) * viewport.Height + viewport.Y; 

この方法は、ビューポートが二重そのサイズにされた状態で、(+/-数小数点以下)を、450の結果を返す375。基本的に、ビューポートの死んだ中心を与えます。

私は上記のコードスニペットで間違っていますか?

(私は単にソースを持たないプログラムをデバッグしようとしています。したがって、シェーダが入力を受け取ったとき、これがモデルの位置を傍受できる唯一のポイントです画面スペース)。 DirectXはシェーダのコードと列主要なもの(あるいは他の方法で回避で行優先の行列を使用しているため

答えて

1

GetVertexShaderConstantF(0, (float *)&matrix, 4); 

した後、あなたが

D3DXMatrixTranspose(&matrix, &matrix); 

を呼び出す必要があり、私が「ドン今覚えていない)。

関連する問題