我正在制作类似于增强现实应用程序的东西,其中我有一个 OpenGL 场景,无论 iOS 设备如何移动,我都希望它与重力保持一致。我以为我用 CMDeviceMotion.attitude.pitch 设置得很好,直到我发现将 iPhone 侧向倾斜会与那个数字混淆。因此,我从 pARk* 示例中获取了一些代码,现在我正在尝试隔离围绕垂直通道的旋转。我正在绘制的场景并不关心用户面向哪个方向,这些人物总是会被绘制到离观察者一定距离的地方。我认为当我计算出垂直轴旋转分量时,我可以将其反转并将其从旋转矩阵中相乘,因此当用户改变方向时保持 OpenGL 图形静止。
这是我的代码:
CMDeviceMotion *d = motionManager.deviceMotion;
if (d != nil) {
CMRotationMatrix r = d.attitude.rotationMatrix;
transformFromCMRotationMatrix(cameraTransform, &r);
mat4f_t projectionCameraTransform;
multiplyMatrixAndMatrix(projectionCameraTransform, projectionTransform, cameraTransform);
GLKMatrix4 rotMatrix = GLKMatrix4Make(projectionCameraTransform[0],
projectionCameraTransform[1],
projectionCameraTransform[2],
projectionCameraTransform[3],
projectionCameraTransform[4],
projectionCameraTransform[5],
projectionCameraTransform[6],
projectionCameraTransform[7],
projectionCameraTransform[8],
projectionCameraTransform[9],
projectionCameraTransform[10],
projectionCameraTransform[11],
projectionCameraTransform[12],
projectionCameraTransform[13],
projectionCameraTransform[14],
projectionCameraTransform[15]);
}
然后我像往常一样在 OpenGL 中使用 rotMatrix。
想法、建议?提前致谢。
*pARk 示例代码在真实空间中设置了几个点,计算出用户的位置和这些点的相对方向,并将它们绘制在屏幕上,使它们看起来漂浮在指向其位置的地平线上。