
懸浮的指南針.gif
新建CLLocationManager并設(shè)置代理
@property(nonatomic , strong) CLLocationManager *locationManager;//定位管理器
- (void)viewDidLoad {
[super viewDidLoad];
//管理者的代理
self.locationManager.delegate = self;
// 開(kāi)始獲取用戶(hù)位置 注意:獲取用戶(hù)的方向信息是不需要用戶(hù)授權(quán)的
[self.locationManager startUpdatingHeading];
}
- (CLLocationManager *)locationManager
{
if (!_locationManager) {
_locationManager = [[CLLocationManager alloc] init];
}
return _locationManager;
}
當(dāng)手機(jī)方向發(fā)生改變時(shí),系統(tǒng)會(huì)調(diào)用下面方法
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
/*
magneticHeading 設(shè)備與磁北的相對(duì)角度
trueHeading 設(shè)置與真北的相對(duì)角度, 必須和定位一起使用, iOS需要設(shè)置的位置來(lái)計(jì)算真北
真北始終指向地理北極點(diǎn)
*/
// 1.將獲取到的角度轉(zhuǎn)為弧度 = (角度 * π) / 180;
self.pinAngle = newHeading.magneticHeading * M_PI / 180.0;//指針?lè)较? self.degreeText.string = [NSString stringWithFormat:@"%.0f°",newHeading.magneticHeading];
SCNMatrix4 transform = SCNMatrix4MakeTranslation(0.3, 0.3, 0.01);
transform = SCNMatrix4Scale(transform, -0.03, -0.03, 0.03);
self.degree.transform = transform;
}
ARFrame更新的代理方法
#pragma mark - ARSessionDelegate
- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame {
SCNMatrix4 transform = SCNMatrix4MakeRotation(self.pinAngle+M_PI, 0,0,1);
transform = SCNMatrix4Rotate(transform,M_PI_2, -1, 0, 0);
transform = SCNMatrix4Rotate(transform, M_PI_4, 0, 1, 0);
transform = SCNMatrix4Scale(transform, 0.5, 0.5, 0.5);
transform = SCNMatrix4Rotate(transform, -frame.camera.eulerAngles[0], 1, 0, -1);
transform = SCNMatrix4Translate(transform, 1.0, 0, 1.0);
self.dashboardNode.transform = transform;//羅盤(pán)的位置
SCNMatrix4 pinTransform = SCNMatrix4MakeRotation(M_PI, 0,0,1);
pinTransform = SCNMatrix4Scale(pinTransform,0.1, 0.125, 0.1);
pinTransform = SCNMatrix4Rotate(pinTransform,M_PI_2, -1, 0, 0);
pinTransform = SCNMatrix4Rotate(pinTransform, M_PI_4, 0, 1, 0);
pinTransform = SCNMatrix4Rotate(pinTransform, -frame.camera.eulerAngles[0], 1, 0, -1);
pinTransform = SCNMatrix4Translate(pinTransform, 1.0, 0.01, 1.0);
self.pinNode.transform = pinTransform;//指針的位置
}