OpenGL вращает камеру вокруг точки
Вопрос
В OpenGL я пытаюсь повернуть камеру вокруг точки, при этом камера находится на расстоянии r от точки и обращена к точке при вращении.Другими словами, я хочу, чтобы камера перемещалась по окружности на радиусе r от центра, при этом камера была обращена к центру в любой точке окружности.
Допустим, в трехмерном пространстве центр круга равен (3, 0, 3);
Я пробовал:
// move to center of circle
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);
где CameraAngle — это градусы перемещения по кругу.
Мой конечный результат: камера все еще вращается вдоль начала координат, а не по центру круга.Может ли кто-нибудь помочь мне решить эту проблему?Спасибо!
Решение
Вам необходимо либо:
- поверните камеру вокруг начала координат, а затем переместите ее (*)
или:
- использовать
gluLookAt
чтобы камера была направлена в центр круга
(*) функции вращения обычно вращаются вокруг начала координат.Чтобы повернуть вокруг другой точки P
вы должны:
- перевести (-P)
- вращать
- перевести (П)
Другие советы
это немного сбивает с толку, но я думаю, что вы должны:
// move camera a distance r away from the center
glTranslatef(0, 0, -r);
// rotate
glRotatef(angley, 0, 1, 0);
glRotatef(anglex, 1, 0, 0);
// move to center of circle
glTranslatef(-cx, -cy, -cz)
обратите внимание, что порядок НЕ должен быть изменен.
Зачем беспокоиться о вращении камеры, а не о вращении самой сцены?
Это намного проще. просто поверните матрицу вида модели вокруг начала координат. Вы получите точно такой же результат.
Я считаю, что подобные проблемы гораздо проще решить с помощью gluLookAt (). Вы определяете путь для камеры (круг легко!) И сохраняете «центр» фиксированная точка (то есть то, на что вы смотрите).
Единственный возможный трюк - определение хорошего вектора, но обычно не слишком много работы. Если путь и целевая точка находятся в одной плоскости, вы можете использовать один и тот же вектор вверх каждый раз!