为什么要在ARKit的renderer(_:nodeFor :)中将节点添加到superNode

时间:2018-10-20 08:24:16

标签: arkit scnnode

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

所以我尝试使用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控制着节点的可见性及其转换属性,因此您可能会发现添加子节点或调整节点的数据透视属性以保持对位置或方向所做的任何更改都是有用的。

幕后逻辑是什么?

然后如何使用枢轴旋转节点本身?

1 个答案:

答案 0 :(得分:0)

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