Я рисую сцену, где камера свободно перемещается по вселенной. Класс камеры отслеживает точку обзора (или просмотра ), положение камеры и вектор вверх. Эти векторы / точки затем передаются в gluLookAt.
Панорамирование и масштабирование почти тривиальны для реализации. Тем не менее, я нахожу поворот вокруг взгляда на точку гораздо более серьезной проблемой. Я хочу написать функцию Camera.rotate, которая принимает 2 угла, один, который вращается вверх / вниз, и другой, который вращается влево / вправо вдоль воображаемой сферы, которая сосредоточена вокруг взгляда на точку.
Есть простой способ сделать это?
Я (кратко) прочитал о кватернионах, но я хотел посмотреть, было ли более простое решение, учитывая относительно простую конструкцию моей сцены.
Ответы:
То, что вы просите, называется ротацией Arcball. Кватернионы - это простое решение, только если вы понимаете, как они работают. Однако вы можете достичь того же самого без кватернионов.
Предпосылки
Вы знаете, как вращать объекты в целом? Допустим, у вас есть объект в начале координат. Знаете ли вы, как вы поворачиваете его (подсказка: умножьте на некоторую матрицу вращения)? Если да, то я предполагаю, что вы знаете, что произойдет, если вы сначала переведите объект, а затем поверните его?
Вы должны знать, как рассчитать матрицу вращения по оси угла (просто, как круговая диаграмма, посмотрите на множество онлайн-уравнений, многие из них также дают вам код)
Решение
Предостережения
Вам придется следить за определенными случаями или особенностями, при которых ваша камера перестанет работать. Глядя прямо вниз / вверх, например. Я дам вам понять, как с этим справиться.
EDIT1: Как пересчитать ортонормированные векторы камеры
Вы уже знаете направление камеры ((cameraPos - focusPoint) .normalize ()). Теперь предположим, что у вашей камеры вверх + Y (или если текущая верхняя ось вашего мира ... это зависит от вас). Теперь просто пересечь направление с вверх , чтобы получить право . Выполнено? Нет! Ваш верхний вектор больше не является ортогональным к двум другим. Чтобы исправить это, перекрестное право с руководством , и вы получите ваш новый вверх .
Обратите внимание, что Грам-Шмидт действительно то, что следует использовать для ортонормирования векторов.
Опять же, обратите внимание на предостережения, так как в некоторых случаях это не сработает (например, направление параллельно вверх ).
источник
normalize(up ^ camFocusVector)
(или его противоположность, если левша).Что вам нужно, это обычная камера ArcBall, которая в основном представляет собой камеру, которая сохраняет местоположение цели и позволяет вам перемещать камеру «сферически» вокруг этой цели.
Это в XNA, но IIRC я использовал эту реализацию раньше, и она работала довольно хорошо:
http://roy-t.nl/index.php/2010/02/21/xna-simple-arcballcamera/
источник
Вот мой код для поворота вокруг точки, и я часто использую его.
источник
Этот очень простой алгоритм для достижения этого довольно крутой:
Будучи P центральной точкой, которую вы хотите повернуть (точка «взгляда» или «цели»):
Я использовал это, и это приятно.
Источник найден на дочернем сайте stackoverflow: /programming/287655/opengl-rotating-a-camera-around-a-point
источник