代码之家  ›  专栏  ›  技术社区  ›  PrepareFor

为什么要在arkit中的renderer中向supernode添加node

  •  1
  • PrepareFor  · 技术社区  · 6 年前

    我试着用一些图像覆盖被探测到的平面

    所以我想用 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
    

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

    为什么不自转

    我当然看过有关它的文件

    他们说:

    您可以实现此方法,以提供一个新的SCNoN节点对象(或SCNoNB子类实例),其中包含您计划用作锚的可视化表示的任何附件。注意,ARKIT控制节点的可见性及其转换属性,因此您可能会发现添加子节点或调整节点的枢轴属性以保持对所做的位置或方向的任何更改是有用的。

    场景背后的逻辑是什么?

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Brandon    6 年前

    什么时候? 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)