我想将一些真实世界的转换(从加速度计/陀螺仪/指南针)应用到我的模型视图矩阵。这边走:
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:发现问题!谁能解释如何将解决方案应用于我的矩阵?