首页 文章

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

提问于
浏览
1

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

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

场景背后的逻辑是什么?

那么如何使用 pivot 旋转节点本身?

1 回答

  • 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)
    

相关问题