Относительное вращение камеры OpenGL - PullRequest
1 голос
/ 27 июля 2011

В настоящее время я пытаюсь найти формулу для поворота моей OpenGL «Камера» (я пытался сделать это с помощью поворота сцены, но у меня возникла та же проблема).По сути, моя камера находится в заданной позиции, смотрит в заданную точку (все обозначено gluLookAt), и я хотел бы повернуть камеру вверх, например, и все еще смотреть в ту же точку.процесс ?Какие входные данные я должен принять, чтобы определить количество движения?Эволюция координат 2D-мыши или эволюция 3D-непроецированных координат мыши?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Хитрость заключается в том, чтобы видеть, что поворот камеры такой же, как поворот сцены, если вы делаете это в правильном положении.Переместите камеру в точку , вокруг которой вы хотите повернуть, затем поверните камеру, затем вернитесь на то же расстояние, на которое вы переместились.ваше приложение.Возьмите в качестве примера G-Earth: если вы находитесь близко к поверхности, вращение (абсолютно) мало, если вы далеко от поверхности, оно велико.

1 голос
/ 31 июля 2011

Если вы создаете орбитальную камеру (oribitng вокруг LookAt) для openGL, я рекомендую вам сделать это со следующими данными:

LookAtPosition- 3D vector
CamUp - 3D unit vector
RelativeCamPosition - 3D unit vector
CamDistance - decimal number

LookAtPosition - это точка, на которую вы будете смотреть.CamUp - это вектор, направленный вверх от камеры, вы можете увидеть его на этом изображении .Лучше всего инициализировать камеру без поворота, чтобы CamUp = [0,1,0].Обратите внимание, что это единичный вектор, поэтому его величина / размер / длина всегда равны 1. RelativeCamPosition снова является единичным вектором.Вы получите его, взяв LookAt на вектор камеры и разделив его на величину, которую вы сохраните в CamDistance.В инициализированном состоянии это может выглядеть так:

LookAtPosition = [0,0,0]
CamUp = [0,1,0]
RelativeCamPosition = [1,0,0]
CamDistance = 10

Теперь вы можете получить положение камеры на

CamPosition = LookAtPosition + RelativeCamPosition * CamDistance

Но вам нужно повернуть камеру вокруг вправо?Ну, есть причина для единичных векторов - их легко использовать в расчетах.Я считаю, что вы используете углы для вращения, поэтому вам нужно использовать только синус и косинус.Функция поворота может выглядеть следующим образом:

Rotate(angleX, angleY){
   RelativeCamPosition.x = sin(angleX)*cos(angleY);
   RelativeCamPosition.z = cos(angleX)*cos(angleY);
   RelativeCamPosition.y = sin(angleY);
}

, где angleX и angleY ​​- абсолютные (НЕ ОТНОСИТЕЛЬНЫЕ) повороты в горизонтальном и вертикальном направлении.Вы должны всегда использовать абсолютное вращение, потому что при добавлении могут быть ошибки с плавающей запятой.Во всяком случае, я только что сделал эти расчеты на клочке бумаги, поэтому я надеюсь, что они в порядке.

Редактировать: Я только что заметил, что это будет работать, только если ваше начальное состояние, как я написал RelativeCamPosition = [1,0,0].Однако их не должно быть сложно отредактировать, чтобы они работали для начального состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...