2014-01-14 7 views
3

Я обыскал доску, а также панель окулов и единственную доску. Не мог найти что-то, что помогло.Литье луча от мыши через матрицу искажений

Я работаю над имитацией автомобиля. Прежде чем мы начали использовать окулус, это была просто обычная перспектива. Вы использовали гоночное колесо/педали, чтобы управлять, и мышь, чтобы управлять всеми кнопками и переключателями и т. Д. Мы используем raycasting из точки мыши на экране в мир, чтобы взаимодействовать с различными элементами управления в автомобиле.

Теперь, когда мы используем окулус, raycast не учитывает матрицу искажений, используемую на камерах oculus. Таким образом, вы на самом деле не бросаете луч в то, что вы наглядно нажимаете. Используя Debug.DrawRay, я обнаружил, что он немного отключен. Чтобы быть уверенным, я отключил коррекцию объектива с помощью инспектора на OVRCameraController, и, конечно же, raycasting снова работает.

Сам луч вычисляется обычным способом при стрельбе из точки мыши: ScreenPointToRay (Input.mousePosition);

Может кто-нибудь понять, как я могу настроить свой луч, чтобы он работал с коррекцией объектива?

Приветствия, Гордон

ответ

0

Хорошо, что я в конечном итоге делает было создание 3D-курсор, минуя матрицу искажения полностью.

Я разместил объект игры в том же месте, что и «голова» (между левым глазом и камерами правого глаза). У него есть скрипт, который вращается вверх/вниз/влево/вправо, основываясь на движении мыши. Затем я временно поставил пятно света с узким конусом и высокой интенсивностью на нем, чтобы он выглядел как лазерная указка. Я решил, что свет бьет, так что рабаст такого же происхождения. Который закончил работать.

Однако это не решило проблему использования курсора. Я пробовал несколько вещей, которые в конечном счете не работали (не совпадали с тем, где попал свет/raycast).

Наконец-то я понял, что я пропускаю что-то очень простое. Я опустил плоскость отсечения камер и поместил плоскость как можно ближе к камере, пока она еще видна. Затем я повернул его на локальный y на 180, чтобы он был невидим для камер, а не для блокировки лучей.

Затем я добавил код, чтобы, когда raycast что-то ударил, он выстрелил бы второй raycast из точки удара обратно в начало. По пути это должно было ударить по плоскости, которая была в основном на ближней плоскости отсечения. Затем я переместил бы мой 3D-курсор к этой точке попадания.

Теперь он работает по назначению. Там, где находится курсор, находится исходный расист. Теперь курсор соответствует положению лазерной точки. Итак, я удалил компонент света. Готово.

Надеюсь, что когда-нибудь это поможет кому-то еще.

+0

Возможно, вы можете разделить текст на несколько абзацев для удобства чтения. –

+0

... и сделано:] – gord0

1

Просто умножьте матрицу искажений с векторами лучей (положение и нормальный), и у вас есть новый луч. Я бы предложил использовать гомогенные координаты с матрицей 4x4 и Vec4, где Positions имеет компонент w = 1.0 и Normals имеют w = 0.0; Таким образом, вы можете просто размножаться, и все будет сделано - в зависимости от направления поиска вам может потребоваться использовать обратную матрицу :)