使用iPhone / iPod Touch加速旋转3D对象

时间:2010-07-12 18:43:46

标签: iphone 3d accelerometer

我正在尝试使用iPhone / iPod加速直接操作3D对象。

为此,我一直在寻找很多东西(欧拉角,四元数等)。

我正在使用OpenSG,我有一个3D环境,想要操纵某个对象(只使用加速度计旋转所有可能的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 个答案:

答案 0 :(得分:3)

我想做同样的事情,只是尝试过,我之前没有使用过加速度计,看起来应该是可能的。

问题在于,如果你将iPhone放在桌子上,然后慢慢旋转并观察加速度计的输出,它基本上不会改变(一个重力下降)。如果在四个边缘中的任何一个上向/向下倾斜,您将看到输出变化。

换句话说,你知道你的桌面倾斜顶部/底部或左/右,但你无法分辨你正在旋转它。因此,您可以将此倾斜映射到3D对象的两个旋转。

你可能会使用指南针进行水平旋转,我无法尝试,因为我在Unity游戏引擎中进行了原型设计,但它似乎还不支持指南针。

答案 1 :(得分:1)

精彩的布拉德·拉尔森(Brad Larson)在编写Moleculs应用程序时,对他最初的3D观众体验进行了精彩描述。

他的旋转方法如下:

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]);

但无论这是否有用,我都不能推荐此博客条目Brad learns a lesson or two

编辑添加我可能误解了这个问题,但会保留这里的帖子,因为它可能会帮助人们搜索类似的关键字。