Вопрос

В 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 (). Вы определяете путь для камеры (круг легко!) И сохраняете «центр» фиксированная точка (то есть то, на что вы смотрите).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top