gpt4 book ai didi

ios - ARKit:渲染器(didAdd:)和渲染器(nodeFor:)独占

转载 作者:行者123 更新时间:2023-11-28 12:08:46 26 4
gpt4 key购买 nike

完全依赖 ARKit 自动平面检测是我不想做的事情,因为它需要时间来检测表面,然后现实生活中的表面应该有足够的纹理,因此我需要考虑一些事情提供一个选项,如果我愿意,我应该能够通过点击按钮随意添加 anchor 。

这就是 renderer(nodeFor:) 派上用场的地方。只需在点击按钮时添加一个 anchor ,使用 hitTest 确定 anchor 的位置,然后使用 nodeFor: 方法添加节点。

但是,在其他情况下,当我不想手动点击按钮时,renderer(didAdd:) 应该可以工作。我制作了一个共享对象,通过它我可以确定平面检测是否需要“自动”或“手动”。如果是自动的 planeDetection 将设置为 .horizo​​ntal 而如果是手动的,planeDetection 将设置为 []

问题在于测试委托(delegate)下的两种方法中的任何一种似乎都可以工作。 有什么方法可以实现我想要的吗? 有一个开关,我可以使用它来切换是要自动检测平面还是要先添加 anchor 然后再添加平面。我很想有这两种选择。

是否可以使用两个不同的代表来实现它,只是一个想法......在那种情况下它会如何工作。指针将不胜感激。

最佳答案

是的,renderer(didAdd: )renderer(nodeFor: ) 是互斥的。根据文档,如果我们想在场景中实现我们自己的添加节点的方法,我们可以继续使用 renderer(nodeFor: ),或者我们可以代替选择 ARKit 使用 renderer(didAdd: ) 为我们做同样的事情。

管理这两种情况的方法,即。 planeDetection = [] 时手动添加节点;当 planeDetection = .horizo​​ntal 时自动添加节点可以通过使用 renderer(nodeFor: ) 方法本身来实现。不需要 renderer(didAdd: )

renderer(nodeFor: ) 中,如果 planeDetection = .horizo​​ntal,anchor 可以被转换为 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 = []施加另一个条件,当anchor不能被转换为ARPlaneAnchor时,节点下的geometry可以是根据需要给定尺寸。

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

关于ios - ARKit:渲染器(didAdd:)和渲染器(nodeFor:)独占,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48947791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com