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