2012-02-25 118 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) 

我曾假定在屏幕空间中找到的对象的位置将是变换原点的一个简单的事情[在点(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的结果(+/-几小数),与视口是两倍大小;基本上,它给出了视口的死角。

我在做什么错误在上面的代码片段? (我注意到,我只是试图调试一个我没有源代码的程序,因此,当着色器接收到它的输入时,这是我可以截取模型位置的唯一一个点屏幕空间)。

回答

1

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

你必须调用

D3DXMatrixTranspose(&matrix, &matrix); 

因为的DirectX在着色器代码和列主要的使用行为主的矩阵(或周围的其他方法,我不现在不记得了)。

相关问题