高分求教将屏幕坐标转换成D3D世界坐标中的问提!
高分求教将屏幕坐标转换成D3D世界坐标中的问提!
D3DXVECTOR3 ScreenTo3D(int iScreenX,int iScreenY,double f3DY)
{
D3DXVECTOR3 vPickRayDir;
D3DXVECTOR3 vPickRayOrig;
D3DXVECTOR3 vOut;
D3DXMATRIX matProj;
g_pD3DDevice->GetTransform( D3DTS_PROJECTION, &matProj );
POINT ptCursor;
ptCursor.x = iScreenX;
ptCursor.y = iScreenY;
// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / 800 ) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / 600 ) - 1 ) / matProj._22;
v.z = 1.0f;
// Get the inverse view matrix
D3DXMATRIX matView, m;
g_pD3DDevice->GetTransform( D3DTS_VIEW, &matView );
D3DXMatrixInverse( &m, NULL, &matView );
// Transform the screen space pick ray into 3D space
vPickRayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31;
vPickRayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32;
vPickRayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
vOut.y = f3DY;
vOut.x = (f3DY-vPickRayOrig.y)*vPickRayDir.x/vPickRayDir.y + vPickRayOrig.x ;
vOut.z = (f3DY-vPickRayOrig.y)*vPickRayDir.z/vPickRayDir.y + vPickRayOrig.z;
return vOut;
}
以上中,先求得视点以及射线矢量,然后按照直线的空间方程,求得在Y平面上的X,Z坐标,可是实际中我发现这样求得的结果有较大的误差,比如视线沿X轴时X向误差较大,反之沿Z轴时Z向误差较大,恳请赐教!