完全依赖ARKit
自动平面检测是我不想做的事情,因为它需要时间来检测表面,然后现实生活中的表面应该有足够的纹理,因此我需要考虑一些事情如果我愿意,我可以选择一个选项,只需按一下按钮,就可以随意添加锚点。
这里renderer(nodeFor: )
派上用场。只需在按钮上添加锚点,使用hitTest
确定锚点的位置,然后使用nodeFor:
方法添加节点。
但是,在其他情况下,当我不想手动点按按钮时,renderer(didAdd: )
应该有效。我制作了一个共享对象,通过它我可以确定平面检测是否需要" 自动化"或" 手动"。如果它的自动planeDetection
设置为.horizontal
,而如果是手动,则planeDetection
将设置为[]
。
问题在于测试似乎委托下的两种方法中的任何一种都可以工作。 有没有办法可以实现我的目标? 有一个开关,我可以切换我是想要自动平面检测,还是想添加锚点然后再添加平面。我很想有两个选择。
是否有可能使用两个不同的代表来实现它,只是一个想法...在这种情况下它将如何工作。指针将非常感激。
答案 0 :(得分:1)
是的,renderer(didAdd: )
和renderer(nodeFor: )
是独占的。根据文档,如果我们想要实现我们自己的方法在场景中添加节点,我们可以继续使用renderer(nodeFor: )
,或者我们可以而不是选择ARKit来做同样的事情我们使用renderer(didAdd: )
。
管理这两种情况的方法,即在planeDetection = []
时手动添加节点;使用planeDetection = .horizontal
方法本身可以在renderer(nodeFor: )
时自动添加节点。不需要renderer(didAdd: )
。
如果在planeDetection = .horizontal的情况下renderer(nodeFor: )
,则可以将锚定为ARPlaneAnchor
,其中 center 和 extent 可用于更新添加的节点。
如:
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
if let planeAnchor = anchor as? ARPlaneAnchor {
let node = SCNNode()
let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x),
height: CGFloat(planeAnchor.extent.z))
let planeNode = SCNNode(geometry: plane)
planeNode.name = "anchorPlane"
planeNode.simdPosition = float3(planeAnchor.center.x, 0, planeAnchor.center.z)
node.addChildNode(planeNode)
return node
同时,planeDetection = []
可以施加另一个条件,当锚点不能被转换为ARPlaneAnchor
时,可以根据需要给出节点下面的几何图形。
} else {
let node = SCNNode()
let plane = SCNPlane(width: 0.5, height: 0.5)
plane.firstMaterial?.diffuse.contents = UIColor.white
let planeNode = SCNNode(geometry: plane)
node.addChildNode(node)
return node
}
}