OpenGL, вращающий камеру вокруг точки
В OpenGL я пытаюсь повернуть камеру вокруг точки, когда камера находится на расстоянии r от точки и обращена к точке, когда она вращается. Другими словами, я хочу, чтобы камера двигалась по окружности круга с радиусом r от центра, при этом камера обращена к центру в любой точке по окружности.
Допустим, что в 3d-пространстве центр круга равен (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 - это градусы, перемещаемые по кругу.
Мой конечный результат: камера по-прежнему вращается по началу координат, а не по центру круга. Может ли кто-нибудь помочь мне исправить эту проблему? Спасибо!
Ответы
Ответ 1
Вам нужно либо:
- поверните камеру вокруг начала координат, а затем переведите ее (*)
или
- используйте
gluLookAt
, чтобы камера указывала на центр круга.
(*) функции вращения обычно вращаются вокруг начала координат. Чтобы повернуть вокруг другой точки P
, вам необходимо:
- перевод (-P)
- Rotate
- перевести (P)
Ответ 2
это немного запутанно, но я думаю, вам следует:
// 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)
Обратите внимание, что порядок НЕ должен быть изменен.
Ответ 3
Зачем беспокоиться о всех проблемах с поворотом камеры и не поворачивать саму сцену?
Это гораздо более прямолинейно. просто поверните матрицу модели вокруг начала координат. Вы получите тот же результат.
Ответ 4
Я нахожу такие проблемы, которые намного проще решить с помощью gluLookAt(). Вы определяете путь для камеры (кружок легко!) И сохраняйте "центральную" точку неподвижной (т.е. Вещь, на которую вы смотрите).
Единственный возможный трюк - это определение хорошего вектора, но обычно это не слишком большая работа. Если путь и целевая точка находятся в одной плоскости, вы можете использовать один и тот же вектор вверх каждый раз!