モデル ビュー マトリックスに実世界の変換 (加速度計/ジャイロスコープ/コンパスから) を適用したいと考えています。こちらです:
modelViewMatrix = GLKMatrix4MakeLookAt(cam.x, cam.y, cam.z,
0.f, 0.f, 0.f,
0.f, 1.f, 0.f);
GLKVector3 v = GLKVector3Normalize(x, y, z); // accelerometer + gyro
float roll = asinf(-v.x);
float pitch = atan2f(v.y, -v.z);
float yaw = GLKMathDegreesToRadians(heading); // compass
GLKMatrix4 m = GLKMatrix4Identity;
m = GLKMatrix4RotateX(m, pitch);
m = GLKMatrix4RotateY(m, roll);
m = GLKMatrix4RotateZ(m, yaw);
modelViewMatrix = GLKMatrix4Multiply(m, m_modelViewMatrix);
できます。しかし問題がある。電話が「カメラ」(横向き)の向きにある場合、「スライドしてロックを解除」は正確に垂直であり、yとzはどちらもゼロに非常に近く、頻繁に符号が変わります。したがって、atan2() はいくつかの「ランダムな」値を返し、シーンは水平面内を移動しています...
x
、y
、z
、から単一の行列を作成することによりheading
、精度を失うことなく遷移を単純化する方法が必要です...
UPD:問題が見つかりました! 私のマトリックスにソリューションを適用する方法を誰か説明できますか?