首先酱塔,配置文件設(shè)置成水平平地,目前暫時(shí)只支持水平的危虱,垂直的貌似還不支持羊娃,期待正式版。
configuration.planeDetection = .horizontal
捕到平地后埃跷,通過(guò)代理拿到當(dāng)前平地的信息蕊玷,代碼如下:
//添加節(jié)點(diǎn)時(shí)候調(diào)用(當(dāng)開(kāi)啟平地捕捉模式之后,如果捕捉到平地弥雹,ARKit會(huì)自動(dòng)添加一個(gè)平地節(jié)點(diǎn))
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
if anchor.isMember(of: ARPlaneAnchor.self){
//通過(guò)anchor建一個(gè)SCNPlane向量
myPlane = plane(anchor: anchor as! ARPlaneAnchor)
//加入到平地node里
node.addChildNode(myPlane)
}
}
在這里垃帅,捕獲到平地后,返回2個(gè)數(shù)據(jù):
SCNNode:當(dāng)前平地的node.
ARAnchor:平地的向量坐標(biāo),該向量雖然是vector_float3類型剪勿,其實(shí)只是(X,Z)的二維平面贸诚,Y軸一直為0,需要注意的是平地探測(cè)會(huì)不斷變化厕吉,所以下面這幾個(gè)值會(huì)一直變化酱固,有幾個(gè)很重要的屬性:
center:平地向量的中心點(diǎn)。
extent:vector_float3向量头朱,其中Y為0.
image.png
在平地被探測(cè)的時(shí)候运悲,添加一個(gè)SCNPlane。
//根據(jù)平地向量的長(zhǎng)度项钮,寬度班眯,初始化一個(gè)平面形狀
self.planeGeometry = SCNPlane.init(width: CGFloat(self.anchor.extent.x), height: CGFloat(self.anchor.extent.z))
//通過(guò)平面形狀初始化一個(gè)SCNNode
let planeNode:SCNNode = SCNNode.init(geometry: self.planeGeometry)
//把中心點(diǎn)設(shè)置在平面的中心
planeNode.position = SCNVector3Make(anchor.center.x, 0, anchor.center.z)
//SCNPlane是位于(X,Y)軸的,需要旋轉(zhuǎn)到(X,Z) 軸
planeNode.transform = SCNMatrix4MakeRotation(-.pi/2, 1.0, 0, 0)
//添加到平地的Node上
self.addChildNode(planeNode)
需要注意的是烁巫,平地探測(cè)會(huì)一直變化署隘,所以我們需要持續(xù)監(jiān)聽(tīng),更改平面的寬高和中心點(diǎn):
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
//更改寬
self.planeGeometry.width = CGFloat(anchor.extent.x);
//更改高
self.planeGeometry.height = CGFloat(anchor.extent.z);
//更改中心點(diǎn)
self.position = SCNVector3Make(anchor.center.x, 0, anchor.center.z);
//由于渲染了紋理亚隙,需要拉伸紋理定踱。
self.setTextureScale();
}
水平有限,歡迎大家提出意見(jiàn):
demo地址