我想将一些真实世界的转换(从加速度计/陀螺仪/指南针)应用到我的模型视图矩阵。这样:
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
创建单个矩阵来简化转换,而不会失去准确性...... < / p>
UPD: Found the problem! 任何人都可以解释如何将解决方案应用到我的矩阵中吗?
答案 0 :(得分:0)
这应该澄清你需要做什么:http://tutorialrandom.blogspot.com/2012/08/how-to-rotate-in-3d-using-opengl-proper.html这将解决你的万向节锁定问题。
垂直拿着手机时的随机值,我不确定。也许可以转换方向向量,使其值始终为正值或其他值。