在几乎所有的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?如果没有,我该怎么做才能创建一个大飞机?
答案 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))