我正在开发一款增强现实应用程序,目前它想在表面上显示一个简单的立方体,并能够在空间中移动(旋转和位移)以便从所有不同角度查看立方体。由于我要求用户将iPhone放在想要放置立方体的表面上,然后按下按钮重置姿态,所以这里不需要校准相机的问题。
使用陀螺仪和Core Motion非常简单地找出相机的旋转情况。我是这样做的:
使用陀螺仪和Core Motion非常简单地找出相机的旋转情况。我是这样做的:
if (referenceAttitude != nil) {
[attitude multiplyByInverseOfAttitude:referenceAttitude];
}
CMRotationMatrix mat = attitude.rotationMatrix;
GLfloat rotMat[] = {
mat.m11, mat.m21, mat.m31, 0,
mat.m12, mat.m22, mat.m32, 0,
mat.m13, mat.m23, mat.m33, 0,
0, 0, 0, 1
};
glMultMatrixf(rotMat);
这个方法非常有效。 但是,当我尝试在加速过程中找到空间位移时,会出现更多问题。 使用Core Motion的Apple Teapot示例只是将加速度向量的x、y和z值添加到位置向量中。这样做(除了没有太多意义之外)会导致在加速后将对象返回到原始位置。(因为加速度从正变为负,或者反之) 他们是这样做的:
translation.x += userAcceleration.x;
translation.y += userAcceleration.y;
translation.z += userAcceleration.z;
我应该怎么样通过加速度(已知时间差)来找到位移?从其他答案中看来,似乎我需要进行两次积分,从加速度得出速度,再从速度得出位置。但是并没有任何代码示例,我认为这并不是必须的。此外,当iPhone还在平面上时,加速计值不为零(我认为存在一些噪声)。我应该过滤这些值多少?我是否应该过滤它们?