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 26

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 (). Вы определяете путь для камеры (круг-это легко!) и держите" центральную " точку неподвижной (то есть то, на что вы смотрите).

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