У меня есть вопрос, касающийся руководства, которому я следовал, относительно поворота направления обзора камеры в 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, а затем запустите программу, я не могу заметить большой разницы в работе камеры.Такое ощущение, что, может быть, есть разница, но я не могу четко сформулировать, что это такое.