3D Screenspace Raycasting / Picking DirectX9

Мне нужно преобразовать координату двухмерной мыши в трехмерную мировую координату на основе определенной глубины (это для радиопередачи). Я не использую DirectX в C ++ напрямую, я использую проприетарный язык, но если вы дадите мне ответ в C ++ или псевдокоде (предпочтительно C ++), я могу преобразовать его.

У меня есть доступ к мировой матрице, матрице представления и проекционной матрице и множеству функций манипулирования матрицей.

Если необходимо умножить вектор4 на матрицу4, единственная доступная мне функция, которая принимает как вектор4, так и матрицу4, это transformVector4(vector4Source,matrix4Source), Я не уверен, в каком порядке он умножает их, если это имеет значение.

Любая помощь будет высоко ценится 🙂 Я работаю над этим в течение нескольких часов, и я просто не получаю 3D математику …

1

Решение

Чтобы преобразовать вашу мышь в луч, вы делаете этот процесс:

Преобразуйте координаты мыши из координат пикселей в координаты -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 (иначе это повлияет на нормализацию).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]