我正在开发一个增强现实应用程序,(目前)想要在表面上显示一个简单的立方体,并且能够在空间中移动(旋转和位移)以从所有不同的角度查看立方体。校准相机的问题在这里不适用,因为我要求用户将 iPhone 放置在他想要放置立方体的表面上,然后按下按钮重置姿态。
使用陀螺仪和 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仍在飞机上时,加速度计值不为空(我认为有一些噪音)。我应该对这些值进行多少过滤?我应该过滤它们吗?