0

我有一个 3D 场景,我在想象的球体中放置了几个对象,现在我想在设备运动中旋转它们。

我使用球坐标系并计算球体中的位置,如下所示:

x   = ρ * sin⁡ϕ * cos⁡θ
y   = ρ * sin⁡ϕ * sin⁡θ
z   = ρ * cos⁡ϕ. 

另外,我使用角度(从 0 到 2_M_PI)进行水平旋转(在 zx 中)

在此处输入图像描述

结果一切都很完美,直到我想使用运动矩阵中的四元数。

我可以提取诸如俯仰、偏航、滚动等值

    GLKQuaternion quat = GLKQuaternionMakeWithMatrix4(motionMatrix);
    CGFloat adjRoll = atan2(2 * (quat.y * quat.w - quat.x * quat.z), 1 - 2 * quat.y * quat.y - 2 * quat.z * quat.z);
    CGFloat adjPitch = atan2(2 * (quat.x * quat.w + quat.y * quat.z), 1 - 2 * quat.x * quat.x - 2 * quat.z * quat.z);
    CGFloat adjYaw = asin(2 * quat.x * quat.y + 2 * quat.w * quat.z);

或者也试试

    CMAttitude *currentAttitude = [MotionDataProvider sharedProvider].attitude; //from CoreMotion
    CGFloat roll = currentAttitude.roll; 
    CGFloat pitch = currentAttitude.pitch;
    CGFloat yaw = currentAttitude.yaw; 

*对于这种方法,我得到的值是不同的

问题是俯仰、偏航、滚动不适用于我的方案。

如何将俯仰、偏航、滚动或四元数或运动矩阵转换为我的旋转模型所需的 xz 角度?我是在做正确的事情,还是错过了一些里程碑?

如何从CoreMotion接收到的旋转矩阵/四元数围绕y轴旋转,将当前z和x转换为0,因此显示的对象只能围绕y轴旋转?

顺便说一句,我使用 iOS,但我想这在这里并不重要。

4

0 回答 0