Я пытаюсь создать прототип симулятора космического полета в OpenGL, но после прочтения многих статей в Интернете у меня все еще возникают проблемы с правильной работой поворотов (у меня была камера кватерниона, которую я плохо понимал, но она дрейфует и имеет другое странное поведение).
Я пытаюсь сделать следующее:
1) Локальное вращение - когда пользователь нажимает клавиши со стрелками, вращение происходит относительно области просмотра (например, вращение «вверх» направлено к верхней части экрана). Две клавиши, такие как Z и X, будут контролировать «крен» корабля (вращение вокруг текущего вида).
2) Повороты будут сохраняться в формате угла оси (что наиболее естественно для OpenGL, и один вызов поворота с вектором камеры должен правильно вращать сцену). Поэтому, учитывая начальный вектор оси угла и одно или несколько локальных поворотов, отмеченных выше (мы могли бы локально назвать «X» левой / правой осью, «Y» верхней / нижней осью и «Z» ось крена ), Я хотел бы, чтобы конечный результат был новым вектором угла оси.
3) Избегайте четвертичных чисел и минимизируйте использование матриц (по некоторым причинам я нахожу оба неинтуитивными). Вместо матричной записи, пожалуйста, просто покажите в psuedocode компоненты вектора и то, что происходит.
4) Вы должны иметь возможность вращаться в направлении (с помощью клавиш со стрелками) на 360 градусов и возвращаться к исходному виду без смещения. Предпочтительно, если пользователь нажимает одну комбинацию, а затем переворачивает ее, он может ожидать возврата к своей первоначальной ориентации.
5) Начальное состояние камеры находится в координатах (0,0,0), обращенных к вектору угла оси (0,0,1,0 - ось z без начального вращения). «вверх» равен (0,1,0).