cameranode tourne comme un appareil iOS en mouvement

C'est un projet de lecteur video à 360 degrés.

J'ajoute un cameranode ( SCNNode ) à un rootnode, le cameranode a été mis au centre (0,0,0) du SCNSphere , il peut lire la video maintenant.

Maintenant, je dois utiliser devicemotion. Je dois faire pivoter la camera lorsque l'appareil bouge. Pas seulement faire pivoter un certain angle. (Pas seulement le déplacement de l'appareil, Quand je tiens un appareil, mon regard mobile quand l'appareil bouge … parce que je trouve que si j'utilise deviceMotion.attitude.roll , le cameranode ne bouge que lorsque l'appareil bouge tout seul, pas quand je tourne autour avec dispositif)

Lorsque l'appareil est en position (x1, y1, z1), le cameranode tourne en même time que l'appareil et lorsque l'appareil est en position (x1, y1, z1), la vue doit être la même que celle que nous avons laissée .

Voici ce que j'ai fait:

 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"); } 

Le calcul pourrait être faux, je ne sais pas pourquoi je splitais 60, mais il semble que la valeur la plus proche dont j'ai besoin quand j'utilise [self.cameraNode runAction:[SCNAction rotateByX:-tempY y:tempX z:tempZ duration:0]];

Voici le problème?

  1. queldatatables dois-je utiliser?

CMGyroData ou CMDeviceMotion . Si vous utilisez CMDeviceMotion , quelle valeur spécifique dois-je utiliser? deviceMotion.attitude , deviceMotion.attitude.quaternion , deviceMotion.gravity

  1. quelle est la bonne méthode pour faire pivoter un cameranode? Il y a beaucoup de methods, je ne suis pas sûr.

+ (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;

Le mouvement du périphérique est optimal, car il relie plusieurs capteurs et fusionne datatables de manière significative. Il est également préférable d'éviter d'utiliser des angles euler, car ils souffrent de ce qui est connu sous le nom de verrou de cardan. Au lieu de cela, utilisez quaternions et définissez votre orientation de la camera avec eux.

J'ai créé une extension de class Swift pour CMDeviceMotion qui vous permettra de déterminer ce que l'appareil regarde (pour toute orientation de l'écran).

De là, il est facile de faire pivoter votre appareil photo. Tout d'abord, configurez le mouvement de votre appareil (dans la vue apparaissait, ou un autre endroit approprié):

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

Gérez ensuite ces mises à jour dans votre implémentation deviceDidMove, en utilisant l'extension CMDeviceMotion mentionnée précédemment:

 func deviceDidMove(motion: CMDeviceMotion?, error: NSError?) { if let motion = motion { yourCameraNode.orientation = motion.gaze(atOrientation: UIApplication.sharedApplication().statusBarOrientation) } } 

Et maintenant, votre camera devrait suivre l'orientation de votre appareil dans l'espace.