Я работаю над проблемой внедрения roll-, pitch- и поворотов в стиле "рыскания" в OpenGL в течение довольно продолжительного времени, с ограниченным релевантным материалом, доступным в Интернете. Суть проблемы заключается в нахождении обновленных локальных осей, поскольку объект вращается. Например, вращение вокруг X приводит к изменению локальных осей Y и Z. Последующие вращения будут вокруг обновленных осей. Я нашел некоторые математические формулы для поиска обновленных векторов здесь:
http://nehe.gamedev.net/article/camera_class_tutorial/18010/
Однако новый вектор задается в терминах точек, например, вращение на 45 градусов вокруг оси Y изменяет ось X, которая теперь проходит через точки (0.71, 0, 0.71). Теперь вопрос заключается в том, как найти точки (x, y, z), которые могут быть переданы в glRotatef (angle, x, y, z). Заметим, что x, y, z лежат на проходящем через них векторе и в начале координат.
Я думаю о том, чтобы взять нормаль к линии, проходящей через (0.71, 0, 0.71) и происхождение, а затем снова взять нормаль, чтобы получить (x, y, z).
Может ли кто-нибудь предложить улучшение этого или альтернативный метод?
Я предлагаю вам использовать кватернионы. Сложно понять сначала несколько концептуально, но как только вы поймете суть этого, реализация довольно прямолинейна. Кроме того, поворот кватернионов позволяет избежать блокировки карданного вала :)
Сайт учебника OpenGL Quaternion:
http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/
glRotate()
и т. Д., Но эти функции в любом случае устарели. Вы должны рассмотреть возможность использования математической библиотеки, такой как glm. Это дает вам больше гибкости, и вращение вокруг локальных осей предоставляется бесплатно.