0

モデル ビュー マトリックスに実世界の変換 (加速度計/ジャイロスコープ/コンパスから) を適用したいと考えています。こちらです:

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);

できます。しかし問題がある。電話が「カメラ」(横向き)の向きにある場合、「スライドしてロックを解除」は正確に垂直であり、yzはどちらもゼロに非常に近く、頻繁に符号が変わります。したがって、atan2() はいくつかの「ランダムな」値を返し、シーンは水平面内を移動しています...

xyz、から単一の行列を作成することによりheading、精度を失うことなく遷移を単純化する方法が必要です...

UPD:問題が見つかりました! 私のマトリックスにソリューションを適用する方法を誰か説明できますか?

4

1 に答える 1

0

これにより、何をする必要があるかが明確になります: http://tutorialrandom.blogspot.com/2012/08/how-to-rotate-in-3d-using-opengl-proper.htmlこれにより、ジンバル ロックの問題が解決されます。

携帯電話を縦に持ったときのランダム値については、よくわかりません。方向ベクトルを変換して、その値が常に正か何かになるようにするかもしれません。

于 2013-02-04T07:22:17.617 に答える