在 ARSCNView 中显示“ARAnchor”

ARG*_*Geo 3 augmented-reality scenekit swift arkit

在 ARKit 中,我们可以Feature Points' Cloud通过.showFeaturePointsType 属性可视化在 ARSession 中检测到的:

self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
Run Code Online (Sandbox Code Playgroud)

此外,我们可以显示坐标轴可视化,指示 AR 世界坐标系的位置和方向:

static let showWorldOrigin: SCNDebugOptions
Run Code Online (Sandbox Code Playgroud)

但是可以ARAnchors在 ARSCNView 中显示吗?

如果,我们怎么做?

sj-*_*j-r 5

ARAnchor仅代表“位置和方向”。你能看到的东西都是SCNNodes。

您可以通过以下方法为添加的每个锚点附加一个节点ARSCNViewDelegate

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    //create a node so you can visualize the location.
    let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.5))
    sphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.blue
    return sphereNode
}
Run Code Online (Sandbox Code Playgroud)

在添加锚点后(或者当系统添加锚点时,例如打开平面检测或图像/对象检测时),将调用此函数

sceneView.session.add(anchor:)
Run Code Online (Sandbox Code Playgroud)

  • 是的,你当然可以制作任何你想要的节点。方向和位置与锚点相同。将它们(ARAnchor 和 Node)视为一对 (2认同)
  • 如果您查看 [Apple ARKit 文档](http://developer.apple.com/documentation/arkit) 页面上的一些示例代码项目,您会发现一个绘制 x/y 的 `coordinateOrigin.scn` 文件/z 坐标轴,这是可视化锚点变换的便捷方法。 (2认同)

Bla*_*orz 5

只是为了跟进@sj-r 和@Rickster 的评论。

@Rickster 正在谈论的示例代码可以在coordinateOrigin.scn这里找到:Creating Face Based Experiences

这是我之前用来可视化轴的一个小片段:

class BMOriginVisualizer: SCNNode {

    //----------------------
    //MARK: - Initialization
    //---------------------

    /// Creates An AxisNode To Vizualize ARAnchors
    ///
    /// - Parameter scale: CGFloat
    init(scale: CGFloat = 1) {

        super.init()

        //1. Create The X Axis
        let xNode = SCNNode()
        let xNodeGeometry = SCNBox(width: 1, height: 0.01, length: 0.01, chamferRadius: 0)
        xNode.geometry = xNodeGeometry
        xNodeGeometry.firstMaterial?.diffuse.contents = UIColor.red
        xNode.position = SCNVector3(0.5, 0, 0)
        self.addChildNode(xNode)

        //2. Create The Y Axis
        let yNode = SCNNode()
        let yNodeGeometry = SCNBox(width: 0.01, height: 1, length: 0.01, chamferRadius: 0)
        yNode.geometry = yNodeGeometry
        yNode.position = SCNVector3(0, 0.5, 0)
        yNodeGeometry.firstMaterial?.diffuse.contents = UIColor.green
        self.addChildNode(yNode)

        //3. Create The Z Axis
        let zNode = SCNNode()
        let zNodeGeometry = SCNBox(width: 0.01, height: 0.01, length: 1, chamferRadius: 0)
        zNode.geometry = zNodeGeometry
        zNodeGeometry.firstMaterial?.diffuse.contents = UIColor.blue
        zNode.position = SCNVector3(0, 0, 0.5)
        self.addChildNode(zNode)

        //4. Scale Our Axis
        self.scale = SCNVector3(scale, scale, scale)

    }


    required init?(coder aDecoder: NSCoder) { fatalError("Vizualizer Coder Not Implemented") }
}
Run Code Online (Sandbox Code Playgroud)

可以像这样初始化:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

        let anchorVizualizer = BMOriginVisualizer(scale: 0.5)
        node.addChildNode(anchorVizualizer)

}
Run Code Online (Sandbox Code Playgroud)

希望这将作为对@sj-r 提供的答案的扩展有用。