ARKit-帶你走進(jìn)全新的世界(四:平面檢測(cè))

簡介:

上篇回顧:

上篇文章中我們簡單寫了一個(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í)

C博客地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容