簡體   English   中英

iPhone 5s的偏航范圍

[英]Yaw range on iPhone 5s

我正在使用CMDeviceMotion和姿態的四元數來獲取俯仰偏航值,然后將其應用於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);
}

結果:

像這樣旋轉相機可以讓您環顧四周的天空盒,就像通常通過設備的后置相機環顧世界一樣。 我CC3Camera對象是映射給它的HDRI圖像,在里面一球內(見這個職位)。

平穩旋轉相機:

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

希望這也能幫助其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM