轉(zhuǎn)載請(qǐng)注明原作者
第二篇文章鏈接:如何用ARKit把太陽(yáng)系裝在你的iPhone中(二)
? ? 關(guān)注AR/VR也有一段時(shí)間了跋理,從一開(kāi)始微軟的HoloLens致开,谷歌眼鏡,到蘋(píng)果上次在WWDC上向開(kāi)發(fā)者們展示他們的AR方面的成果,微軟HoloLens高昂的價(jià)格讓人望而卻步瞒瘸,而谷歌眼鏡無(wú)疾而終,相較于前兩者熄浓,蘋(píng)果的AR技術(shù)只需要一臺(tái)iPhone情臭,成本降低了許多,開(kāi)發(fā)者大會(huì)上蘋(píng)果展示的幾個(gè)Demo效果也著實(shí)令我驚艷,于是閑暇時(shí)間就在網(wǎng)上找了些資料俯在,寫(xiě)了個(gè)小東西竟秫。
先上最終效果圖:
演示視頻:http://www.bilibili.com/video/av12175891
1.開(kāi)發(fā)前準(zhǔn)備
?手機(jī)需要先安裝證書(shū)文件,不安裝無(wú)法獲取iOS beta版操作系統(tǒng)
手機(jī)系統(tǒng)iOS 11 beta版
XCode 9 beta版
上述安裝包的下載地址:https://developer.apple.com/download/
2.接下來(lái)我們進(jìn)入Code階段
? 開(kāi)發(fā)一個(gè)AR項(xiàng)目跷乐,你需要用到ARKit和SceneKit這兩個(gè)庫(kù)肥败,ARKit用來(lái)捕捉現(xiàn)實(shí)場(chǎng)景參數(shù),SceneKit則用來(lái)在AR視圖中加載顯示3D模型愕提。
AR場(chǎng)景中使用的是3維坐標(biāo)系如圖馒稍,你可以通過(guò)調(diào)節(jié)z軸的參數(shù)來(lái)調(diào)節(jié)物體距離遠(yuǎn)近。
1) 首先我們需要使用初始化ARSCNView浅侨,ARSCNView是用來(lái)加載AR的3D場(chǎng)景視圖
- (ARSCNView*)arSCNView
{
if(_arSCNView!=nil) {
return_arSCNView;
}
_arSCNView= [[ARSCNViewalloc]initWithFrame:self.view.bounds];
//綁定SCNView的session
_arSCNView.session=self.arSession;
//自適應(yīng)環(huán)境光照度纽谒,過(guò)渡更平滑
_arSCNView.automaticallyUpdatesLighting=YES;
//初始化節(jié)點(diǎn),
[self initNode];
return_arSCNView;
}
2) ?ARSession通過(guò)管理ARSessionConfiguration實(shí)現(xiàn)場(chǎng)景的追蹤并且返回一個(gè)ARFrame
- (ARSession*)arSession
{
if(_arSession!=nil)
{
return_arSession;
}
_arSession= [[ARSessionalloc]init];
return_arSession;
}
3) ?ARSessionConfiguration(會(huì)話追蹤配置)主要目的就是負(fù)責(zé)追蹤相機(jī)在3D世界中的位置以及一些特征場(chǎng)景的捕捉仗颈,需要配置一些參數(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)光快速過(guò)渡效果會(huì)平緩一些)
?_arSessionConfiguration.lightEstimationEnabled=YES;
?return_arSessionConfiguration;
}
4) ? SCNScene是AR場(chǎng)景中的場(chǎng)景挨决,場(chǎng)景中是由許多SCNNode節(jié)點(diǎn)組成请祖,SCNNode是一個(gè)個(gè)3D模型。
? 例如我們這個(gè)例子中需要用到的節(jié)點(diǎn)有太陽(yáng)脖祈、地球肆捕、月球,可以new三個(gè)SCNNode
_sunNode = [SCNNodenew];
_sunNode.geometry= [SCNSpheresphereWithRadius:2.5];
為了使太陽(yáng)更加逼真盖高,我們需要給sunNode增加紋理
//太陽(yáng)貼圖
_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í)地球慎陵,月球都同太陽(yáng)的創(chuàng)建方法。接下來(lái)我們將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) ?初始化工作做好之后喻奥,接下來(lái)開(kāi)啟場(chǎng)景捕捉
//開(kāi)啟AR會(huì)話席纽,相機(jī)開(kāi)始捕捉
[self.arSessionrunWithConfiguration:self.arSessionConfiguration];
6) ?創(chuàng)建工作基本完成,接下來(lái)就是如何讓這些模型動(dòng)起來(lái)了撞蚕,動(dòng)畫(huà)效果會(huì)在下一章講解润梯。
代碼實(shí)現(xiàn):https://github.com/miliPolo/ARSolarPlay(OC實(shí)現(xiàn))
? ? ? ? ? ? ? ? ??https://github.com/miliPolo/ARSolarPlaySwift(Swift實(shí)現(xiàn))
------------------------------------------------------------------------------------------------------------------
如果您覺(jué)得有價(jià)值,請(qǐng)?jiān)趃ithub賞個(gè)star甥厦,不勝感激纺铭。
如果有什么想交流的,歡迎私信刀疙。