Я пытаюсь реализовать raycasting с DirectX в C ++, но столкнулся с проблемами. Я пробовал два подхода, используя XMVector3Unproject и следуя инструкциям здесь на стеке потока Некоторое время назад
Непроектный подход:
//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 должен работать, но по какой-то причине моя попытка не работает. Нужна ли мне мировая матрица, или я пропустил какой-то шаг?
Это моя первая публикация в стеке, поэтому если что-то неясно или требуется дополнительная информация, пожалуйста, дайте мне знать.
В конце концов я понял, что моя проблема возникла с переключения с перспективы на орфографический вид, чтобы нарисовать HUD и никогда не сбрасывать матрицу вида. Я был в состоянии использовать XMVector3Unproject()
работайте с матрицей тождества вместо мировой матрицы, и теперь все работает без нареканий.
Спасибо Нико Шертлеру за информацию и заверение!
Других решений пока нет …