我向根节点添加了一个摄像机节点(
SCNNode
),将该节点置于SCNSphere
的中心(0,0,0),现在它可以播放视频。现在我需要使用设备运动,当设备移动时,我需要旋转摄像机。不仅仅是旋转某个角度。(不只是设备移动,当我握着设备移动时,也被视为设备移动。因为我发现如果我使用
deviceMotion.attitude.roll
,摄像机节点只会在设备自行移动时移动,而不是在我围绕设备转动时移动)当设备位于(x1,y1,z1)位置时,摄像机节点会随着设备的移动而旋转,当设备再次位于(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;