Я пытаюсь преобразовать точку, в которой я нажимаю на экране, чтобы получить направление луча, где я нажимаю. В конце концов это будет использоваться для пересечения какого-то рода. Направление, которое я сейчас имею, похоже, дает странные результаты, и я не уверен почему.
projectionMatrix = XMLoadFloat4x4(this->projectionMatrix);
viewMatrix = XMLoadFloat4x4(this->viewMatrix);
pointX = ((2.0f * (float)mouseX) / (float)screenWidth) - 1.0f;
pointY = (((2.0f * (float)mouseY) / (float)screenHeight) - 1.0f) * -1.0f;
pointX = pointX / XMVectorGetX(projectionMatrix.r[0]);
pointY = pointY / XMVectorGetY(projectionMatrix.r[1]);
inverseViewMatrix = XMMatrixInverse(nullptr, viewMatrix);
direction =
XMVectorSet((pointX * XMVectorGetX(inverseViewMatrix.r[0])) + (pointY * XMVectorGetX(inverseViewMatrix.r[1])) + XMVectorGetX(inverseViewMatrix.r[2]),
(pointX * XMVectorGetY(inverseViewMatrix.r[0])) + (pointY * XMVectorGetY(inverseViewMatrix.r[1])) + XMVectorGetY(inverseViewMatrix.r[2]),
(pointX * XMVectorGetZ(inverseViewMatrix.r[0])) + (pointY * XMVectorGetZ(inverseViewMatrix.r[1])) + XMVectorGetZ(inverseViewMatrix.r[2]), 0.0f);
Кажется, что это работает нормально под некоторым углом, но как только оно достигнет определенной точки, оно перестанет вращаться и даст «неожиданные» результаты. Возможно, проблема в значении Z, так как это направление, с которым я не могу столкнуться?
В примере с видео я заставляю камеру смотреть в направлении (вращающемся только вокруг оси Y в мире), и это направление основано на движении мыши. Как вы можете видеть, он хорошо работает в одной области, но как только он достигнет определенной точки, он начнет двигаться назад и перестанет следовать за мышью.
https://i.gyazo.com/c0e1cd6bc5c36a7a488ba81928061104.mp4
Кто-нибудь знает, что вызывает это?
Редактировать: Решено, проблема заключалась в повороте моей камеры с помощью acos, что давало мне 0-180 градусов свободы, а не 0-360 градусов
Проблема заключалась в повороте моей камеры с помощью acos, что давало мне свободу 0-180 градусов вместо использования atan
Других решений пока нет …