2010-07-27 3 views
1

Мне нужно только знать, какой угол (x, y, z vector) указывает мой курсор. Поэтому я могу снимать любую частицу в направлении, на которое я указываю.OpenGL: как рассчитать угол, на который указывает моя мышь в 3d пространстве?

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

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

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

+0

Используйте сферические или цилиндрические координаты .... –

ответ

1
+0

Это работает, если я ничего не нарисовал? Таким образом, у них нет объекта, чтобы взять координаты из – Newbie

+0

@Newbie: ему нужны текущие модели OpenGL/проекционные матрицы, ничего больше. Вам не нужно ничего рисовать. – SigTerm

+0

Хм, это на самом деле то, что я использовал раньше, но я уронил его, потому что он не был точным – Newbie

0

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

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

+0

Позволяет забыть эту вещь съемки, его не то, что им делать, был просто пример. – Newbie

2

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

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

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

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

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

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

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

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

Matrix multiplication - view/projection, world/projection, etc

+0

Можете ли вы привести пример кода? Намного легче понять из кода, чем читать все эти классные слова, которые мне неизвестны. – Newbie

+0

Извините. Как я уже сказал, у меня нет примера. Я читал книги о 3D-материалах много лет назад, я помню какую-то теорию, но я никогда не писал никаких существенных 3D-приложений. Я немного поиграл с OpenGL, но недостаточно, чтобы беспокоиться о преобразованиях представлений. – Steve314

2

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

+1 - Это то, что я собирался предложить. – Paul

+0

Теперь, если бы я понял это – Newbie

Смежные вопросы