在ARSCNView中显示"ARAnchor"

3
在ARKit中,我们可以通过ARSession中的.showFeaturePoints类型属性来可视化检测到的“特征点云”。
self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]

此外,我们可以显示一个坐标轴可视化工具,用于指示AR世界坐标系的位置和方向。
static let showWorldOrigin: SCNDebugOptions

但是在ARSCNView中是否可以显示ARAnchors

如果可以,我们该如何做呢?

2个回答

6
仅跟进@sj-r和@Rickster的评论。
@Rickster所提到的关于coordinateOrigin.scn的示例代码可以在这里找到:创建基于面部的AR体验 以下是我之前用过的一个小片段,用于可视化轴:
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") }
}

这可以这样初始化:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

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

}

希望这能对@sj-r提供的答案有所补充,让您有所帮助。

这个问题还有50美元的赏金:https://dev59.com/DVQK5IYBdhLWcg3wVuis - Andy Jazz
那超出了我的能力范围 :) Rickster 可能会知道 :) - BlackMirrorz
我想问你一个关于另一个话题的问题:如果要从零开始编写一个类似于苹果公司的SwiftShot的AR游戏,你需要多长时间编写代码?4-5个月吗? - Andy Jazz
说实话很难说。那个时间框架听起来大概是对的,但你知道可能会更少或更多 :) 因为有一个例子,所以可能需要更少的时间 :) - BlackMirrorz

5

ARAnchor 仅仅表示“位置和方向”。你可以看到的东西是 SCNNode

你可以通过 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
}

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

sceneView.session.add(anchor:)

这些球体的方向是什么?也许最好放置具有凸出面的立方体(并使用红/绿/蓝颜色纹理三个正方向x/y/z)? - Andy Jazz
2
当然可以创建任何节点。方向和位置与锚点相同。将它们(ARAnchor 和节点)视为一对。 - sj-r
非常感谢,sj-r。 - Andy Jazz
2
如果您查看Apple ARKit文档页面上的一些示例代码项目,您会发现一个名为coordinateOrigin.scn的文件,用于绘制x/y/z坐标轴,这可能是可视化锚点变换的有用方式。 - rickster
非常感谢你,rickster! - Andy Jazz
我怎样才能停止追踪现实世界的物体并保持这个sphereNode在场景中出现的位置呢?! - Ahmadreza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接