OpenGL, вращающий камеру вокруг точки

opengl camera rotation 3d

62513 просмотра

5 ответа

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

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

Автор: Bryan Denny Источник Размещён: 17.05.2019 03:56

Ответы (5)


24 плюса

Решение

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

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

или же:

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

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

  • переводить (-P)
  • вращаться
  • переводить (P)
Автор: Alnitak Размещён: 13.11.2008 05:48

9 плюса

это немного запутанно, но я думаю, что вы должны:

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

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

Автор: neoedmund Размещён: 03.04.2009 07:18

2 плюса

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

Автор: shoosh Размещён: 13.11.2008 06:49

1 плюс

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

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

Автор: Drew Hall Размещён: 13.11.2008 05:53

0 плюса

@ Алнитак, @neoedmund

Поэтому давайте предположим, что у меня есть камера, помещенная в (0,0,10) в init, и цель состоит в том, чтобы на орбиту вокруг объекта (0,0,0) с радиусом r = 10 все время работы приложения. В какой-то момент я хочу повернуть камеру по оси х на 20 градусов, а ось у на 10 градусов.

Я делаю это так, но получаю странный результат: 1.) переместите камеру (матрицу просмотра) в начало координат (0,0,0) 2.) поверните камеру по оси Y на 10 градусов 3.) поверните камера на оси х на 20 градусов 4.) перевести камеру на (0,0,10)

Когда я это делаю, объект в происхождении не стоит прямо, но любопытное наклоняется.

Автор: user7727914 Размещён: 03.11.2018 09:28
32x32