AR之—懸空指南針

懸浮的指南針.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;//指針的位置
}

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評(píng)論 25 709
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,641評(píng)論 1 32
  • 幾年前在知乎看到一個(gè)故事: 從前有個(gè)產(chǎn)品經(jīng)理,一個(gè)比較大的項(xiàng)目只寫(xiě)了三頁(yè)模糊不清的PRD就交給開(kāi)發(fā),開(kāi)發(fā)當(dāng)著所有人...
    凌凌西閱讀 821評(píng)論 0 0
  • 以前的我專(zhuān)注于個(gè)人的提高,只顧自己埋頭向前,從來(lái)不顧和別人的交流。 所以在個(gè)人和別人的交流方面顯得很欠缺。這方面幾...
    智囊團(tuán)閱讀 190評(píng)論 0 0

友情鏈接更多精彩內(nèi)容