我将一个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) } }
而现在,您的相机应该在太空中遵循您的设备方向.