在ARKIt

时间:2017-08-29 02:53:44

标签: swift scenekit arkit

在几乎所有的ARKit教程中,似乎我们总是使用ARPlane作为地板。

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?如果没有,我该怎么做才能创建一个大飞机?

2 个答案:

答案 0 :(得分:1)

如果您将地面节点添加到rootNode中,则应更改Y位置:

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

在这种情况下,我使用减一米^

您可以使用表面检测来查找地板表面锚点,然后将地板添加到此锚点的相关节点中。锚点的世界坐标已经正确(减去Y),因此您可以使用SCNVector3Zero作为您的楼层的位置。

答案 1 :(得分:1)

你可以改变这条线,使你的飞机尽可能大:

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))