我正在尝试使用iPhone相机和从陀螺仪传感器接收的数据来模拟OpenGL ES中的逼真相机。基本上当我从陀螺仪接收滚动,俯仰和偏转旋转时,我将它们传递给openGL上下文,并通过减去每个角度旋转场景中的每个对象,模拟相机旋转。
CC3GLMatrix *modelView = [CC3GLMatrix matrix]; // cocos3D matrix
[modelView populateFromRotation:CC3VectorMake(-pitch, -roll, -yaw)];
[modelView translateBy:CC3VectorMake(0, 0, -distance)];
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);
它运作得很好。问题是iPhone的坐标系随着手机一起旋转,所以例如滚动总是“击中”手机的两侧。因此,当我向左/右添加另一个对象时,它会成为iPhone坐标系的左/右,而不是世界坐标系。
第一张图片没有旋转,向前看。
但是当我将手机向右旋转大约30-40度时,很明显物体的两侧不再平行。
第二个对象的旋转:
CC3GLMatrix *modelView2 = [CC3GLMatrix matrix];
[modelView2 populateFromRotation:CC3VectorMake(-pitch, -roll-30, -yaw)];
[modelView2 translateBy:CC3VectorMake(0, 0, -distance)];
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView2.glMatrix);
由于手机向右倾斜,物体位置也是如此,物体位置的唯一差异是-30 in roll,意味着坐标系统与手机绑定并随手机一起旋转。
有没有办法将这些坐标转换为世界坐标或任何其他方式来旋转现实世界中的整个场景?