我试图用iPhone/iPod加速来直接操作一个3D物体。
为此,我已经搜索了很多东西(欧拉角,四元数等等)。
我使用的是OpenSG,在这里我有一个3D环境,我想要操作一个特定的物体(只使用加速度计在所有可能的iPhone/iPod自由度上旋转)。
所以,我试着想出一个解决这个问题的方法,但是它仍然没有预期的结果,在一些角度上得到了一些奇怪的旋转。
有人能告诉我我做错了什么吗?或者,在不使用四元数的情况下,有更好的方法来做到这一点吗?
加速度变量是一个包含从iPhone/iPod中过滤的加速度计值的低通滤波器的Vec3f。
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更新我的场景节点。
发布于 2011-11-07 15:36:05
我也想做同样的事情,只是尝试了一下,我以前没有用过加速度计,这似乎是可能的。
问题是,如果你把你的iPhone放在一个桌子上,然后慢慢地旋转它,观察加速度计的输出,它基本上不会改变(一个重力下降)。如果你把它向上/向下倾斜在任何四个边上,你就会看到输出的变化。
换句话说,你知道你的桌面是倾斜的上/下或左/右,但你不知道你在旋转它。所以你可以把这个倾斜映射成一个三维物体的两个旋转。
你可能会使用指南针水平旋转,我不能尝试,因为我是原型在统一游戏引擎,它似乎还不支持指南针。
发布于 2010-07-12 20:38:30
布拉德·拉森( Brad )在撰写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]);但是不管这是否有帮助,我不能推荐这个博客文章足够的布拉德学到了一两课
编辑补充说,我可能误解了问题,但会保留在这里的帖子,因为它可能会帮助人们使用类似的关键字搜索。
https://stackoverflow.com/questions/3231235
复制相似问题