随着iOS设备移动,cameranode旋转

是360度视频播放器项目.

我将一个cameranode(SCNNode)添加到根节点,cameranode放在SCNSphere的中心(0,0),现在可以播放视频.

现在我必须使用devicemotion.设备移动时,我需要旋转相机.不只是旋转一定的角度. (不只是设备移动,当我拿着一个设备,我的移动的方式,因为设备移动,因为我发现如果我使用deviceMotion.attitude.roll,手持设备只有在设备移动时才会移动,而不是当我环绕着设备)

当设备位于(x1,y1,z1)位置时,摄像机将随设备移动而旋转,当位于(x1,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] ].

这是问题?

>我应该使用哪些数据?

CMGyroData或CMDeviceMotion.如果使用CMDeviceMotion,我应该使用哪个具体值? deviceMotion.attitude,deviceMotion.attitude.quaternion,deviceMotion.gravity

>这是旋转摄像师的正确方法?有很多方法,我不知道.

(SCNAction *)rotateByX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle持续时间:(NSTimeInterval)duration;

(SCNAction *)rotateToX:(CGFloat)xAngle y:(CGFloat)yAngle z:(CGFloat)zAngle持续时间:(NSTimeInterval)duration;

解决方法

设备运动是最好的,因为它连接在多个传感器中,并以有意义的方式将数据融合在一起.最好避免使用欧拉角,因为它们受到所谓的万向节锁的影响.相反,使用四元数,并设置您的相机方向.

我创建了a Swift class extension for CMDeviceMotion,让您确定设备正在查看(针对屏幕的任何方向).

从那里,直接旋转相机.首先,设置您的设备动作(在视图中出现或其他适当的位置):

if motionManager.deviceMotionAvailable {

    motionManager.deviceMotionUpdateInterval = 0.017
    motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue(),withHandler: deviceDidMove)
}

然后使用前面提到的CMDeviceMotion扩展来处理deviceDidMove实现中的这些更新:

func deviceDidMove(motion: CMDeviceMotion?,error: NSError?) {

    if let motion = motion {

        yourCameraNode.orientation = motion.gaze(atOrientation: UIApplication.sharedApplication().statusBarOrientation)
    }
}

而现在,您的相机应该在太空中遵循您的设备方向.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...