OpenGL: Как рассчитать угол, на который указывает моя мышь в 3D-пространстве?

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

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

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

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


person Newbie    schedule 27.07.2010    source источник
comment
Используйте сферические или цилиндрические координаты....   -  person Buhake Sindi    schedule 27.07.2010


Ответы (4)


gluUnProject

person SigTerm    schedule 27.07.2010
comment
Это работает, если я ничего не нарисовал? Так что нет объекта для получения координат - person Newbie; 27.07.2010
comment
@Newbie: ему нужны текущие матрицы просмотра/проекции модели OpenGL, ничего больше. Вам не нужно ничего рисовать. - person SigTerm; 27.07.2010
comment
Хм, это на самом деле то, что я использовал раньше, но я отказался от него, потому что это было неточно. - person Newbie; 27.07.2010
comment
@Newbie: Что ж, тогда попытайтесь понять математику, стоящую за gluUnProject, и сделайте лучшую версию. потому что это было неточно. Неизвестно, как именно вы его использовали, так что это может быть ваша вина. - person SigTerm; 27.07.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).
person TreDubZedd    schedule 27.07.2010
comment
Теперь, если бы я мог понять это - person Newbie; 27.07.2010

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

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

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

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

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

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

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

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

Матричное умножение - представление/проекция, мир/проекция и т. д.

person Steve314    schedule 27.07.2010
comment
Можете ли вы привести пример кода? Гораздо легче понять из кода, чем читать все эти классные слова, которые мне неизвестны. - person Newbie; 27.07.2010
comment
Извините. Как я уже сказал, у меня нет примера. Много лет назад я читал книги по 3D, помню кое-что из теории, но никогда не писал серьезных 3D-приложений. Я немного поигрался с OpenGL, но не настолько, чтобы беспокоиться о преобразованиях представления. - person Steve314; 27.07.2010

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

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

person John    schedule 27.07.2010
comment
Давай забудем об этой стрельбе, это не то, чем я занимаюсь, это просто пример. - person Newbie; 27.07.2010