1.前一章節(jié)介紹了AR的入門基礎(chǔ)知識廷痘,本章節(jié)將實(shí)現(xiàn)一個小案例(太陽系)加深基礎(chǔ)知識的理解。
先上效果圖:2.原理分析: 從圖中效果可以看出构灸,太陽上渴、地球、月球這三個模型都自傳喜颁,其中月球是圍繞地球轉(zhuǎn)稠氮,地球是圍繞太陽轉(zhuǎn),從效果上來看貌似需要三個模型半开,其實(shí)在本項(xiàng)目中隔披,一共用了7個SCNNode,另外四個,其中一個是太陽周圍散發(fā)出來的火焰寂拆。另外三個雖然不現(xiàn)實(shí)奢米,但是使用上發(fā)揮了重大的作用,在ARKit里一切皆為node節(jié)點(diǎn)纠永,就好比是UIKit里一切皆為UIView鬓长。
但是在界面上,月球繞地球公轉(zhuǎn)的節(jié)點(diǎn)和地球繞太陽公轉(zhuǎn)的節(jié)點(diǎn)并不顯示渺蒿。
3.核心代碼解釋:
創(chuàng)建節(jié)點(diǎn)并渲染
//渲染上圖 multiply: 鑲嵌痢士,把整張圖拉伸,之后變淡
sunNode.geometry?.firstMaterial?.multiply.contents = "art.scnassets/earth/sun.jpg"
earthNode.geometry?.firstMaterial?.multiply.contents = "art.scnassets/earth/earth-diffuse-mini.jpg"
//地球的夜光圖
earthNode.geometry?.firstMaterial?.emission.contents = "art.scnassets/earth/earth-emissive-mini.jpg"
earthNode.geometry?.firstMaterial?.specular.contents = "art.scnassets/earth/earth-specular-mini.jpg"
//月球 diffuse:擴(kuò)散 平均擴(kuò)散到整個物件表面 并且光滑透亮
moonNode.geometry?.firstMaterial?.diffuse.contents = "art.scnassets/earth/moon.jpg"
sunNode.geometry?.firstMaterial?.diffuse.contents = "art.scnassets/earth/sun.jpg"
sunNode.geometry?.firstMaterial?.multiply.intensity = 0.5
sunNode.geometry?.firstMaterial?.lightingModel = .constant
// wrapS 左->右
// wrapT 上->下
sunNode.geometry?.firstMaterial?.multiply.wrapS = .repeat
sunNode.geometry?.firstMaterial?.diffuse.wrapS = .repeat
sunNode.geometry?.firstMaterial?.multiply.wrapT = .repeat
sunNode.geometry?.firstMaterial?.diffuse.wrapT = .repeat
sunNode.geometry?.firstMaterial?.locksAmbientWithDiffuse = true
//太陽照到地球上的光澤 反光度 地球的反光度
earthNode.geometry?.firstMaterial?.shininess = 0.1 //光澤
earthNode.geometry?.firstMaterial?.specular.intensity = 0.5 //反射多少光出去
moonNode.geometry?.firstMaterial?.specular.contents = UIColor.gray
//設(shè)置位置
sunNode.position = SCNVector3Make(0, 5, -20)
earthNode.position = SCNVector3Make(3, 0, 0)
moonNode.position = SCNVector3Make(3, 0, 0)
earthGroupNode.addChildNode(earthNode)
earthGroupNode.position = SCNVector3Make(10, 0, 0)
arSCNView.scene.rootNode.addChildNode(sunNode)
** 屬性解釋**
SCNMaterial
SceneNode提供8種屬性用來設(shè)置模型材質(zhì)
1.Diffuse 漫發(fā)射屬性表示光和顏色在各個方向上的反射量
2.Ambient 環(huán)境光以固定的強(qiáng)度和固定的顏色從表面上的所有點(diǎn)反射出來茂装。如果場景中沒有環(huán)境光對象怠蹂,這個屬性對節(jié)點(diǎn)沒有影響
3.Specular 鏡面反射是直接反射到使用者身上的光線,類似于鏡子反射光線的方式少态。此屬性默認(rèn)為黑色城侧,這將導(dǎo)致材料顯得呆滯
4.Normal 正常照明是一種用于制造材料表面光反射的技術(shù),基本上彼妻,它試圖找出材料的顛簸和凹痕嫌佑,以提供更現(xiàn)實(shí)發(fā)光效果
5.Reflective 反射光屬性是一個鏡像表面反射環(huán)境豆茫。表面不會真實(shí)地反映場景中的其他物體
6.Emission 該屬性是由模型表面發(fā)出的顏色。默認(rèn)情況下屋摇,此屬性設(shè)置為黑色揩魂。如果你提供了一個顏色,這個顏色就會體現(xiàn)出來炮温,你可以提供一個圖像火脉。SceneKit將使用此圖像提供“基于材料的發(fā)光效應(yīng)”。
7.Transparent 用來設(shè)置材質(zhì)的透明度
8.Multiply 通過計算其他所有屬性的因素生成最終的合成的顏色
在這里柒啤,地球繞太陽公轉(zhuǎn)我們可以把地球和月亮組成一個整體倦挂,其實(shí)是這個地月整體繞太陽公轉(zhuǎn),這個整體又是另一個節(jié)點(diǎn)
//地球繞太陽轉(zhuǎn)軌道
let earthRotationNode = SCNNode()
sunNode.addChildNode(earthRotationNode)
earthRotationNode.addChildNode(earthGroupNode)
//月球繞地球轉(zhuǎn)軌道
let moonRotationNode = SCNNode()
moonRotationNode.addChildNode(moonNode)
轉(zhuǎn)動動畫: 因?yàn)槎嗵幱玫搅嘶A(chǔ)動畫担巩,所以封裝了一個基礎(chǔ)動畫的便利構(gòu)造函數(shù)方援,注意:swift中便利構(gòu)造函數(shù)只針對系統(tǒng)類。
extension CABasicAnimation{
convenience init(keyPath:String,fromValue:NSValue?,toValue:NSValue,duration:TimeInterval) {
self.init()
self.keyPath = keyPath
self.toValue = toValue
self.duration = duration
self.repeatCount = .greatestFiniteMagnitude
guard let fromValue = fromValue else {
return;
}
self.fromValue = fromValue
}
}
AR系列會持續(xù)更新涛癌,詳細(xì)示例可查看github地址.