OpenGL вращает камеру вокруг точки - PullRequest
27 голосов
/ 13 ноября 2008

В 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 ]

25 голосов
/ 13 ноября 2008

Вам нужно либо:

  • поверните камеру вокруг начала координат и затем переведите ее (*)

или

  • используйте gluLookAt, чтобы камера указывала в центр круга

(*) Функции вращения обычно вращаются вокруг начала координат. Чтобы повернуть вокруг другой точки P, вам необходимо:

  • перевод (-P)
  • 1020 * повернуть *
  • перевод (P)
9 голосов
/ 03 апреля 2009

это немного сбивает с толку, но я думаю, вы должны:

// 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)

обратите внимание, что заказ НЕ должен быть изменен.

2 голосов
/ 13 ноября 2008

Зачем беспокоиться о вращении камеры, а не о вращении самой сцены?
Это намного проще. просто поверните матрицу вида модели вокруг начала координат. Вы получите точно такой же результат.

1 голос
/ 13 ноября 2008

Мне кажется, что такие проблемы гораздо проще решить с помощью gluLookAt (). Вы определяете путь для камеры (круг легко!) И сохраняете фиксированную «центральную» точку (т. Е. То, на что смотрите).

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

...