使用DirectX中的光线投射鼠标拾取

时间:2016-09-07 18:15:35

标签: c++ matrix 3d directx raycasting

我试图在C ++中使用DirectX实现光线投射,但遇到了问题。我尝试了两种方法,使用XMVector3Unproject并遵循前一段时间提供的说明{。{3}}。

非项目方法:

//p is mouse location vector

//Don't know if I need to normalize mouse input
//p.x = (2.0f * p.x) / g_nScreenWidth - 1.0f;
//p.y = 1.0f - (2.0f * p.y) / g_nScreenHeight;

Vector3 orig = XMVector3Unproject(Vector3(p.x, p.y, 0),
                 0,
                 0,
                 g_nScreenWidth,
                 g_nScreenHeight,
                 0,
                 1,
                 GameRenderer.m_matProj,
                 GameRenderer.m_matView,
                 GameRenderer.m_matWorld);

Vector3 dest = XMVector3Unproject(Vector3(p.x, p.y, 1),
                 0,
                 0,
                 g_nScreenWidth,
                 g_nScreenHeight,
                 0,
                 1,
                 GameRenderer.m_matProj,
                 GameRenderer.m_matView,
                 GameRenderer.m_matWorld);

Vector3 direction = dest - orig;
direction.Normalize();

//shoot a bullet to visualize the ray for testing
g_cObjectManager.createObject(BUL_OBJ, "bullet", orig, direction*100);

矩阵反演方法:

//Normalized device coordinates
p.x = (2.0f * p.x) / g_nScreenWidth - 1.0f;
p.y = 1.0f - (2.0f * p.y) / g_nScreenHeight;

XMVECTOR det; //Determinant, needed for matrix inverse function call
Vector3 origin = Vector3(p.x, p.y, 0);
Vector3 faraway = Vector3(p.x, p.y, 1);

XMMATRIX invViewProj = XMMatrixInverse(&det, GameRenderer.m_matView * GameRenderer.m_matProj);
Vector3 rayorigin = XMVector3Transform(origin, invViewProj);
Vector3 rayend = XMVector3Transform(faraway, invViewProj);
Vector3 raydirection = rayend - rayorigin;
raydirection.Normalize();

g_cObjectManager.createObject(BUL_OBJ, "bullet", rayorigin, raydirection * 5);

我假设至少stackoverflow的矩阵求逆方法应该有效,但出于某种原因,我的尝试并没有。我是否也需要世界矩阵,或者我缺少一些步骤?

这是我的第一篇stackoverflow帖子,所以如果有什么不清楚或需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

最后,我意识到我的问题源于从透视切换到正交视图以绘制HUD并且从不重置视图矩阵。我能够使用XMVector3Unproject()函数和单位矩阵代替世界矩阵,现在一切都完美无瑕。

感谢Nico Schertler提供的信息和保证!