cmdevicemotionの問題に関する問題の問題
-
27-10-2019 - |
質問
私はコアの動きで最初のプレイをしていて、問題を打っていますが、何が起こっているのかわかりません。それは簡単な問題になると確信しています。ここにいくつかのコードがあります:
.hファイル
#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface TempVC : UIViewController {
CMMotionManager *motionManager;
CMAttitude *referenceAttitude;
CMAttitude *attitude;
}
- (void)updateData;
@end
.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));
}
このコードは、何がうまくいかないかを実際に示すことなくクラッシュします。コメントしたら
[attitude multiplyByInverseOfAttitude:referenceAttitude];
すべてが正常に機能しますか?参照を間違えたことはありますか?
解決
更新を開始する前に、CmmotionManagerのDevicemotionプロパティにアクセスします。そこには、その時点ではまだゼロになる参照の声を保存します。 updatedataが数ミリ後に呼ばれる場合 [attitude multiplyByInverseOfAttitude:referenceAttitude];
失敗します。
代わりに、updatedataの最初の呼び出しで参照型を設定してみてください。それが機能するはずです。
所属していません StackOverflow