Использование ускорения iPhone / iPod Touch для вращения 3D-объекта - PullRequest
0 голосов
/ 12 июля 2010

Я пытаюсь использовать ускорение iPhone / iPod для непосредственного управления 3D-объектом.

Для этого я искал много вещей (углы Эйлера, кватернионы и т. Д.).

Я использую OpenSG, где у меня есть трехмерная среда и я хочу манипулировать определенным объектом (просто вращая все возможные степени свободы iPhone / iPod, используя только акселерометр).

Итак, я попытался выяснитьэто решение этой проблемы, но оно все еще не дает ожидаемого результата и вызывает некоторые странные повороты в некоторых ракурсах.

Может кто-нибудь сказать мне, что я делаю неправильно?Или есть ли лучший способ сделать это без использования кватернионов?

Переменная ускорение - это Vec3f, содержащий значения акселерометра с iPhone / iPod, отфильтрованные с помощью фильтра нижних частот.

acceleration.normalize();
Vec3f reference = OSG::Vec3f(0, 0, 1);
OSG::Vec3f axis = acceleration.cross( reference );
angle = acos( acceleration.dot( reference ) );
OSG::Quaternion quat;
quat.setValueAsAxisRad(axis, angle);

После этого кода я обновляю свой узел сцены, используя кватернион quat .

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Я хотел сделать то же самое и просто попробовал, я не играл с акселерометром раньше, и казалось, что это возможно.

Проблема в том, что если вы установите свой iPhone на стол, а затем медленно вращаете его и наблюдаете за работой акселерометра, он в основном не меняется (на одну гравитацию вниз). Если вы наклоните его вверх / вниз по любому из четырех краев, вы увидите изменение выходного сигнала.

Другими словами, вы знаете, что столешница наклоняется сверху / снизу или влево / вправо, но вы не можете сказать, что вращаете ее. Таким образом, вы можете сопоставить этот наклон двум поворотам трехмерного объекта.

Вероятно, вы могли бы использовать компас для горизонтального вращения, я не мог попробовать, потому что я создавал прототипы в Unity Game Engine, и он пока не поддерживает компас.

1 голос
/ 13 июля 2010

Замечательный Брэд Ларсон опубликовал отличное описание своего первоначального опыта просмотра в 3D, когда писал свое приложение для Moleculs.

Его метод вращения был достигнут следующим образом:

GLfloat currentModelViewMatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix);   
glRotatef(xRotation, currentModelViewMatrix[1], currentModelViewMatrix[5], currentModelViewMatrix[9]);
glGetFloatv(GL_MODELVIEW_MATRIX, currentModelViewMatrix);
glRotatef(yRotation, currentModelViewMatrix[0], currentModelViewMatrix[4], currentModelViewMatrix[8]);

но полезно ли это или нет, я не могу рекомендовать эту запись в блоге достаточно Брэд изучает один или два урока

Редактирование, чтобы добавить, что я, возможно, неправильно прочитал вопрос, но сохраню пост здесь, поскольку он, вероятно, поможет людям, выполняющим поиск по похожим ключевым словам.

...