我不知道怎么切入這個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 卡骂!