用滚动/俯仰/偏航旋转矩阵

时间:2013-02-02 21:43:42

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

必须有一种方法可以通过从xyzheading创建单个矩阵来简化转换,而不会失去准确性...... < / p>

UPD: Found the problem! 任何人都可以解释如何将解决方案应用到我的矩阵中吗?

1 个答案:

答案 0 :(得分:0)

这应该澄清你需要做什么:http://tutorialrandom.blogspot.com/2012/08/how-to-rotate-in-3d-using-opengl-proper.html这将解决你的万向节锁定问题。

垂直拿着手机时的随机值,我不确定。也许可以转换方向向量,使其值始终为正值或其他值。