iPhone 5s上的偏航范围
-
21-12-2019 - |
题
我正在使用cmdevicemotion和态度的四元数来获取 titch 和 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));
}
.
间距在范围内[-π,π]。当设备面向音高= 0时,当我从表中取出设备并指向图片(纵向模式)时,它变为π/ 2。 [-π,π]范围使我能够旋转装置360°。当面对(即设备颠倒)时,音调值是π。
偏航范围仅是[-π/ 2,π/ 2]。当我将设备旋转到左侧时,它从0开始,然后进入π/ 2。但是如果我超越π/ 2,则偏航值开始减少。
我可以获得范围[-π,π]的偏航值,就像音调?能够侧向将相机侧向旋转180°(向左右侧,要有一个完整的360°视图)而不是将器件垂直翻转以与相机一起看。
解决方案
这是我最终用内置函数所做的方式如何:
- (void)doGyroUpdate
{
CMDeviceMotion *deviceMotion = _motionManager.deviceMotion;
CMAttitude *attitude = deviceMotion.attitude;
if (_referenceAttitude != nil) {
[attitude multiplyByInverseOfAttitude:_referenceAttitude];
}
CMQuaternion quat = attitude.quaternion;
CC3Quaternion cc3Quat = CC3QuaternionMake(quat.x, quat.y, quat.z, quat.w);
CC3Vector rot = CC3RotationFromQuaternion(cc3Quat);
_cameraBoom.rotation = cc3v(-rot.x, -rot.z, rot.y);
}
.
结果:
旋转相机,使您能够在Skybox上环顾四周,仿佛通常通过设备的背部相机查看世界。我的cc3camera对象位于一个球体内,映射到它的hdri映像,在内部(参见这个帖子)。
要平滑旋转相机:
[_cameraBoom runAction:[CC3ActionRotateTo actionWithDuration:0.15 rotateTo:cc3v(-rot.x, -rot.z, rot.y)]];
.
希望这也有助于别人。
不隶属于 StackOverflow