Matrix 使用横摇/俯仰/偏航旋转矩阵

Matrix 使用横摇/俯仰/偏航旋转矩阵,matrix,opengl-es-2.0,transformation,glkit,Matrix,Opengl Es 2.0,Transformation,Glkit,我想对我的模型视图矩阵应用一些真实世界的转换(从加速度计/陀螺仪/指南针)。这样: modelViewMatrix = GLKMatrix4MakeLookAt(cam.x, cam.y, cam.z, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f); GLKVector3 v = GLKVector3Normalize(x,

我想对我的模型视图矩阵应用一些真实世界的转换(从加速度计/陀螺仪/指南针)。这样:

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
标题创建一个矩阵,而不损失准确性


UPD:有人能解释一下如何将解决方案应用到我的矩阵中吗?

这应该说明你需要做什么:这将解决你的万向节锁问题

至于竖直拿着手机时的随机值,我不确定。可以变换方向向量,使其值始终为正值或其他值