【发布时间】:2014-07-31 09:43:17
【问题描述】:
我正在使用 CMDeviceMotion 和姿态的四元数来获得 pitch 和 yaw 值,然后将它们应用于 Cocos3D 场景中的 CC3Camera 以旋转相机.
#define RadiansToDegrees(x) ((180 / M_PI) * x)
- (void)initializeScene
{
//...
CC3Camera *cam = [CC3Camera nodeWithName:@"Camera"];
cam.location = cc3v(0, 10, 0.0001);
cam.targetLocation = cc3v(0, 0, 0);
_cameraBoom = [CC3Node nodeWithName:@"CameraBoom"];
_cameraBoom.location = cc3v(0, 0, 0);
[_cameraBoom addChild:cam];
[self addChild:_cameraBoom];
[self setActiveCamera:cam];
_cameraBoom.rotation = cc3v(0, 90, 0);
//...
_motionManager = [[CMMotionManager alloc] init];
_referenceAttitude = nil;
_initialCameraRotation = _cameraBoom.rotation;
[self enableMotion];
}
- (void)enableMotion
{
CMDeviceMotion *deviceMotion = _motionManager.deviceMotion;
_referenceAttitude = deviceMotion.attitude;
_initialCameraRotation = _cameraBoom.rotation;
[_motionManager startDeviceMotionUpdates];
if (!_gyroTimer) {
_gyroTimer = [NSTimer scheduledTimerWithTimeInterval:1 / 30.0
target:self
selector:@selector(doGyroUpdate)
userInfo:nil
repeats:YES];
}
}
- (void)doGyroUpdate
{
CMDeviceMotion *deviceMotion = _motionManager.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
if (_referenceAttitude != nil) {
[attitude multiplyByInverseOfAttitude:_referenceAttitude];
}
CMQuaternion quat = attitude.quaternion;
double pitch = RadiansToDegrees(atan2(2 * (quat.x * quat.w + quat.y * quat.z), 1 - 2 * (quat.x * quat.x + quat.z * quat.z)));
double yaw = RadiansToDegrees(asin(2 * (quat.x * quat.y + quat.w * quat.z)));
_cameraBoom.rotation = CC3VectorAdd(_initialCameraRotation, cc3v(pitch, yaw, 0));
}
音高在 [-π, π] 范围内。当设备朝上时,pitch = 0 并且当我从桌子上取出设备并指向它拍照时它变为 π/2(人像模式)。 [-π, π] 范围使我能够将设备旋转 360°。面朝下(即设备倒置)时,间距值为 π。
偏航范围只有[-π/2, π/2]。它从 0 开始,当我将设备向左旋转时变为 π/2。但是如果我将它旋转超过 π/2,偏航值就会开始减小。
我可以像俯仰一样获得范围 [-π, π] 内的偏航值吗? 能够将相机侧向旋转 180°(向左)会更有用和右侧,以获得完整的 360° 视图)而不是垂直翻转设备以使用相机向后看。
【问题讨论】:
标签: ios rotation quaternions motion pitch