ios實(shí)現(xiàn)簡(jiǎn)單隨便移動(dòng)的AR功能
先上個(gè)最終的效果動(dòng)態(tài)圖,
1、首先我們要自定義一個(gè)相機(jī)界面,可以用AVCaptureSession來(lái)自定義,不需要其他按鈕,只有一個(gè)預(yù)覽的界面;
2、我們要畫一個(gè)簡(jiǎn)單的雷達(dá)圖,可以用CGContextRef來(lái)簡(jiǎn)單實(shí)現(xiàn),雷達(dá)圖用來(lái)顯示你跟你附近的用戶(物體)的距離,通過(guò)跟實(shí)際物體的經(jīng)緯度來(lái)算兩點(diǎn)之間的距離,通過(guò)一定的比例來(lái)映射到雷達(dá)圖上,兩點(diǎn)之間的距離計(jì)算公式如下:
//兩點(diǎn)的經(jīng)緯度計(jì)算距離 -(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=對(duì)邊/斜邊,cosA=鄰邊/斜邊,斜邊我們已經(jīng)有了,就是兩點(diǎn)之間的距離,那么我們就需要知道一個(gè)角度,才能算出一條邊,通過(guò)這條邊跟半徑的加減,就可以算出這個(gè)物體在雷達(dá)圖上的位置。所以我們先要算兩點(diǎn)的方位角,看下面的一張圖:
這個(gè)維基上的一張方位角的解釋圖,我們可以同通過(guò)tan2函數(shù)來(lái)計(jì)算,公式如下:
- (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、要實(shí)現(xiàn)雷達(dá)圖跟隨手機(jī)旋轉(zhuǎn)而轉(zhuǎn)動(dòng),這里我們要用到指南針的原理,通過(guò)CLLocationManager管理類,里面有個(gè)CLHeading類,我們可以實(shí)現(xiàn)指南針,看這個(gè)類的結(jié)構(gòu):
里面有真北,磁北,還有磁力值在x,y,z三軸上的磁力值,不過(guò)當(dāng)我用到這三個(gè)值的時(shí)候,發(fā)現(xiàn)有問(wèn)題,在前后移動(dòng)手機(jī)的時(shí)候,發(fā)現(xiàn)這個(gè)值變化有停頓,如果用這個(gè)值來(lái)實(shí)現(xiàn)移動(dòng)會(huì)導(dǎo)致不流暢,所以我又用了陀螺儀數(shù)據(jù),通過(guò)CMMotionManager這個(gè)管理類來(lái)獲取手機(jī)移動(dòng)擺動(dòng)的角度,用來(lái)計(jì)算手機(jī)前后移動(dòng)的時(shí)候,物體在手機(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、通過(guò)計(jì)算角度區(qū)間來(lái)顯示手機(jī)上的物體顯示還隱藏,也就是說(shuō)在雷達(dá)圖上的點(diǎn)進(jìn)入扇形可見的區(qū)域就顯示出物體并且移動(dòng),超出就隱藏起來(lái)。還有一點(diǎn),就是要算碰撞檢測(cè)的手機(jī)上物體與物體如果太多,就不能疊在一起,通過(guò)錯(cuò)位錯(cuò)開來(lái),可以通過(guò)CGRectIntersectsRect來(lái)寫個(gè)算法檢測(cè)兩個(gè)矩形是否碰到了。
簡(jiǎn)單說(shuō)了下我實(shí)現(xiàn)的原理,當(dāng)然實(shí)際做的時(shí)候會(huì)遇到很多問(wèn)題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
iOS程序開發(fā)之使用PlaceholderImageView實(shí)現(xiàn)優(yōu)雅的圖片加載效果
這篇文章主要介紹了ioS程序開發(fā)之使用PlaceholderImageView實(shí)現(xiàn)優(yōu)雅的圖片加載效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09iOS開發(fā)中#import、#include和@class的區(qū)別解析
這篇文章主要介紹了iOS開發(fā)中#import、#include和@class的區(qū)別解析,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-08-08iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別詳解
OS的人臉識(shí)別從iOS 5(2011)就有了,不過(guò)一直沒(méi)怎么被關(guān)注過(guò)。人臉識(shí)別API允許開發(fā)者不僅可以檢測(cè)人臉,也可以檢測(cè)到面部的一些特殊屬性,比如說(shuō)微笑或眨眼。下面這篇文章主要給大家介紹了iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別的相關(guān)資料,需要的朋友可以參考下。2017-05-05IOS中快速集成短信SDK驗(yàn)證開發(fā)(SMSSDK),IOS開發(fā)中如何設(shè)置手機(jī)短信驗(yàn)證碼
這篇文章主要介紹了IOS中快速集成短信SDK驗(yàn)證開發(fā)(SMSSDK),IOS開發(fā)中如何設(shè)置手機(jī)短信驗(yàn)證碼 的相關(guān)資料,需要的朋友可以參考下2016-01-01Objective-C與Swift之間的互相調(diào)用和跳轉(zhuǎn)
這篇文章主要給大家介紹了關(guān)于Objective-C與Swift之間的互相調(diào)用和跳轉(zhuǎn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05