ARkit框架學習

我不知道怎么切入這個ARKit的主題,也不想胡亂吹一套铺纽,AR是一個什么技術柬帕,反正我明白一件事情,那就是Apple 做AR最牛逼的公司給收購了狡门! 他為啥收購陷寝? 好了 不BB了,本人對AR也比較感興趣其馏。凤跑!通過學習,Apple 官方的IPA尝偎,結合大牛的博客饶火。(其中過程還是比較痛苦的。)
一:首先建議下致扯。肤寝。
ARKit不能理解,如果你是純做iOS的這個正常抖僵。
但是還有一個SceneKit鲤看,這個就有點!你懂的耍群。义桂!還有我有點基礎找筝,一路看過來都可以理解,但是關于換算這塊慷吊。袖裕!還是很多不懂的,后續(xù)會繼續(xù)學習溉瓶!
二:先說個他是怎么樣在iOS上運行AR的急鳄。!
首先要A9 的芯片堰酿,就是說要6S以上的手機疾宏。。触创!才能運行坎藐。。哼绑!我拿的是7pulse岩馍。
ARKit重要包含的class
ARSession 他負責調接顯示,和數據的傳輸(他是中介)
在iOS框架中抖韩,凡是帶session或者context后綴的兼雄,這種類一般自己不干活,作用一般都是兩個:1.管理其他類帽蝶,幫助他們搭建溝通橋梁,好處就是解耦 2.負責幫助我們管理復雜環(huán)境下的內存
context與session不同之處是:一般與硬件打交道块攒,例如攝像頭捕捉ARSession励稳,網卡的調用NSURLSession等使用的都是session后綴。沒有硬件參與囱井,一般用context驹尼,如繪圖上下文,自定義轉場上下文等
1.你對象提供接收視頻圖像捕獲和跟蹤信息,或對會話狀態(tài)的變化庞呕,代理是捕獲視頻流的新翎。。(方法可以實現接收視頻幀圖像捕獲和跟蹤狀態(tài)的AR會話住练。) var
self.arsession.delegate = self;
2.暫停 func
[self.arsession pause];
3.支持多線程的 var
self.arsession.delegateQueue ;
4.翻譯為當前幀地啰,我對這個ARframe還不是很了解 先不做回答。讲逛。?髁摺?盏混?蔚鸥? var
ARFrame *frame = self.arsession.currentFrame;
5.這個函數還真不知道什么意思惜论。 。
[self.arsession runWithConfiguration:self.arsessionconfiguration options:(nil)];
6.運行追蹤者止喷! func
[self.arsession runWithConfiguration:self.arsessionconfiguration];
7.增加刪除錨點,func
ARAnchor *ar = [[ARAnchor alloc]initWithTransform:matrix_sub];
[self.arsession addAnchor:ar ];
[self.arsession removeAnchor:ar];
重點需要理解的馆类。。弹谁!
?ARSession搭建溝通橋梁的參與者主要有兩個ARWorldTrackingSessionConfiguration與ARFrame
*/
與他配合的是ARSessionConfiguration 這個追蹤類乾巧,功能是非常強大的。僵闯。卧抗!
RWorldTrackingSessionConfiguration(會話追蹤配置)的作用是跟蹤設備的方向和位置,以及檢測設備攝像頭看到的現實世界的表面。它的內部實現了一系列非常龐大的算法計算以及調用了你的iPhone必要的傳感器來檢測手機的移動及旋轉甚至是翻滾
該類只支持A9芯片之后的機型鳖粟,也就是iPhone6s之后的機型
當ARWorldTrackingSessionConfiguration計算出相機在3D世界中的位置時社裆,它本身并不持有這個位置數據,而是將其計算出的位置數據交給ARSession去管理(與前面說的session管理內存相呼應)向图,而相機的位置數據對應的類就是ARFrame
--ARSessionConfiguration--父類
ARSessionConfiguration *arsessionconfiguration = [[ARSessionConfiguration alloc]init];
1.是否支持A9芯片 泳秀,AR
@property(class, nonatomic, readonly) BOOL isSupported;
//這是一個類方法
BOOL b = ARSessionConfiguration.isSupported;
2.會話的對其方式,這里的對其指的是3D世界的坐標榄攀。
arsessionconfiguration.worldAlignment = ARWorldAlignmentGravity;
num : ARWorldAlignmentGravity 相機位置 vector (0, -1, 0)
ARWorldAlignmentGravityAndHeading 相機位置及方向. vector (0, -1, 0)
ARWorldAlignmentCamera 相機方向
3.是否需要燈光
arsessionconfiguration.lightEstimationEnabled = YES;
--ARWorldTrackingSessionConfiguration--
只有兩個選項嗜傅,第一個不偵查!第二個偵查地形檩赢。吕嘀!
self.arsessionconfiguration.planeDetection = 1;
/
以上基本上搭建好了贞瞒,ARKit這邊了偶房,!但是還有;
但是要使用的話還得會幾個工具類军浆!
/

ARFrame
ARFrame *frame = [ARFrame alloc];
ARFrame主要是追蹤相機當前的狀態(tài)棕洋,這個狀態(tài)不僅僅只是位置,還有圖像幀及時間等參數
1.時間戳.
float time = frame.timestamp;
2.緩沖區(qū)圖像幀
CVPixelBufferRef ref = frame.capturedImage;
3.相機(表示這個ARFrame是哪一個相機的乒融,iPhone7plus有兩個攝像機)
ARCamera *camera = frame.camera;
4. 返回當前相機捕捉到的錨點數據(當一個3D虛擬模型加入到ARKit中時掰盘,錨點值得就是這個模型在AR中的位置)
NSArray *anchorsarr = frame.anchors;
5.燈光,詳情可見本章節(jié)ARLightEstimate類介紹(指的是燈光強度 一般是0-2000赞季,系統(tǒng)默認1000)
ARLightEstimate *light = frame.lightEstimate;
6.特征點(應該是捕捉平地或者人臉的愧捕,比較蘋果有自帶的人臉識別功能)
ARPointCloud *point = frame.rawFeaturePoints;
7.根據2D坐標點搜索3D模型,這個方法通常用于碟摆,當我們在手機屏幕點擊某一個點的時候晃财,可以捕捉到這一個點所在的3D模型的位置,至于為什么是一個數組非常好理解。手機屏幕一個是長方形断盛,這是一個二維空間罗洗。而相機捕捉到的是一個由這個二維空間射出去的長方體,我們點擊屏幕一個點可以理解為在這個長方體的邊緣射出一條線钢猛,這一條線上可能會有多個3D物體模型
point:2D坐標點(手機屏幕某一點)
ARHitTestResultType:捕捉類型 點還是面
(NSArray<ARHitTestResult *> *):追蹤結果數組

 CGPoint pin = CGPointMake(10, 10);
 NSArray *arr =  [frame hitTest:pin types:ARHitTestResultTypeFeaturePoint];
 跟ARSCnview一樣的
 8.相機窗口的的坐標變換(可用于相機橫豎屏的旋轉適配)
 CGSize sizi = CGSizeMake(100, 100);
   [frame displayTransformWithViewportSize:sizi orientation:UIDeviceOrientationUnknown];
 */

/*
--ARAnchor--
錨點伙菜,
1. 標識符
NSString *NSuuid = anchor.identifier ;
2. 錨點的旋轉變換矩陣,定義了錨點的旋轉命迈、位置贩绕、縮放。是一個4x4的矩陣
matrix_float4x4 mat = anchor.transform;
3. 構造方法,一般我們無需構造壶愤。因為添加一個3D物體時ARKit會有代理告知我們物體的錨點
matrix_float4x4 a ;
ARAnchor *anchor = [[ARAnchor alloc]initWithTransform:a];
*/

/*
ARHitTestResult *hittestresult = [ARHitTestResult alloc];
1.捕捉類型是一個枚舉類型
hittestresult.type淑倾;
點.
ARHitTestResultTypeFeaturePoint

 水平面 y為0.
ARHitTestResultTypeEstimatedHorizontalPlane

已結存在的平面.
ARHitTestResultTypeExistingPlane

已結存在的錨點和平面.
ARHitTestResultTypeExistingPlaneUsingExtent
 2. 3D虛擬物體與相機的距離(單位:米)
 float distance = hittestresult.distance;
 3.自身坐標
 matrix_float4x4 local =   hittestresult.localTransform;
 4.世界坐標
 matrix_float4x4 word =   hittestresult.worldTransform;
 5.錨點
 ARAnchor *anchor =  hittestresult.anchor;
 */
接下來是ARSession;

/*
--ARSCNView--
非常重要的一個類征椒,他是一個支持3D的AR場景和2D的AR場景娇哆,ARSCNView是3D的AR場景視圖
1.您提供協(xié)調同步的對象視圖的基于“增大化現實”技術與SceneKit場景信息內容。
self.sceneView.delegate = self; var
2.添加會話
self.sceneView.session = self.arsession;
3.添加3D場景
self.sceneView.scene = scnscen;
4.是否自動適應燈光
self.sceneView.autoenablesDefaultLighting = YES;
5.返回對應節(jié)點的錨點勃救,節(jié)點是一個3D虛擬物體碍讨,它的坐標是虛擬場景中的坐標,而錨點ARAnchor是ARKit中現實世界的坐標蒙秒。
ARAnchor *anchor = [self.sceneView anchorForNode:scnscen];
6.上對于
self.sceneView nodeForAnchor:<#(nonnull ARAnchor *)#>
7.
根據2D坐標點搜索3D模型勃黍,這個方法通常用于,當我們在手機屏幕點擊某一個點的時候晕讲,可以捕捉到這一個點所在的3D模型的位置覆获,至于為什么是一個數組非常好理解。手機屏幕一個是長方形瓢省,這是一個二維空間锻梳。而相機捕捉到的是一個由這個二維空間射出去的長方體,我們點擊屏幕一個點可以理解為在這個長方體的邊緣射出一條線净捅,這一條線上可能會有多個3D物體模型
point:2D坐標點(手機屏幕某一點)
ARHitTestResultType:捕捉類型 點還是面
(NSArray<ARHitTestResult *> *):追蹤結果數組
數組的結果排序是由近到遠

 ARHitTestResult  這兩個東西比較難,辩块!目前我不理解蛔六??废亭?
 ARHitTestResultType  這是一個枚舉
 CGPoint pin = CGPointMake(10, 10);
 
 NSArray *arr =  [self.sceneView hitTest:pin types:ARHitTestResultTypeFeaturePoint];
 */

pragma mark --SCNScene--

/*
 --SCNScene--
 場景內国章!這包括游戲的任何東西。豆村。液兽!AIP已經寫好了。!
 這個類場景類四啰,用來讀取相對場景宁玫。!
 具體的方法可以在API 中查看柑晒。欧瘪。!
 2. 上面已經說了匙赞,佛掖!ARSCRView是繼承SCNView的。涌庭。芥被!
 SCRView就是用來顯示場景的。坐榆。拴魄。
 3.  在手機中是右手坐標系。
 3.1其中場景中的負責顯示的SCNView猛拴,最底層的就是SCN節(jié)點羹铅。。(相對于各種組件)
 3.2  (在這里你想想場景里基本的包括的東西愉昆!需要顯示出來還差什么职员,已經有transform 了),這個還提供 了一個類跛溉,渲染類焊切!
 4。 渲染這塊包括 五塊
 SCNSceneRenderer
 SCNSceneRendererDelegate
 SCNLayer
 SCNRenderer
 SCNHitTestResult
 5.在這個場景框架里芳室,該有的都有专肪!接下來就是相機類了,堪侯!到這里就有點奇怪了嚎尤。。伍宦!
 (不是還有一個ARCameras么芽死?)
 SCRCameras 一組相機屬性可以被附加到一個節(jié)點提供一個角度顯示現場。(官網上說的)
 ARCaneras  攝像機的位置和成像特征信息捕獲視頻幀的AR會話次洼。
 SCRCameras  這個是用來編輯相機位置的关贵。。卖毁!
 ARCaneras    負責顯示在手機屏幕上的揖曾。。!(這是我對他的理解)
 
 6. 燈光類炭剪! SCNlight
 7.      class SCNMaterial 材質球
 7.1  class SCNMaterialProperty
 8.Geometry  幾何類嗎练链、,一個三維形狀(也稱為一個模型或網格),可以顯示在一個場景中,附加材料定義其外觀念祭。
 9.Animation and Constraints 動畫類
 10.物理類兑宇,Physics Simulation
 11.Particle Systems 粒子系統(tǒng)
 12.Audio 音頻
 13.Renderer Customization 渲染器定制
 14.Scene Asset Import  場景的資源導入
 15.JavaScript  使SceneKit類和全局常量用于指定JavaScript上下文。
 
 */
ARSCNViewDelegate

// Override to create and configure nodes for anchors added to the view's session.

  • (SCNNode *)renderer:(id<SCNSceneRenderer>)renderer nodeForAnchor:(ARAnchor *)anchor {
    SCNNode *node = [SCNNode new];

    // Add geometry to the node..., 當添加節(jié)點是會調用粱坤,我們可以通過這個代理方法得知我們添加一個虛擬物體到AR場景下的錨點(AR現實世界中的坐標)

return node;

}
/**
將要刷新節(jié)點
*/

  • (void)renderer:(id <SCNSceneRenderer>)renderer didAddNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}

/**
將要刷新節(jié)點
*/

  • (void)renderer:(id <SCNSceneRenderer>)renderer willUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}
/**
已經刷新節(jié)點
*/

  • (void)renderer:(id <SCNSceneRenderer>)renderer didUpdateNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}

/**
移除節(jié)點
*/

  • (void)renderer:(id <SCNSceneRenderer>)renderer didRemoveNode:(SCNNode *)node forAnchor:(ARAnchor *)anchor{

}
//系統(tǒng)提供一下隶糕!

  • (void)session:(ARSession *)session didFailWithError:(NSError *)error {
    // Present an error message to the user,向用戶顯示一條錯誤消息

}

  • (void)sessionWasInterrupted:(ARSession *)session {
    // Inform the user that the session has been interrupted, for example, by presenting an overlay站玄,/ /通知用戶會話已經中斷,例如,通過提供一個覆蓋

}

  • (void)sessionInterruptionEnded:(ARSession *)session {
    // Reset tracking and/or remove existing anchors if consistent tracking is required
    //重置跟蹤和/或刪除現有的定位是否需要持續(xù)跟蹤

}
ARSessionDelegate 代理

pragma mark - ARSessionDelegate

/**
這就是所謂的新框架時已更新枚驻。
會話正在運行的會話。
幀的幀更新株旷。
每一幀都在調
*/

  • (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame{

// if (self.planeNode) {
// //positon 位置 ,matrix_float4x4 這個類不知道是什么意思再登!
// self.planeNode.position = SCNVector3Make(frame.camera.transform.columns[3].x, frame.camera.transform.columns[3].y, frame.camera.transform.columns[3].z);
//// NSLog(@"x = %f y = %f z = %f",frame.camera.transform.columns[2].x,frame.camera.transform.columns[2].y,frame.camera.transform.columns[2].z);
//
// }

}

/**
This is called when new anchors are added to the session.
這叫做當新的錨被添加到會話
@param session The session being run.會話正在運行的會話
@param anchors An array of added anchors.錨的數組添加錨點
*/

  • (void)session:(ARSession )session didAddAnchors:(NSArray<ARAnchor>*)anchors{

}
在這里寫的是第一次學習的比較,也是直接寫在Xcode上的晾剖。锉矢。!
希望以后一起學習齿尽。沽损。!雙手奉上QQ 有問題一起解決循头。绵估。!
345996501 卡骂!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末国裳,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子全跨,更是在濱河造成了極大的恐慌缝左,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓若,死亡現場離奇詭異笋敞,居然都是意外死亡掉缺,警方通過查閱死者的電腦和手機翼抠,發(fā)現死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門店煞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苞慢,“玉大人诵原,你說我怎么就攤上這事。” “怎么了绍赛?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵蔓纠,是天一觀的道長。 經常有香客問我吗蚌,道長腿倚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任蚯妇,我火速辦了婚禮敷燎,結果婚禮上,老公的妹妹穿的比我還像新娘箩言。我一直安慰自己硬贯,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布陨收。 她就那樣靜靜地躺著饭豹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪务漩。 梳的紋絲不亂的頭發(fā)上拄衰,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音饵骨,去河邊找鬼翘悉。 笑死,一個胖子當著我的面吹牛宏悦,可吹牛的內容都是我干的镐确。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饼煞,長吁一口氣:“原來是場噩夢啊……” “哼源葫!你這毒婦竟也來了?” 一聲冷哼從身側響起砖瞧,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤息堂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后块促,有當地人在樹林里發(fā)現了一具尸體荣堰,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年竭翠,在試婚紗的時候發(fā)現自己被綠了振坚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斋扰,死狀恐怖渡八,靈堂內的尸體忽然破棺而出啃洋,到底是詐尸還是另有隱情,我是刑警寧澤屎鳍,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布宏娄,位于F島的核電站,受9級特大地震影響逮壁,放射性物質發(fā)生泄漏孵坚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一窥淆、第九天 我趴在偏房一處隱蔽的房頂上張望卖宠。 院中可真熱鬧,春花似錦祖乳、人聲如沸逗堵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜒秤。三九已至,卻和暖如春亚斋,著一層夾襖步出監(jiān)牢的瞬間作媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工帅刊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纸泡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓赖瞒,卻偏偏與公主長得像女揭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栏饮,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • ARkit Introducing ARKit iOS 11引入ARKit吧兔,這是 個全新的框架,允許開發(fā)者輕松地為...
    坤哥愛卿閱讀 1,340評論 0 1
  • 筆者在上篇文章中對ARKit進行了簡單介紹袍嬉,在本篇文章中主要介紹ARKit中經常用到的API及使用方法境蔼。了解這些A...
    未明一二閱讀 1,196評論 1 7
  • 樹上的cat_ee3c閱讀 331評論 0 0
  • 一、void void的意思是“無類型”伺通,相對于void *來說箍土,使用的時候比較簡單,一般只在兩個地方使用: 當函...
    1301c72閱讀 1,962評論 0 3
  • 有人問我:為什么還不生孩子,該有的都有了弓柱? 有人問我:房子有住的沟堡,房租有收的疮鲫,車子開著,為什么還老是加班弦叶? 有人問...
    D071_武漢_夏至幸閱讀 172評論 1 1