Перекрестная путаница - PullRequest
0 голосов
/ 26 мая 2019

У меня есть вопрос, касающийся руководства, которому я следовал, относительно поворота направления обзора камеры в OpenGL.

Хотя я понимаю, что потенциальные респонденты не являются авторами руководства, я думаю, что этоВероятно, это будет ситуация, с которой сталкивалось большинство опытных графических программистов среднего уровня, поэтому я буду просить совета участников по этой теме.

Вот ссылка на видео, на которое я ссылаюсь: https://www.youtube.com/watch?v=7oNLw9Bct1k.

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

Вот функция, которая обрабатывает движение курсора (некоторые переменные / элементы переименованы всоответствовать моим личным соглашениям):

glm::vec2 Movement { OldCursorPosition - NewCursorPosition };

// camera rotates on y-axis when mouse moved left/right (orientation is { 0.0F, 1.0F, 0.0F }):

MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.x) / 2, MVP.view.orientation) 
                   * glm::vec4(MVP.view.direction, 0.0F);

glm::vec3 RotateAround { glm::cross(MVP.view.direction, MVP.view.orientation) };

/* why is camera rotating around cross product of view direction and view orientation 
rather than just rotating around x-axis when mouse is moved up/down..? : */

MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.y) / 2, RotateAround) 
                   * glm::vec4(MVP.view.direction, 0.0F);

OldCursorPosition = NewCursorPosition;

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

Насколько я понимаю, перекрестное произведение вернет вектор, перпендикулярный двум другим векторам;в этом случае это является перекрестным произведением направления вида и ориентации вида, но почему нужно иметь перекрестное произведение этих двух векторов?Разве камера не должна просто вращаться вокруг оси x для перемещения вверх / вниз, а затем по оси y для движения влево / вправо ...?Что я здесь упускаю / пропускаю?

Наконец, когда я запускаю программу, я не могу визуально обнаружить какое-либо вращение по оси z, несмотря на то, что скаляр вращения 'RotateAround' имеет значение zбольше или меньше 0 при каждом вызове функции, следующей за первой (что предполагает, что камера должна вращаться хотя бы частично по оси z).

Возможно, это просто из-за отсутствия у меня интуиции, но если я поменяю строку:

MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.y) / 2, RotateAround)
                   * glm::vec4(MVP.view.direction, 0.0F);

На:

MVP.view.direction = glm::rotate(glm::mat4(1.0F), glm::radians(Movement.y) / 2, glm::vec3(1.0F, 0.0F, 0.0F))
                   * glm::vec4(MVP.view.direction, 0.0F);

Так что вращение происходит толькона оси x, а не частично на оси x и частично на оси z, а затем запустите программу, я не могу заметить большой разницы в работе камеры.Такое ощущение, что, может быть, есть разница, но я не могу четко сформулировать, что это такое.

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Проблема здесь в системе координат.

, а не просто вращение вокруг оси x, когда мышь перемещается вверх / вниз ..?

Что вы считаете осью x?Если это ось глобальной системы отсчета или параллельная, то да.Если это ось x для системы отсчета, частично суженная положением камеры, то в общем случае ответ отрицательный.Зависит от порядка поворотов, и если MVP сохраняется между движениями.

При условии, что в коде ее MVP изменяется путем поворота, это означает, что он изменяется.Если камера поворачивается на 180 градусов вокруг оси x, направление оси x изменится на противоположное.

Если камера будет вращаться вокруг оси y (я предполагаю, что направления ISO для наземного транспортного средства), направление также изменится.Если камера поворачивается вокруг глобального значения y на 90 градусов, то вокруг глобального значения x на 45 градусов, в результате вы увидите, что изображение было наклонено на 45 градусов в сторону.

Порядок поворота вокруг ограниченной системы отсчета дляназемные транспортные средства (и, возможно, для персонажа классического 3d-шутера): вокруг y, вокруг x, вокруг z.Для летательных аппаратов с самолетоподобным управлением это около z, около x, около y.В орбитальном пространстве z и x инвертированы, если я правильно помню (z указывает вниз).

0 голосов
/ 27 мая 2019

Вы должны сделать перекрестное произведение, потому что после нескольких движений мыши камера теперь по-разному ориентирована.Исходная ось X, вокруг которой вы хотели вращаться, НЕ является той же осью X, вокруг которой вы хотите сейчас вращаться.Вы должны вычислить вектор, который в данный момент направлен прямо на сторону камеры, и вращаться вокруг него.Это считается "правильным" вектором.Это перекрестное произведение векторов вида и вверх, где вид - это «целевой» вектор (вниз по оси z камеры, куда вы смотрите), а вверх - прямо из камеры вверх по оси y камеры.Эти оси должны обновляться по мере движения камеры.Вычисление векторов вида и вверх не требует перекрестного произведения, так как вы должны применять к ним повороты в зависимости от ваших движений по пути.Вид и вверх должны обновляться поворотами, но если вы хотите вращаться вокруг оси x (шаг), вы должны сделать перекрестное произведение.

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