【问题标题】:Why should I add node to superNode in renderer(_:nodeFor:) in ARKit为什么我应该在 ARKit 的渲染器(_:nodeFor:) 中将节点添加到超节点
【发布时间】:2019-03-25 00:28:36
【问题描述】:

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

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

幕后的逻辑是什么?

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

【问题讨论】:

    标签: arkit scnnode


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多