質問

私はCMDeviceMotionと態度の四元数を使用して、ピッチ 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を超えてそれを回転させると、ヨー値は減少し始めます。

ピッチと同じように、yawの値を「-π、π」の範囲に入れることができますか?カメラを横に回転させることができるのは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イメージがマッピングされたHDRIイメージを持つ球の中にあります(これ POST)

カメラをスムーズに回転させるには:

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

これが他の誰かを助けることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top