真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ios如何實現(xiàn)簡單隨便移動的AR功能

這篇文章主要介紹了ios如何實現(xiàn)簡單隨便移動的AR功能,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

來安ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

先上個最終的效果動態(tài)圖,

ios如何實現(xiàn)簡單隨便移動的AR功能

1、首先我們要自定義一個相機(jī)界面,可以用AVCaptureSession來自定義,不需要其他按鈕,只有一個預(yù)覽的界面;

2、我們要畫一個簡單的雷達(dá)圖,可以用CGContextRef來簡單實現(xiàn),雷達(dá)圖用來顯示你跟你附近的用戶(物體)的距離,通過跟實際物體的經(jīng)緯度來算兩點之間的距離,通過一定的比例來映射到雷達(dá)圖上,兩點之間的距離計算公式如下:

//兩點的經(jīng)緯度計算距離 
-(float) DistanceFromCoordinates:(CLLocationCoordinate2D) myDot other:(CLLocationCoordinate2D)otherDot 
{ 
  
 double EARTH_RADIUS = 6378137.0; 
  
 double radLat1 = (myDot.latitude * M_PI / 180.0); 
 double radLat2 = (otherDot.latitude * M_PI / 180.0); 
 double a = radLat1 - radLat2; 
 double b = (myDot.longitude - otherDot.longitude) * M_PI / 180.0; 
 double s = 22 * asin(sqrt(pow(sin(a / 2), 2) 
        + cos(radLat1) * cos(radLat2) 
        * pow(sin(b / 2), 2))); 
 s = s * EARTH_RADIUS; 
 s = round(s * 10000) / 10000; 
  
 return s; 
  
}

要算物體在雷達(dá)圖上的顯示位置,根據(jù)三角函數(shù),sinA=對邊/斜邊,cosA=鄰邊/斜邊,斜邊我們已經(jīng)有了,就是兩點之間的距離,那么我們就需要知道一個角度,才能算出一條邊,通過這條邊跟半徑的加減,就可以算出這個物體在雷達(dá)圖上的位置。所以我們先要算兩點的方位角,看下面的一張圖:

ios如何實現(xiàn)簡單隨便移動的AR功能

這個維基上的一張方位角的解釋圖,我們可以同通過tan2函數(shù)來計算,公式如下:

- (float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc 
{ 
 float fLat = DegreesToRadians(fromLoc.latitude); 
 float fLng = DegreesToRadians(fromLoc.longitude); 
 float tLat = DegreesToRadians(toLoc.latitude); 
 float tLng = DegreesToRadians(toLoc.longitude); 
  
 float degree = RadiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng))); 
  
 if (degree >= 0) { 
  return degree; 
 } else { 
  return (360+degree); 
 } 
 
}

3、要實現(xiàn)雷達(dá)圖跟隨手機(jī)旋轉(zhuǎn)而轉(zhuǎn)動,這里我們要用到指南針的原理,通過CLLocationManager管理類,里面有個CLHeading類,我們可以實現(xiàn)指南針,看這個類的結(jié)構(gòu):

ios如何實現(xiàn)簡單隨便移動的AR功能

里面有真北,磁北,還有磁力值在x,y,z三軸上的磁力值,不過當(dāng)我用到這三個值的時候,發(fā)現(xiàn)有問題,在前后移動手機(jī)的時候,發(fā)現(xiàn)這個值變化有停頓,如果用這個值來實現(xiàn)移動會導(dǎo)致不流暢,所以我又用了陀螺儀數(shù)據(jù),通過CMMotionManager這個管理類來獲取手機(jī)移動擺動的角度,用來計算手機(jī)前后移動的時候,物體在手機(jī)界面上下的位置。

-(void) startMotion 
{ 
  
 if (![_mgr isDeviceMotionActive] && [_mgr isDeviceMotionAvailable]) 
 { 
   
 //設(shè)置采樣間隔 
  _mgr.deviceMotionUpdateInterval = 0.1; 
 
 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
 
  [_mgr startDeviceMotionUpdatesToQueue:queue 
   withHandler:^(CMDeviceMotion * _Nullable motion, 
      NSError * _Nullable error) { 
          
      double gravityX = motion.gravity.x; 
      double gravityY = motion.gravity.y; 
      double gravityZ = motion.gravity.z; 
          
          
   if (gravityY<=0 && gravityY>=-1) 
   { 
           
 //獲取手機(jī)的傾斜角度(zTheta是手機(jī)與水平面的夾角, xyTheta是手機(jī)繞自身旋轉(zhuǎn)的角度): 
  zTheta = atan2(gravityZ,sqrtf(gravityX*gravityX+gravityY*gravityY))/M_PI*180.0; 
 
} 
  [[NSOperationQueue mainQueue] addOperationWithBlock:^{     
    [self updataPoint]; 
 
    }]; 
       
  //[self performSelectorOnMainThread:@selector(updataPoint) withObject:nil waitUntilDone:NO]; 
      
  }]; 
     
 } 
}

4、通過計算角度區(qū)間來顯示手機(jī)上的物體顯示還隱藏,也就是說在雷達(dá)圖上的點進(jìn)入扇形可見的區(qū)域就顯示出物體并且移動,超出就隱藏起來。還有一點,就是要算碰撞檢測的手機(jī)上物體與物體如果太多,就不能疊在一起,通過錯位錯開來,可以通過CGRectIntersectsRect來寫個算法檢測兩個矩形是否碰到了。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ios如何實現(xiàn)簡單隨便移動的AR功能”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!


網(wǎng)頁名稱:ios如何實現(xiàn)簡單隨便移動的AR功能
URL分享:http://weahome.cn/article/pccijd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部