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() 返回一些“随机”值,并且场景在水平面中移动......

x必须有一种方法可以通过从、y、和中创建单个矩阵来简化转换z,并且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 回答