|
如题,D3D Pick,在网上找了一下资源,是可以用,但拷到自己的代码中就是不工作,找了好久的原因,原来是 D3D 默认坐标系是左手的,而由于需要,我特地设置成了右手坐标系,所以才会出现问题。
我的问题就是,如何在右手坐标系的情况下实现 D3D Pick,代码都大同小异,比如下面这个,在左手坐标系下工作正常,如何转换成 右手坐标系下的代码:
//客户区坐标->投影坐标->摄像机坐标
// Compute the vector of the pick ray in screen space
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / m_Width ) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / m_Height ) - 1 ) / matProj._22;
v.z = 1.0f;
//摄像机变换的逆变换
// Get the inverse view matrix
D3DXMATRIXA16 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;
//观察点从摄像机坐标系(0,0,0,1)变换到世界坐标系
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
}
D3DXIntersect(g_pMesh, &vPickRayOrig, &vPickRayDir, &bHit, &dwFace, &fBary1, &fBary2, &fDist,
NULL, NULL);
|
|