私は、(現時点では)単純な立方体を表面の上に表示し、空間内を移動して(回転と変位の両方で)立方体をさまざまな角度で見ることができるようにする拡張現実アプリケーションを開発しています。カメラのキャリブレーションの問題はここでは当てはまりません。キューブを配置したい面に 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;
ある瞬間の加速度から変位を求めるにはどうすればよいですか?(既知の時差あり)。他のいくつかの答えを見ると、加速度から速度を取得し、速度から位置を取得するには、2回積分する必要があるようです。しかし、コードにはまったく例がなく、本当に必要だとは思いません。また、iPhoneがまだ飛行機に乗っているとき、加速度計の値がnullにならないという問題があります(ノイズがあると思います)。これらの値をどの程度フィルタリングする必要がありますか? それらをまったくフィルタリングする必要がありますか?