麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > iOS > 正文

ios實現簡單隨便移動的AR功能

2019-10-21 18:41:42
字體:
來源:轉載
供稿:網友

先上個最終的效果動態圖,

ios,AR

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

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

//兩點的經緯度計算距離 -(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;   } 

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

ios,AR

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

- (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、要實現雷達圖跟隨手機旋轉而轉動,這里我們要用到指南針的原理,通過CLLocationManager管理類,里面有個CLHeading類,我們可以實現指南針,看這個類的結構:

ios,AR

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

 

-(void) startMotion {    if (![_mgr isDeviceMotionActive] && [_mgr isDeviceMotionAvailable])  {     //設置采樣間隔   _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)    {             //獲取手機的傾斜角度(zTheta是手機與水平面的夾角, xyTheta是手機繞自身旋轉的角度):   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、通過計算角度區間來顯示手機上的物體顯示還隱藏,也就是說在雷達圖上的點進入扇形可見的區域就顯示出物體并且移動,超出就隱藏起來。還有一點,就是要算碰撞檢測的手機上物體與物體如果太多,就不能疊在一起,通過錯位錯開來,可以通過CGRectIntersectsRect來寫個算法檢測兩個矩形是否碰到了。

簡單說了下我實現的原理,當然實際做的時候會遇到很多問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久国产精品久久久久久久久久 | 毛片视频网站 | 久久欧美亚洲另类专区91大神 | 国产精品免费久久久久久 | 中文字幕亚洲一区二区三区 | 欧美日韩成人一区二区 | 亚洲成人福利在线观看 | 欧美成人性色区 | 一级黄色免费观看 | 欧美日韩亚洲在线 | 龙床上的呻吟高h | 免费在线观看国产 | 国产精品中文在线 | 日韩一级精品 | 久久精品国产99国产精品亚洲 | 欧美在线中文字幕 | 久久久久久久久久亚洲 | 日韩视频在线免费 | 精品在线观看一区二区三区 | 3级毛片 | 久久草在线观看视频 | 亚洲一级电影在线观看 | av电影在线观看网站 | 一本大道av | 一区二区三高清 | 成熟女人特级毛片www免费 | 亚洲导航深夜福利涩涩屋 | 色97色 | 国产免费观看一区二区三区 | 99精品国产一区二区三区 | 久久影院一区二区三区 | 国产精品爱久久久久久久 | 最新欧美精品一区二区三区 | av中文字幕免费在线观看 | 午夜精品久久久久久久爽 | 成人在线观看免费观看 | 污视频在线看 | 免费看一级视频 | 好吊色欧美一区二区三区四区 | 久久免费视频一区二区三区 | 免费亚洲视频在线观看 |