Пример iPhone GLGravity с использованием кватернионов - PullRequest
4 голосов
/ 21 марта 2010

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

1 Ответ

3 голосов
/ 27 марта 2010

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

Gamedev.net - Quaternion Powers

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

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

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

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

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

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

...