【发布时间】:2015-10-27 16:02:49
【问题描述】:
这是 360 度视频播放器项目。
我添加一个cameranode(SCNNode)到一个rootnode,cameranode被放在SCNSphere的中心(0,0,0),它现在可以播放视频了。
现在我必须使用 devicemotion。当设备移动时,我需要旋转相机。不只是旋转某个角度。 (不只是设备移动,当我拿着设备时,我的移动被认为是设备移动。因为我发现如果我使用deviceMotion.attitude.roll,cameranode只会在设备自行移动时移动,而不是当我带着设备转圈时)
当设备位于 (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]]; 时,它似乎是我需要的最接近的值
问题出在哪里?
- 我应该使用哪些数据?
CMGyroData 或 CMDeviceMotion。如果使用CMDeviceMotion,我应该使用哪个具体值? deviceMotion.attitude、deviceMotion.attitude.quaternion、deviceMotion.gravity
- 旋转相机节点的正确方法是什么?方法很多,我不确定。
+ (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;
【问题讨论】:
标签: ios scenekit cmmotionmanager scnnode