先上個最終的效果動態圖,
~~~~~~~~~~~~~~~~~~~~~~
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 = 2 * 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=鄰邊/斜邊,斜邊我們已經有了,就是兩點之間的距離,那麼我們就需要知道一個角度,才能算出一條邊,通過這條邊跟半徑的加減,就可以算出這個物體在雷達圖上的位置。所以我們先要算兩點的方位角,看下面的一張圖:
- (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類,我們可以實現指南針,看這個類的結構:
-(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來寫個算法檢測兩個矩形是否碰到了,
簡單說了下我實現的原理,當然實際做的時候會遇到很多問題,,,,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【ios 簡單模仿隨便走的AR功能(原理)】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!