Лучший способ заставить камеру двигаться и вращаться

Я изучаю программирование игр OpenGL, и я застрял в том, как реализовать, чтобы камера следовала за указателем мыши. Как и в игре fps, вы хотите посмотреть, куда указывает ваша мышь, но я не могу найти хорошее решение для этого, пока я двигаюсь. Я думал о том, чтобы сохранить одну матрицу для движения, такого как ходьба и стрейф, при этом используя кватернионы для управления вращением. Затем преобразуйте кватернион в матрицу вращения, загрузите идентичность для матрицы представления модели и синхронизируйте эту матрицу с обеими матрицами.

Конечно, с этим есть некоторые проблемы, например, какую матрицу мы должны использовать при умножении первой, и код будет уродливым.

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


person martiert    schedule 26.01.2009    source источник


Ответы (2)


Сохраните детали обзора камеры в виде вектора положения, вектора обзора и вектора вверх (подумайте об указании с вытянутым большим пальцем: ваш палец — это вектор обзора, а большой палец — вектор вверх). Держите эти векторы нормализованными и под углом 90 градусов друг к другу. Вы должны увидеть, что этих трех векторов достаточно для представления любого положения и ориентации камеры.

Вы можете использовать эти векторы для преобразования мировых координат в координаты камеры:

  • Перевести по -position;
  • Повернуть вокруг (вектор вверх по оси Y) на -(угол между вектором вверх и осью Y);
  • Повернуть вокруг вектора вверх на -(угол между вектором обзора и осью Z).

(Возможно, я неправильно понял некоторые из своих знаков).

Вы можете преобразовывать эти векторы, когда пользователь перемещает мышь:

  • Когда мышь движется вбок, поверните вектор обзора вокруг вектора вверх (или поверните и вектор обзора, и вектор вверх вокруг оси Y, если хотите).
  • Когда мышь перемещается назад/вперед, вращайте как вектор обзора, так и вектор вверх (вектор обзора «пересекает» вектор вверх).
person stusmith    schedule 26.01.2009
comment
Спасибо, при просмотре на бумаге кажется, что это сработает. Так что я не могу дождаться, пытаясь реализовать это. - person martiert; 26.01.2009
comment
Я наткнулся на проблему здесь, как я могу найти угол между вектором обзора и вектором для мыши на копье единицы вокруг вектора вверх? Я не могу просто использовать скалярное произведение двух векторов, так как это дало бы ему координаты мирового пространства вместо координат камеры. - person martiert; 28.01.2009
comment
Не могли бы вы пояснить... Я не уверен, что вы имеете в виду под вектором для мыши на копье юнита. Мышь и клавиатура просто изменяют три вектора камеры. - person stusmith; 29.01.2009
comment
PS Я нашел эту статью, которая может помочь: gamedev.net/community /forums/topic.asp?topic_id=440585 - person stusmith; 29.01.2009
comment
Аааа... немного прояснил. Я просто все еще застрял в своем образе мышления, который не пошел хорошо: P Спасибо за помощь. - person martiert; 03.02.2009

На самом деле у меня нет решения вашей проблемы, но я знаю, что 3D-движок с открытым исходным кодом Irrlicht имеет камера FPS, которая делает именно то, что вы ищете, и, как правило, имеет хорошо задокументированный источник.

Вы можете попробовать посмотреть, как камера FPS реализована в Irrlicht, или вы даже можете использовать сам Irrlicht для своего проекта; Я использовал его для пары своих, когда учился в колледже, и он всегда работал как шарм :)

person Raibaz    schedule 26.01.2009