为什么我应该在 ARKit 中的渲染器(_:nodeFor:) 中将节点添加到 superNode



我正在尝试通过某些图像覆盖检测到的平面

所以我试图使用renderer(_:nodeFor:)

在该方法中,一些博主编写了这样的代码

guard let anchor = anchor as? ARPlaneAnchor else { return nil }
let anchorNode = SCNNode()
let planeNode = SCNNode()
let material = SCNMaterial()
material.diffuse.contents = UIColor.gray.withAlphaComponent(0.6)
let plane = SCNPlane(width: CGFloat(anchor.extent.x), height: CGFloat(anchor.extent.z))
plane.materials = [material]
planeNode.geometry = plane
planeNode.position = SCNVector3(anchor.center.x, 0, anchor.center.z)
planeNode.eulerAngles = SCNVector3(-Float.pi / 2, 0, 0)
anchorNode.addChildNode(planeNode)
return anchorNode

为什么他们将子节点添加到空节点?

为什么只是不旋转自己

当然,我阅读了有关它的文档

他们说:

可以实现此方法以提供新的 SCNNode 对象(或 SCNNode 子类的实例(,其中包含计划用作定位点可视表示形式的任何附件。请注意,ARKit 控制节点的可见性及其转换属性,因此您可能会发现添加子节点或调整节点的透视属性以保持对位置或方向所做的任何更改非常有用。

幕后有什么逻辑?

那么如何使用枢轴旋转节点本身呢?

当调用renderer(_:nodeFor:)时,它会要求将节点附加到锚点,如果锚点在世界空间中的位置被更新,它也会自动更新节点。您需要做的就是返回要放在检测到的表面上的平面节点。

例如,在renderer(_:nodeFor:)中,您可以这样做

guard let anchor = anchor as? ARPlaneAnchor else { return nil }
let imagePlane = SCNPlane(width: CGFloat(anchor.extent.x), height: CGFloat(anchor.extent.z))
imagePlane.firstMaterial.diffuse.contents = UIImage(named: 'yourImage')
return SCNNode(geometry: imagePlane)

最新更新