Я пытаюсь использовать ускорение 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 .