13

360 度ビデオ プレーヤー プロジェクトです。

ルートノードに cameranode( SCNNode) を追加すると、 cameranode が の中心(0,0,0) に配置され、SCNSphere動画を再生できるようになりました。

次に、devicemotion を使用する必要があります。デバイスが動いたときにカメラを回転させる必要があります。特定の角度を回転させるだけではありません。(デバイスの移動だけでなく、デバイスを持っているとき、私の移動はデバイスが動いていると見なします。 を使用するdeviceMotion.attitude.rollと、カメラノードは、デバイスを持って周回するときではなく、デバイス自体が移動するときにのみ移動することがわかりました)

デバイスが (x1,y1,z1) の位置にある場合、cameranode はデバイスの移動に合わせて回転し、デバイスが再び (x1,y1,z1) の位置にある場合、ビューは最後に残したものと同じになります。 .

これが私がやったことです:

if (self.motionManager.gyroAvailable) {
        self.motionManager.gyroUpdateInterval = 1.0/60.0;
        [self.motionManager startGyroUpdatesToQueue:self.queue withHandler:^(CMGyroData *gyroData, NSError *error){
            if (error) {
                [self.motionManager stopGyroUpdates];
                NSLog(@"Gyroscope encountered error:%@",error);
            }else {
                CGFloat tempX = 0;
                CGFloat tempY = 0;
                CGFloat tempZ = 0;
                if ((fabs(gyroData.rotationRate.y)/60) > 0.002) {
                    tempY = gyroData.rotationRate.y/60;
                }
                tempX = gyroData.rotationRate.x/60;
                tempZ = gyroData.rotationRate.z/60;
                [self.cameraNode runAction:[SCNAction rotateByX:-tempY y:tempX z:tempZ duration:0]];
            }
        }];
    }else {
        NSLog(@"This device has no gyroscope");
    }

計算が間違っている可能性があります。なぜ 60 を割るのかわかりませんが、使用するときに必要な最も近い値のようです[self.cameraNode runAction:[SCNAction rotateByX:-tempY y:tempX z:tempZ duration:0]];

ここに問題がありますか?

  1. どのデータを使用すればよいですか?

CMGyroDataまたはCMDeviceMotion。を使用する場合CMDeviceMotion、どの特定の値を使用すればよいですか? deviceMotion.attitudedeviceMotion.attitude.quaterniondeviceMotion.gravity

  1. cameranode を回転させる正しい方法はどれですか? 方法はたくさんありますが、よくわかりません。

+ (SCNAction *)rotateByX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle duration:(NSTimeInterval)duration;

+ (SCNAction *)rotateToX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle duration:(NSTimeInterval)duration;

4

3 に答える 3