首先創建項目
然后重新創建了一個Controller叫THARKitController(隨便取的)
下面開始導入ARKit庫
#import <ARKit/ARKit.h>
導入ARKit庫并不夠,還需要導入3D框架#import <SceneKit/SceneKit.h> 用來創建加載模型的對象
想要顯示AR效果需要3個對象
ARSCNView:用于展示3D效果的視圖
ARWorldTrackingConfiguration:(會話追蹤配置)的作用是跟蹤設備的方向和位置,以及檢測設備攝像頭看到的現實世界的表面。它的內部實現了一系列非常龐大的算法計算以及調用了你的iPhone必要的傳感器來檢測手機的移動及旋轉甚至是翻滾。我們無需關心內部實現,ARKit框架幫助我們封裝的非常完美,只需調用一兩個屬性即可。
SCNScene:用來加載3D模型的類,這里我使用它的節點(SCNNode)來加入視圖中
SCNNode:從創建的模型類中取得節點,節點不是一個,而是多個節點拼裝出來的,主要是能控制其大小和位置信息
1.創建ARSCNView
ARSCNView *arScnView = ?[[ARSCNView alloc] initWithFrame:self.view.bounds];?
arScnView.showsStatistics = YES;// 加載FPS等調試信息
arScnView.debugOptions = ARSCNDebugOptionShowWorldOrigin|ARSCNDebugOptionShowFeaturePoints;// 渲染 ARKit 報告的世界原點以及渲染 ARKit 檢測到的特征點
[self.view addSubview:arScnView];// 把AR視圖添加在viewController上
2.創建ARWorldTrackingConfiguration并啟動AR會話
ARWorldTrackingConfiguration *arSessionConfiguration = ?[[ARWorldTrackingConfiguration alloc] init];?
arSessionConfiguration.planeDetection = ARPlaneDetectionHorizontal;// 設置追蹤方向(追蹤平面)
[arScnView.session runWithConfiguration:arSessionConfiguration];// 開啟AR會話(此時相機開始工作)
顯示AR開始工作了,但是我們想檢測平面,需要實現ARSCNView的代理方法
首先設置代理
arScnView.delegate = self;
然后實現代理方法
- (void)renderer:(id <SCNSceneRenderer>)renderer didAddNode:(SCNNode*)node forAnchor:(ARAnchor*)anchor;
當設備捕捉到平面的時候就會調用該方法,其中anchor就是捕捉到的平面信息
我們創建網格平面來顯示檢測到的平面是什么樣的
首先用ARAnchor的子類來接收位置信息
ARPlaneAnchor*planeAnchor = (ARPlaneAnchor*)anchor;
然后創建一個平面并設置其大小為檢測出來的大小
SCNPlane*plane = [SCNPlane planeWithWidth:planeAnchor.extent.x height:planeAnchor.extent.z];
創建一個網格并賦值給這個平面
SCNMaterial*material = [[SCNMaterial alloc]init];
material.lightingModelName=SCNLightingModelPhysicallyBased;
material.diffuse.contents = ?[UIImageimageNamed:@"tron_grid"];
plane.materials= [NSMutableArray arrayWithObjects:material,nil];
創建一個基于3D物體模型的節點,并把這個平面放上去
SCNNode*planeNode = [SCNNode nodeWithGeometry:plane];
設置節點的位置為捕捉到的平地的錨點的中心位置SceneKit框架中節點的位置position是一個基于3D坐標系的矢量坐標SCNVector3Make
planeNode.position=SCNVector3Make(planeAnchor.center.x,0, planeAnchor.center.z);
planeNode.transform=SCNMatrix4MakeRotation((-(float)M_PI/2.0),1.0,0.0,0.0);
把這個3D模型的節點放在映射到 anchor 的節點上
[node addChildNode:planeNode];
更新平面
我們添加一個全局屬性可變的字典,用于記錄我們添加的網格3D模型
[_plane ssetObject:planeNode forKey:anchor.identifier];
然后在代理方法
- (void)renderer:(id)renderer didUpdateNode:(SCNNode*)node forAnchor:(ARAnchor*)anchor;
中取出模型并更新大小個位置
SCNNode*plane = [_planes objectForKey:anchor.identifier];
if(plane ==nil) {
return;
}
修改大小
((SCNPlane*)plane.geometry).width= (float)planeAnchor.extent.x;
((SCNPlane*)plane.geometry).height= (float)planeAnchor.extent.z;
修改位置
plane.position=SCNVector3Make(planeAnchor.center.x,0, planeAnchor.center.z);
最后跑起來看看
最后貼上原文地址:http://www.cocoachina.com/ios/20170713/19856.html?utm_source=tuicool&utm_medium=referral