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