Пример iPhone GLGravity с использованием кватернионов

Пример GLGravity для iPhone, показывающий, как использовать акселерометр и OpenGL, страдает от проблемы с блокировкой Gimbal Lock. Мне интересно, доступен ли какой-либо код, использующий вращение кватерниона вместо углов Эйлера? Любая помощь будет принята с благодарностью, я долго борюсь с этим, но безуспешно ...


person Alexander Botov    schedule 21.03.2010    source источник
comment
Когда я проверял, было много споров о том, нужно ли разработчикам вообще беспокоиться о кватернионах. Наиболее распространенной альтернативой, которую я видел, было использование относительных систем отсчета, чтобы избежать блокировки кардана (казалось, компромисс заключался в том, что кватернионам требовалось немного меньше кода, но их было труднее понять - различия в производительности, вероятно, были незначительными). Я бы разместил ссылку, но она была для меня слишком длинной, и я не могу ее найти. :(   -  person FrustratedWithFormsDesigner    schedule 21.03.2010


Ответы (1)


Это помогает хорошо понять теорию вещей, прежде чем пытаться реализовать и использовать ее самостоятельно. Ниже приведены две вводные статьи об использовании кватернионов для вращения. Оба в первую очередь связаны с интерполяцией плавного вращения и предотвращением блокировки подвеса при накопленных поворотах:

Gamedev.net - Quaternion Powers

Гамасутра - вращение объектов с использованием кватернионов

Что касается реального кода, я бы посоветовал получить и использовать «сильную отраслевую» библиотеку векторных математических вычислений вместо того, чтобы накатывать свою собственную. Я предлагаю взять часть LinearMath проекта промежуточного программного обеспечения Bullet Physics. Физика пули и входящая в комплект линейная математическая библиотека разработаны некоторыми ведущими инженерами Sony и активно развиваются в течение многих лет. Он находится в свободном доступе, не ограничен какой-либо лицензией (лицензия Zlib) и используется профессиональными разработчиками игр по всему миру. Библиотека является кросс-платформенной / архитектурной и компилируется на все, от iPhone до PS3.

Библиотека предлагает Quaternion класс, который позволяет вам создавать кватернионы из углов Эйлера или из вращения вокруг произвольной оси, например используя setEulerZYX . После того, как у вас есть кватернионы, появляются встроенные функции для всех общих операций, применимых к ним; плюс, минус, муль, нормализация, slerp и многое другое.

Для фактического применения вашего последнего кватерниона к рендерингу OpenGL Transform позволяет построить матрицу из кватерниона. Класс преобразования, в свою очередь, включает функцию getOpenGLMatrix, который напрямую дает вам совместимую матрицу для передачи в OpenGL.

Библиотека также включает в себя множество других очень полезных классов и функций для матриц и векторов.

Скачайте последнюю версию Bullet dist из кода Google или просто возьмите часть LinearMath код прямо из Subversion, используя: svn checkout http://bullet.googlecode.com/svn/trunk/src/LinearMath

person tbone    schedule 27.03.2010
comment
Ух, спасибо за полезную информацию! Я потрачу некоторое время на изучение теории и постараюсь собрать что-нибудь полезное из библиотеки. Это очень полезные ссылки, после нескольких дней поиска я их не нашел. - person Alexander Botov; 27.03.2010