簡介:
上篇回顧:
上篇文章中我們簡單寫了一個(gè)AR尺子測(cè)量距離的demo,計(jì)算距離的公式--> A(x1,y1,z1),B(x2,y2,z2),則A,B之間的距離為d=√[(x1-x2)^2+(y1-y2)^2+(z1-z2)^2],項(xiàng)目中有小伙伴們說道劃線的代碼,其實(shí)這段代碼有點(diǎn)超出iOS的東西有用到openGL的東西,含金量還是蠻高的
func line(to vector:SCNVector3,color:UIColor) -> SCNNode {
let indices : [UInt32] = [0,1]//指數(shù)
let source = SCNGeometrySource(vertices: [self,vector]) // 創(chuàng)建一個(gè)幾何容器(頂點(diǎn))
let element = SCNGeometryElement(indices: indices, primitiveType: .line)//用線的方式來創(chuàng)造一個(gè)幾何元素(線)
let geomtry = SCNGeometry(sources: [source], elements: [element])//幾何
geomtry.firstMaterial?.diffuse.contents = color//渲染顏色
let node = SCNNode(geometry: geomtry)//返回一個(gè)節(jié)點(diǎn)
return node
}
本篇介紹:
AR應(yīng)平面檢測(cè)來說并不稀奇,首先我們來說一下錨點(diǎn)與節(jié)點(diǎn),可以這樣說對(duì)應(yīng)錨點(diǎn)來說,可以是任意一個(gè)形態(tài)的事物,并且不局限于虛擬物件,比如說我們現(xiàn)實(shí)中的桌子、窗臺(tái)、床等等都可以理解錨點(diǎn),當(dāng)然虛擬物件也可以,對(duì)于虛擬世界來說,萬物節(jié)節(jié)點(diǎn),比如說 ARKit-帶你走進(jìn)全新的世界(二:動(dòng)畫與光線處理)篇中的太陽、地球、月球包括黃道與白道,又或者說是 ARKit-帶你走進(jìn)全新的世界(三:追蹤/距離感應(yīng)/AR尺子)篇中的線與文字都可以理解為節(jié)點(diǎn),ARKit為我們提供了一個(gè)代理方法"func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) "當(dāng)我們檢測(cè)到錨點(diǎn)的時(shí)候會(huì)去調(diào)用這個(gè)方法,一旦我們檢測(cè)到平面錨點(diǎn)我們就可以去對(duì)之做一些可視化的東西,將整個(gè)平面的角度與格局展示出來,代理方法中Anchor也就是錨的意思
正文:
效果展示:

實(shí)現(xiàn)思路:
1.實(shí)現(xiàn)代理方法
2.創(chuàng)建幾何
3.創(chuàng)建節(jié)點(diǎn)
4.渲染
5.添加幾何到節(jié)點(diǎn)
步驟:
1.在檢測(cè)到錨點(diǎn)的時(shí)候去搞事情
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
搞事情
}
2.創(chuàng)建平面幾何
let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z))
因?yàn)榇藭r(shí)我們處在一個(gè)三維坐標(biāo)中,此時(shí)我們要處理平面的寬高的話取得值也就是x值和z值如下圖所示

3.創(chuàng)建節(jié)點(diǎn)
let planeNode = SCNNode()
注意:此時(shí)創(chuàng)建節(jié)點(diǎn)的時(shí)候,還不知道所添加的幾何是怎樣的一個(gè)幾何,交由后面處理
4.渲染幾何,還是老代碼了,相信大家已經(jīng)熟悉了
planeNode.position = SCNVector3(x: planeAnchor.center.x, y: 0, z: planeAnchor.center.z)
planeNode.transform = SCNMatrix4MakeRotation(-Float.pi/2, 1, 0, 0)
let gridMaterial = SCNMaterial()
gridMaterial.diffuse.contents = UIImage(named: "art.scnassets/grid.png")
plane.materials = [gridMaterial]
planeNode.geometry = plane
5.渲染完成后將幾何添加為子節(jié)點(diǎn)
node.addChildNode(planeNode)
總結(jié):
最后獻(xiàn)上本文的demo地址demo,歡迎大家下載star,Xcode9正式版本可以運(yùn)行,有興趣可以加q群150731459交流學(xué)習(xí)