|
|
上次有劳secondage解决了d3d鼠标拾
取问题。当时我就发现,鼠标拾取算法里
面似乎没有引入worldmatrix。
果然,我在改变了worldmatrix后,鼠标拾
取出现了问题。简单来说,就是物体因为改
变worldmatrix后移动开,但鼠标拾取算法仍
然认为物体在原来的位置。当鼠标移到变化
前的位置后,物体被拾取(实际上物体已经
移动走了)。
下面是secondage给出的算法,各位熟悉
这个的人看该怎么样引入worldmatrix?
D3DXMATRIX matProj;
m_pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj );
POINT ptCursor;
GetCursorPos( &ptCursor );
ScreenToClient( m_hWnd, &ptCursor );
// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / m_d3dsdBackBuffer.Width ) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / m_d3dsdBackBuffer.Height ) - 1 ) / matProj._22;
v.z = 1.0f;
// Get the inverse view matrix
D3DXMATRIX matView, m;
m_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;
谢谢! |
|