關(guān)注AR/VR也有一段時(shí)間了,從一開始微軟的HoloLens,谷歌眼鏡,到蘋果上次在WWDC上向開發(fā)者們展示他們的AR方面的成果,微軟HoloLens高昂的價(jià)格讓人望而卻步,而谷歌眼鏡無疾而終,相較于前兩者,蘋果的AR技術(shù)只需要一臺(tái)iPhone,成本降低了許多,開發(fā)者大會(huì)上蘋果展示的幾個(gè)Demo效果也著實(shí)令我驚艷,于是閑暇時(shí)間就在網(wǎng)上找了些資料,寫了個(gè)小東西。
先上終效果圖:
終效果圖
演示視頻:http://www.bilibili.com/video/av12175891
手機(jī)系統(tǒng)iOS 11 beta版
XCode 9 beta版
上述安裝包的下載地址:https://developer.apple.com/download/
開發(fā)一個(gè)AR項(xiàng)目,你需要用到ARKit和SceneKit這兩個(gè)庫,ARKit用來捕捉現(xiàn)實(shí)場景參數(shù),SceneKit則用來在AR視圖中加載顯示3D模型。
AR場景中使用的是3維坐標(biāo)系如圖,你可以通過調(diào)節(jié)z軸的參數(shù)來調(diào)節(jié)物體距離遠(yuǎn)近。
1) 首先我們需要使用初始化ARSCNView,ARSCNView是用來加載AR的3D場景視圖
- (ARSCNView*)arSCNView
{ if(_arSCNView!=nil) {
return_arSCNView;
}
_arSCNView= [[ARSCNViewalloc]initWithFrame:self.view.bounds]; //綁定SCNView的session _arSCNView.session=self.arSession; //自適應(yīng)環(huán)境光照度,過渡更平滑 _arSCNView.automaticallyUpdatesLighting=YES; //初始化節(jié)點(diǎn), [self initNode];
return_arSCNView;
}
2) ARSession通過管理ARSessionConfiguration實(shí)現(xiàn)場景的追蹤并且返回一個(gè)ARFrame
- (ARSession*)arSession
{ if(_arSession!=nil)
{ return_arSession;
}
_arSession= [[ARSessionalloc]init]; return_arSession;
}
3) ARSessionConfiguration(會(huì)話追蹤配置)主要目的就是負(fù)責(zé)追蹤相機(jī)在3D世界中的位置以及一些特征場景的捕捉,需要配置一些參數(shù)
- (ARSessionConfiguration*)arSessionConfiguration
{ if(_arSessionConfiguration!=nil) {
return_arSessionConfiguration;
} //1.創(chuàng)建世界追蹤會(huì)話配置(使用ARWorldTrackingSessionConfiguration效果更加好),需要A9芯片支持 ARWorldTrackingSessionConfiguration*configuration = [[ARWorldTrackingSessionConfigurationalloc]init]; //2.設(shè)置追蹤方向(追蹤平面,后面會(huì)用到) configuration.planeDetection = ARPlaneDetectionHorizontal;
_arSessionConfiguration= configuration; //3.自適應(yīng)燈光(相機(jī)從暗到強(qiáng)光快速過渡效果會(huì)平緩一些) _arSessionConfiguration.lightEstimationEnabled=YES;
return_arSessionConfiguration;
}
4) SCNScene是AR場景中的場景,場景中是由許多SCNNode節(jié)點(diǎn)組成,SCNNode是一個(gè)個(gè)3D模型。
例如我們這個(gè)例子中需要用到的節(jié)點(diǎn)有太陽、地球、月球,可以new三個(gè)SCNNode
_sunNode = [SCNNodenew];
_sunNode.geometry= [SCNSpheresphereWithRadius:2.5];
為了使太陽更加逼真,我們需要給sunNode增加紋理
//太陽貼圖
_sunNode.geometry.firstMaterial.multiply.contents=@"art.scnassets/earth/sun.jpg"; _sunNode.geometry.firstMaterial.diffuse.contents=@"art.scnassets/earth/sun.jpg"; _sunNode.geometry.firstMaterial.multiply.intensity=0.5; _sunNode.geometry.firstMaterial.lightingModelName=SCNLightingModelConstant; _sunNode.geometry.firstMaterial.multiply.wrapS=
_sunNode.geometry.firstMaterial.diffuse.wrapS=
_sunNode.geometry.firstMaterial.multiply.wrapT=
_sunNode.geometry.firstMaterial.diffuse.wrapT=SCNWrapModeRepeat;
同時(shí)地球,月球都同太陽的創(chuàng)建方法。接下來我們將sunNode節(jié)點(diǎn)添加到Scene中
//設(shè)置Node的三維坐標(biāo) [_sunNode setPosition:SCNVector3Make(0,5, -20)]; //將sunNode節(jié)點(diǎn)添加到scene中 [self.arSCNView.scene.rootNodeaddChildNode:_sunNode];
5) 初始化工作做好之后,接下來開啟場景捕捉
//開啟AR會(huì)話,相機(jī)開始捕捉 [self.arSessionrunWithConfiguration:self.arSessionConfiguration];
6) 創(chuàng)建工作基本完成,接下來就是如何讓這些模型動(dòng)起來了,動(dòng)畫效果會(huì)在下一章講解。
代碼實(shí)現(xiàn):https://github.com/miliPolo/ARSolarPlay
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。