如何判断检测到的是哪个参考对象?

问题描述 投票:0回答:1

我有一个 ARKit 应用程序,可以检测大量对象,然后将 3D 对象放置在它们上方。我想更改检测到的对象上方显示的 3D 对象的文本,但无法弄清楚如果检测到 y 对象如何执行 x 功能。

我的 AR 扫描/对象集合位于一个名为“图库”的组中,我的代码如下所示:

class ViewController: UIViewController, ARSCNViewDelegate {
    @IBOutlet var sceneView: ARSCNView!
    var arrowAnchor:ARAnchor?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Set the view's delegate
        sceneView.delegate = self
        sceneView.showsStatistics = true
        sceneView.autoenablesDefaultLighting = true
        sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        //Create ARWorldTrackingConfiguration object and load your garrey asset group.
        //You can add multiple ARObject file into ar asset group,
        let configuration = ARWorldTrackingConfiguration()
        guard let referenceObjects = ARReferenceObject.referenceObjects(inGroupNamed: "gallery", bundle: nil) else {
            fatalError("Missing expected asset catalog resources.")
        }
        configuration.detectionObjects = referenceObjects
        sceneView.session.run(configuration)

    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        // Pause the view's session
        sceneView.session.pause()
    }

    func session(_ session: ARSession, didFailWithError error: Error) {
        // Present an error message to the user
    }

    func sessionWasInterrupted(_ session: ARSession) {
        // Inform the user that the session has been interrupted, for example, by presenting an overlay
    }

    func sessionInterruptionEnded(_ session: ARSession) {
        // Reset tracking and/or remove existing anchors if consistent tracking is required
    }

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        if let objectAnchor = anchor as? ARObjectAnchor {
            let translation = objectAnchor.transform.columns.3
            let pos = float3(translation.x, translation.y, translation.z)
            let nodeArrow = getArrowNode()
            nodeArrow.position = SCNVector3(pos)
            nodeArrow.constraints = [SCNBillboardConstraint()]
            sceneView.scene.rootNode.addChildNode(nodeArrow)

            let text = SCNText(string: "Asset", extrusionDepth: 1)
            let material = SCNMaterial()
            material.diffuse.contents = UIColor.white
            text.materials = [material]
            let node = SCNNode()
            let pos2 = float3(translation.x-0.01, translation.y+0.22, translation.z-0.0)
            node.position = SCNVector3(pos2)
            node.scale = SCNVector3(x: 0.003, y: 0.003, z: 0.003)
            node.geometry = text
            node.constraints = [SCNBillboardConstraint()]
            sceneView.scene.rootNode.addChildNode(node)

        }
    }

    func getArrowNode() -> SCNNode {
        let sceneURL = Bundle.main.url(forResource: "arrow_yellow", withExtension: "scn", subdirectory: "art.scnassets")!
        let referenceNode = SCNReferenceNode(url: sceneURL)!
        referenceNode.load()
        return referenceNode
    }

    func getTextNode() -> SCNNode {
        let sceneURL = Bundle.main.url(forResource: "text", withExtension: "scn", subdirectory: "art.scnassets")!
        let referenceNode = SCNReferenceNode(url: sceneURL)!
        referenceNode.load()
        return referenceNode
    }

}

如何根据检测到的参考对象执行某些代码块?

ios swift augmented-reality arkit
1个回答
0
投票

这个小魔法咒语正是我所需要的:

    let objectName = objectAnchor.referenceObject.name

我使用了这样的代码:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    if let objectAnchor = anchor as? ARObjectAnchor {
        
        let objectName = objectAnchor.referenceObject.name
        
        let translation = objectAnchor.transform.columns.3
        let pos = float3(translation.x, translation.y, translation.z)
        let nodeArrow = getArrowNode()
        nodeArrow.position = SCNVector3(pos)
        nodeArrow.constraints = [SCNBillboardConstraint()]
        sceneView.scene.rootNode.addChildNode(nodeArrow)
        
        let text = SCNText(string: objectName, extrusionDepth: 1)
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.white
        text.materials = [material]
        let node = SCNNode()
        let pos2 = float3(translation.x-0.01, translation.y+0.22, translation.z-0.0)
        node.position = SCNVector3(pos2)
        node.scale = SCNVector3(x: 0.003, y: 0.003, z: 0.003)
        node.geometry = text
        node.constraints = [SCNBillboardConstraint()]
        sceneView.scene.rootNode.addChildNode(node)
        
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.