我试图在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帖子,所以如果有什么不清楚或需要更多信息,请告诉我。
答案 0 :(得分:0)
最后,我意识到我的问题源于从透视切换到正交视图以绘制HUD并且从不重置视图矩阵。我能够使用XMVector3Unproject()
函数和单位矩阵代替世界矩阵,现在一切都完美无瑕。
感谢Nico Schertler提供的信息和保证!