Я заметил странное поведение в моей программе 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, без необходимости публиковать всю программу.
Задача ещё не решена.