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