1

我正在尝试使用 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 坐标系随手机旋转,因此例如滚动总是“撞击”手机的侧面。所以当我添加另一个对象时,左/右的 alpha 度,它成为 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,这意味着坐标系与手机绑定并随手机旋转。

有没有办法将这些坐标转换为世界坐标或任何其他方式来旋转现实世界中的整个场景?

4

0 回答 0