Странное поведение OpenGL при объединении Roll Pitch & amp; рыскание

Я заметил странное поведение в моей программе openGL. По сути, он генерирует некоторые формы, и основная задача — заставить камеру «летать» по всему миру с возможностью изменения крена, шага и рыскания. У меня уже все реализовано, но теперь, когда я поворачиваюсь, а затем меняю высоту или рыскание, сцена следует странной кривой и вылетает из поля зрения. В моем коде я поддерживаю 3 вектора, VRP для координат глаза, VPN для точки фокусировки, и VUP указывая направление вверх глаза.
Код для вращения у меня есть:

s_rotateAxis(VUP, VPN[0], VPN[1], VPN[2], 0.1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(VRP[0], VRP[1], VRP[2], (VPN[0] + VRP[0]), (VPN[1] + VRP[1]), (VPN[2] + VRP[2]),         VUP[0], VUP[1], VUP[2]);

с другим направлением, имеющим -0,1 для угла. s_rotateAxis просто вращает вектор о произвольной точке. Таким образом, в приведенном выше фрагменте кода VUP поворачивается относительно VPN на 0,1 градуса.
Чтобы повернуть налево, код выглядит следующим образом:

s_rotateAxis(VPN, VUP[0], VUP[1], VUP[2], 0.1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(VRP[0], VRP[1], VRP[2], (VRP[0] + VPN[0]), (VRP[1] + VPN[1]), (VRP[2] + VPN[2]), VUP[0], VUP[1], VUP[2]);

Опять же, точка фокусировки поворачивается примерно на 0,1 градуса VUP, и в gluLookAt генерируется точка для просмотра. Подбираем так:

productUP = xProduct(VPN, VUP);
s_rotateAxis(VPN, productUP[0], productUP[1], productUP[2], 0.1);
s_rotateAxis(VUP, productUP[0], productUP[1], productUP[2], 0.1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(VRP[0], VRP[1], VRP[2], (VRP[0] + VPN[0]), (VRP[1] + VPN[1]), (VRP[2] + VPN[2]), VUP[0], VUP[1], VUP[2]);

Здесь xProduct вычисляет перекрестное произведение 2 точек, давая точку, перпендикулярную обоим. В этом случае VPN и VUP. Я надеюсь, что кто-то может легко определить мою ошибку, так как я только начинаю с openGL, без необходимости публиковать всю программу.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]