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-перемещаемые Градусы круг.
Мой конечный результат - камера все еще вращается вдоль начала координат, а не в центре круга. Кто-нибудь может помочь мне решить эту проблему? Спасибо!4 ответа:
Вам нужно либо:
- поверните камеру вокруг начала координат, а затем переведите ее (*)
Или:
- Используйте
gluLookAt
, чтобы камера была направлена в центр круга(*) функции вращения обычно вращаются вокруг начала координат. Для вращения вокруг другой точки
P
необходимо:
- translate (- P)
- поворот
- translate (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)
Примечание порядок не должен быть изменен.
Зачем утруждать себя всеми хлопотами по вращению камеры и не поворачивать саму сцену?
Это гораздо более прямолинейно. просто поверните матрицу modelview вокруг начала координат. Вы получите точно такой же результат.
Я нахожу, что подобные проблемы гораздо легче решить с помощью gluLookAt (). Вы определяете путь для камеры (круг-это легко!) и держите" центральную " точку неподвижной (то есть то, на что вы смотрите).
Единственный возможный трюк-это определение хорошего вектора вверх,но обычно не слишком много работы. Если путь и целевая точка находятся в одной плоскости, вы можете использовать один и тот же вектор вверх каждый раз!