【问题标题】:Displaying an "ARAnchor" in ARSCNView在 ARSCNView 中显示“ARAnchor”
【发布时间】:2019-02-10 20:07:52
【问题描述】:

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

self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]

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

static let showWorldOrigin: SCNDebugOptions

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

如果,我们该怎么做?

【问题讨论】:

    标签: swift scenekit augmented-reality arkit


    【解决方案1】:

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

    @Rickster 谈到的关于coordinateOrigin.scn 的示例代码可在此处找到:Creating Face Based Experiences

    这是我之前用来可视化 Axis 的一个小 sn-p:

    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 赏金:stackoverflow.com/questions/52025727/…
    • 这超出了我的范围 :) Rickster 可能会知道 :)
    • 我想问你一个关于另一个话题的问题:你需要多长时间为像 Apple 的 SwiftShot 这样的 AR 游戏编写代码(从头开始)? 4-5 个月?
    • 说实话很难。那个时间框架听起来关于写虽然你知道它可能会更少或可能更多:)因为有一个例子可能需要更少:)
    【解决方案2】:

    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
    }
    

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

    sceneView.session.add(anchor:)
    

    【讨论】:

    • 这些球体的方向是什么?也许最好放置一个具有突出面的立方体(并用红色/绿色/蓝色纹理三个正方向 x/y/z)?
    • 是的,你可以制作任何你想要的节点。方向和位置与锚点相同。将它们(ARAnchor 和节点)视为一对
    • 非常感谢,sj-r。
    • 如果您查看 Apple ARKit documentation 页面上的一些示例代码项目,您会发现一个绘制 x/y/z 坐标轴的 coordinateOrigin.scn 文件,这可能是一种方便的方法可视化锚点变换。
    • 非常感谢,rickster!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多