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

使用iPhone/iPod Touch加速旋转3D对象,iphone,3d,accelerometer,Iphone,3d,Accelerometer,我正在尝试使用iPhone/iPod加速来直接操纵3D对象 为此,我搜索了很多东西(欧拉角、四元数等) 我使用的是OpenSG,在那里我有一个3D环境,想要操纵一个特定的对象(只需使用加速计在所有可能的iPhone/iPod自由度中旋转) 所以,我试图找出解决这个问题的方法,但仍然没有得到预期的结果,并且在某些角度得到了一些奇怪的旋转 有人能告诉我我做错了什么吗?或者,有没有更好的方法不使用四元数 加速度变量是一个Vec3f,包含通过低通滤波器过滤的iPhone/iPod中的加速计值 accel

我正在尝试使用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);

在这段代码之后,我使用四元数更新了我的场景节点。曾经非常棒的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 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]);
但无论这是否有用,我都无法充分推荐这篇博客文章


编辑补充说,我可能误读了这个问题,但将把帖子保留在这里,因为它可能会帮助人们使用类似的关键词进行搜索。

我想做完全相同的事情,只是尝试了一下,我以前没有玩过加速计,似乎这应该是可能的

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

换句话说,你知道你的桌面在上/下或左/右倾斜,但你看不出你在旋转它。因此,可以将此倾斜映射到3D对象的两个旋转


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

我想做完全相同的事情,只是尝试了一下,我以前没有玩过加速计,这似乎应该是可能的

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

换句话说,你知道你的桌面在上/下或左/右倾斜,但你看不出你在旋转它。因此,可以将此倾斜映射到3D对象的两个旋转


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

我将参考向量更改为(0,-1,0),但我认为这没有什么区别,似乎在做我需要的事情。但当角度为180度时,对象在一个轴上进行一些旋转,并返回到相同的位置。我怎样才能修复这个奇怪的旋转?我想现在的问题是在180度角的acos中。如果我可以使用atan2,它可能会被修复。我一直在复习我的三角学,但还没有找到一种方法来做这个。。。有人知道如何解决这个问题吗?或者,有没有更好的方法来实现这一点?我正在使用的似乎是某种万向节锁。但那是不应该发生的,对吗?有人能给我一个解决这个问题的方法吗?我把参考向量改成了(0,-1,0),但我认为这没什么区别,似乎在做我需要的事情。但当角度为180度时,对象在一个轴上进行一些旋转,并返回到相同的位置。我怎样才能修复这个奇怪的旋转?我想现在的问题是在180度角的acos中。如果我可以使用atan2,它可能会被修复。我一直在复习我的三角学,但还没有找到一种方法来做这个。。。有人知道如何解决这个问题吗?或者,有没有更好的方法来实现这一点?我正在使用的似乎是某种万向节锁。但那是不应该发生的,对吗?有谁能给我一个解决这个问题的方法吗?+1感谢他说“永远精彩的布拉德·拉森”。他太棒了。来自平行世界的知识“实体”+感谢你说“永远精彩的布拉德·拉森”。他太棒了。来自平行世界的知识“实体”!