本節(jié)學(xué)習(xí)目標(biāo)
我們?cè)趯⒁粡垐D渲染在球體上制作全景圖的時(shí)候,會(huì)發(fā)現(xiàn)圖片上的文字從球體內(nèi)部來(lái)看是反的,我們舉例說(shuō)明一下
先看一下我們的全景圖全貌
注意紅色"ab"的看起來(lái)是正常的,但是經(jīng)過(guò)我們下面渲染球體的代碼
第一步 創(chuàng)建一個(gè)球體
let sphereNode = SCNNode()
sphereNode.position = SCNVector3Make(0, 0, 0)
sphereNode.geometry = SCNSphere(radius: 100)
self.scnView.scene?.rootNode.addChildNode(sphereNode)
第二步 貼圖
sphereNode.geometry?.firstMaterial?.diffuse.contents = srcImage
sphereNode.geometry?.firstMaterial?.isDoubleSided = true
sphereNode.geometry?.firstMaterial?.diffuse.wrapT = .repeat;
sphereNode.geometry?.firstMaterial?.diffuse.wrapS = .repeat;
第三步 給球體內(nèi)部放置一個(gè)相機(jī)
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.camera?.automaticallyAdjustsZRange = true
cameraNode.position = SCNVector3Make(0, 0, 0)
sphereNode.addChildNode(cameraNode)
效果如下
這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn)“ab”是 內(nèi)部往外看的效果
接下來(lái)我們可以使用下面的三種辦法解決這個(gè)問(wèn)題
第一種 我們不演示 就是把這種圖透射處理一下 然后再渲染,記住不是鏡像
第二種 對(duì)紋理坐標(biāo)進(jìn)行矩陣變換
默認(rèn)的矩陣為
SCNMatrix4(m11: 1.0, m12: 0.0, m13: 0.0, m14: 0.0, m21: 0.0, m22: 1.0, m23: 0.0, m24: 0.0, m31: 0.0, m32: 0.0, m33: 1.0, m34: 0.0, m41: 0.0, m42: 0.0, m43: 0.0, m44: 1.0)
旋轉(zhuǎn)矩陣
SCNMatrix4(m11: -1.0, m12: 0.0, m13: 0.0, m14: 0.0, m21: 0.0, m22: 1.0, m23: 0.0, m24: 0.0, m31: 0.0, m32: 0.0, m33: 1.0, m34: 0.0, m41: 0.0, m42: 0.0, m43: 0.0, m44: 1.0)
如果沿y軸中心將圖片旋轉(zhuǎn)90度渲染就可以了接下來(lái)看代碼
sphereNode.geometry?.firstMaterial?.diffuse.contentsTransform = SCNMatrix4MakeScale(-1,1,1); // 紋理坐標(biāo)翻轉(zhuǎn)一下
這個(gè)時(shí)候 你會(huì)發(fā)現(xiàn)什么都看不見(jiàn) 因?yàn)榍蝮w內(nèi)部沒(méi)有燈光 在球體內(nèi)部加上環(huán)境光試試看
let lightNode = SCNNode()
lightNode .light = SCNLight()
lightNode .light?.type = .ambient
sphereNode.addChildNode(lightNode)
你會(huì)發(fā)現(xiàn)正是我們需要的
第三種方式 這種方式是不需要添加燈光的
sphereNode.geometry?.firstMaterial?.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(-1, 1, 1), 1, 0, 0)
運(yùn)行效果和上面的方式一樣