Question

Je prends mon premier jeu autour avec Core Motion et ont frappé un problème et je ne peux pas travailler ce qui se passe. Je suis sûr qu'il va être un problème simple. Voici un code:

.h

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>

@interface TempVC : UIViewController {
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
CMAttitude *attitude;
}
- (void)updateData;
@end

fichier .m

#import "TempVC.h"
#define DEGREES(radians) (radians / M_PI * 180.0)
@implementation TempVC

- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor brownColor];

motionManager = [[CMMotionManager alloc] init]; 
referenceAttitude = nil;

CMDeviceMotion *dm = motionManager.deviceMotion;
attitude = dm.attitude;
referenceAttitude = [attitude retain];

motionManager.deviceMotionUpdateInterval = 0.1;
[motionManager startDeviceMotionUpdates];

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateData) userInfo:nil repeats:YES];

}

- (void)updateData
{
attitude = motionManager.deviceMotion.attitude;
[attitude multiplyByInverseOfAttitude:referenceAttitude];
NSLog(@"\n Roll: %.0f\n Pitch: %.0f\n Yaw: %.0f",DEGREES(attitude.roll), DEGREES(attitude.pitch), DEGREES(attitude.yaw));
}

Ce code se bloque sans réelle indication de ce qui va mal. Si je commente sur

[attitude multiplyByInverseOfAttitude:referenceAttitude];

Tout fonctionne très bien ??? Ai-je mis en œuvre le mauvais de référence?

Était-ce utile?

La solution

Vous accédez la propriété deviceMotion de CMMotionManager avant les mises à jour à partir. Il vous stockez votre referenceAttitude qui sera toujours nul à ce moment-là. Lorsque updateData est appelé quelques millisecondes plus tard [attitude multiplyByInverseOfAttitude:referenceAttitude]; échouera.

Essayez plutôt de régler le referenceAttitude sur le premier appel de updateData et cela devrait fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top