Мне нужно преобразовать координату двухмерной мыши в трехмерную мировую координату на основе определенной глубины (это для радиопередачи). Я не использую DirectX в C ++ напрямую, я использую проприетарный язык, но если вы дадите мне ответ в C ++ или псевдокоде (предпочтительно C ++), я могу преобразовать его.
У меня есть доступ к мировой матрице, матрице представления и проекционной матрице и множеству функций манипулирования матрицей.
Если необходимо умножить вектор4 на матрицу4, единственная доступная мне функция, которая принимает как вектор4, так и матрицу4, это transformVector4(vector4Source,matrix4Source)
, Я не уверен, в каком порядке он умножает их, если это имеет значение.
Любая помощь будет высоко ценится 🙂 Я работаю над этим в течение нескольких часов, и я просто не получаю 3D математику …
Чтобы преобразовать вашу мышь в луч, вы делаете этот процесс:
Преобразуйте координаты мыши из координат пикселей в координаты -1/1 (-1, -1 слева внизу).
начало луча будет (вектор в ближней плоскости)
vector3 origin = vector3(mousex,mousey,0);
конец луча (вектор в дальней плоскости)
vector3 far = vector3(mousex,mousey,1);
теперь вам нужно применить преобразование к этим векторам, сначала вам нужно создать для него матрицу преобразования:
matrix4x4 inverseviewproj = invertmatrix(view * proj)
Примените это преобразование к обоим векторам:
vector3 rayorigin = transform(origin, inverseviewproj);
vector3 rayend = transform(far, inverseviewproj);
Ваше направление луча:
vector3 raydirection = normalize(rayend-rayorigin);
Вот и все, теперь вы можете использовать функции Raycast.
Если у вас есть доступ только к vector4, чтобы преобразовать вектор с помощью матрицы,
Компонент w должен быть равен 1, например:
vector4 origin = vector3(mousex,mousey,0,1);
vector4 far = vector3(mousex,mousey,1,1);
чтобы извлечь направление, убедитесь, что сначала конвертировали vector4 в vector3 (иначе это повлияет на нормализацию).
Других решений пока нет …