OpenGL: Как рассчитать угол, на который указывает моя мышь в трехмерном пространстве? - PullRequest
1 голос
/ 27 июля 2010

Мне нужно только знать, на какой угол (вектор x, y, z) указывает мой курсор. Так что я могу стрелять в любую частицу в том направлении, на которое я указываю.

Я не могу использовать тестирование глубины, поэтому типичные методы комплектации не подходят.

Это возможно только с чистой математикой? если я знаю соотношение сторон порта вида и перспективы и т. д.

Редактировать: Мне нужно получить координату из пустой сцены. Абсолютно пустой, вообще без рисунка!

Ответы [ 4 ]

2 голосов
/ 27 июля 2010

Простой ответ заключается в том, что часть рендеринга сцены включает в себя преобразование мировых координат для просмотра координат - где, в основном, все эти вещи относительно моих глазных яблок.

Плоскость просмотра - это экран, которыйэто то, на чем сидит мышьЕсли ваши координаты мыши (xx, yy), то, вероятно, они расположены в точке (xx, yy, 1) или (xx, yy, -1) в координатах вида.Вам, вероятно, понадобится использовать систему, в которой (0, 0) является центром вашего видового экрана на экране - не так, как обычно работают координаты мыши, но постоянные смещения достаточно просты.

zz = 0 - этогде игрок, в то время как плоскость обзора находится на небольшом расстоянии впереди, между игроком и тем, что он может видеть.Вот почему плоскость вида здесь принимается либо (xx, yy, 1), либо (xx, yy, -1) - если вы используете +1 (я думаю, что это нормальный случай), объекты с координатами вида, которые имеют положительное значение zперед вами.

Чтобы преобразовать это обратно в мировые координаты, примените то же преобразование, что и вы, чтобы преобразовать свои мировые координаты для просмотра координат, но в обратном направлении.Затем вы получаете указатель мыши в мировых координатах.Чтобы получить вектор направления, вычтите положение игрока.

Обратное преобразование использует обратную матрицу на каждом шаге и применяет шаги назад.В принципе, все шаги могут быть объединены в одну матрицу, и обратная матрица может быть рассчитана для всего преобразования - но это не лучший подход.Например, гораздо проще вычислить инверсию вращения, чем вычислить обратную матрицу общей матрицы.Если ваше преобразование из мировых координат для просмотра координат составлено по мере необходимости из компонентов (положение, ориентация ...), вам действительно нужно только рассчитать инвертированные компоненты и объединить их.Вместо 30 градусов влево (от мира к виду) вы используете 30 градусов влево (от вида к миру) и т. Д.

Если вам повезет, вы можете отказаться от всей проблемыположение игрока полностью - вычислите угол для указателя мыши в пространстве обзора (для этого достаточно углов Эйлера), затем примените часть ориентации только к преобразованию вида в мир.

Нет здесь-формулыИзвините, отчасти потому, что преобразование вида в мир зависит от того, как вы выполняете преобразование мира в вид, и отчасти потому, что у меня нет простого примера.

Хотя вопрос в другом,Вы можете найти некоторые соответствующие ссылки в ответах здесь ...

Умножение матриц - вид / проекция, мир / проекция и т. д.

2 голосов
/ 27 июля 2010

Если вы считаете, что вся ваша сцена вписывается в пирамиду, когда ваш глаз находится на вершине (смотря на основание), ваш экран представляет собой поперечное сечение, параллельное основанию, на которое проецируется вся сцена (в 2D пространство). Предположительно, вы знаете размеры экрана и расположение курсора в 2D-пространстве.

Вы можете посмотреть на эту пирамиду со стороны X, а затем снова со стороны Y, чтобы превратить задачу в два прямоугольных треугольника. Основание треугольника определяется линией от «глаза» до центра экрана, а гипотенуза определяется линией от «глаза» до курсора.

Поместив курсор в крайние углы 2D-дисплея, вы узнаете угол (с учетом информации о перспективе), чтобы вы могли определить, как далеко «глаз» от плоскости 2D-проекции (или длины основания вашего треугольники), в пикселях. Используя эту длину и длину другой стороны треугольника (x- или y-координата курсора), вы можете определить угол. Все это использует базовый триг.

Если это поможет, вытяните все рассматриваемые треугольники:

  • Треугольник, определенный как (0, 0); (base, 0); (base, Y_MAX), где Y_MAX - максимальное значение для курсора (верхний край экрана). base = Y/tan(max_angle)
  • Треугольник, определенный (0, 0); (base, 0); (base, X_MAX).
  • Треугольник, определенный как (0, 0); (base, 0); (base, Y), где Y - это позиция y курсора. angle = (tan^(-1))(Y/base)
  • Треугольник, определенный как (0, 0); (base, 0); (base, X).
1 голос
/ 27 июля 2010
0 голосов
/ 27 июля 2010

Если выбранная вами пуля не взорвется на некотором расстоянии (поэтому расстояние до предмета важно), вам понадобится только точка пересечения прицеливания с плоскостью, чтобы определить ваши углы.

Заставьте курсор находиться в плоскости, перпендикулярной направлению вашего взгляда, и на некотором расстоянии от вас. Затем возьмите смещение от места выхода ствола орудия до места расположения курсора и оттуда рассчитайте свои углы.

...