【问题标题】:Yaw range on iPhone 5siPhone 5s 的偏航范围
【发布时间】:2014-07-31 09:43:17
【问题描述】:

我正在使用 CMDeviceMotion 和姿态的四元数来获得 pitchyaw 值,然后将它们应用于 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


    【解决方案1】:

    这是我最终使用内置函数的方式:

    - (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);
    }
    

    结果:

    像这样旋转摄像头可以让您环顾天空盒,就像您通常通过设备的后置摄像头看世界一样。我的 CC3Camera 对象位于一个球体内,内部映射了一张 HDRi 图像(请参阅this 帖子)。

    平滑旋转相机:

    [_cameraBoom runAction:[CC3ActionRotateTo actionWithDuration:0.15 rotateTo:cc3v(-rot.x, -rot.z, rot.y)]];
    

    希望这对其他人也有帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2013-12-24
      • 1970-01-01
      • 2020-11-06
      • 2011-02-10
      相关资源
      最近更新 更多