我有一个3D场景,在假想的球体中我放置了很少的物体,现在我想在设备运动中旋转它们。
我使用球面坐标系并计算如下所示的球体位置:
x = ρ * sinϕ * cosθ
y = ρ * sinϕ * sinθ
z = ρ * cosϕ.
另外,我使用角度(从0到2_M_PI)水平旋转(在z-x中)
结果一切都很完美,直到我想从运动矩阵中使用四元数。
我可以提取音高,偏航,滚动
等值 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;
*我得到的值对于这种方法是不同的
问题是,俯仰,偏航,滚动不适用于我的方案。
如何在我的旋转模型中将俯仰,偏航,滚动或四元数或运动矩阵转换为x-z中所需的角度?我是否正确地做事,或者我错过了一些里程碑点?
如何从CoreMotion接收到的旋转矩阵/四元数绕y轴旋转,将当前z和x转换为0,这样显示的对象只能围绕y轴旋转?
顺便说一句,我使用的是iOS,但我想这里并不重要。