2017-08-29 48 views
4

在幾乎所有的ARKit教程中,似乎我們總是使用ARPlane來發言。在ARKIt中使用SCNFloor

let planeGeometry = SCNPlane(width:CGFloat(planeAnchor.extent.x), height:CGFloat(planeAnchor.extent.z)) 
let planeNode = SCNNode(geometry:planeGeometry) 
planeNode.position = SCNVector3(x:planeAnchor.center.x, y:0, z:planeAnchor.center.y) 
planeNode.transform = SCNMatrix4MakeRotation(-Float.pi/2, 1.0, 0, 0) 

如果你想要一個無限飛機(用於投射陰影)怎麼辦?我試圖SCNFloor,結果是怪異 - 地板掛在半空中:

let planeGeometry = SCNFloor() 
let planeNode = SCNNode(geometry:planeGeometry) 
planeNode.position = SCNVector3(planeAnchor.center.x, 0, planeAnchor.center.z) 

我已經做了谷歌搜索和唯一的結果我已經拿出是的(這也不起作用):https://github.com/arirawr/ARKit-FloorIsLava/blob/master/FloorIsLava/ViewController.swift

SCNFloor()是否適用於ARKit?如果不是,我能做些什麼來創造一架大型飛機?

回答

1

如果你把你的地板節點爲根節點,你Y位置應改爲:

planeNode.position = SCNVector3(planeAnchor.center.x, -1.0, planeAnchor.center.z) 

在這種情況下,我用減1米^

可以使用表面檢測發現你的地板表面錨點,然後你會將你的地板添加到這個錨點的相關節點。世界座標已經是正確的(減號爲Y),所以你可以使用SCNVector3Zero作爲你的地板的位置。

+0

爲什麼任意-1? –

+0

@LimThyeChean只是爲了測試。您應該使用表面檢測並首先找到真實的地面座標。然後你將使用實際樓層的'Y'座標。 –

0

你可以改變這一行做,只要你喜歡你的飛機一樣大:

let planeGeometry = SCNPlane(width:CGFloat(planeAnchor.extent.x),height:CGFloat(planeAnchor.extent.z) 

上面是這樣的,它檢測到的平面,這ARKit沿途更新的大小相匹配。

你可以把它像這樣稍微大一點:

let overHang:CGFloat = 0.2 
... 
let planeGeometry = SCNNode(geometry: SCNPlane(width: CGFloat(planeAnchor.extent.x)+overHang, height: CGFloat(planeAnchor.extent.z)+overHang)) 

或者,只使用一個CGFloat的指定用米大小:

let theSize:CGFloat = 4.0 
... 
let planeGeometry = SCNNode(geometry: SCNPlane(width: theSize, height: theSize))