Подтвердить что ты не робот

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 - это градусы, перемещаемые по кругу.

Мой конечный результат: камера по-прежнему вращается по началу координат, а не по центру круга. Может ли кто-нибудь помочь мне исправить эту проблему? Спасибо!

4b9b3361

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

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