【问题标题】:ARKIT 2.0 - ARImageTrackingConfigurationARKIT 2.0 - ARImageTrackingConfiguration
【发布时间】:2019-02-25 18:25:59
【问题描述】:

我有一个应用程序可以检测一些图像并做一些效果(主要是在图像内播放视频) 只要检测到Image时触发func渲染器,有没有检测到Image时触发的func?

当没有检测到图像时,我想停止播放视频。 谢谢!

【问题讨论】:

    标签: ios swift arkit


    【解决方案1】:

    如果您查看文档,您会发现 ARImageAnchor 符合 ARTrackable Protocol

    被 ARKit 类所采用,例如 ARFaceAnchor 类, 表示场景中的移动对象。

    ARSCNView 和 ARSKView 自动隐藏锚点的节点 isTracked 属性为假。

    ARKit 会自动管理此类对象的表示形式 活跃的 AR 会话,确保真实世界对象的变化 位置和方向(锚的变换属性)是 反映在相应的 ARKit 对象中。 isTracked 属性 指示当前变换是否有效 真实世界对象的运动。

    因此,您可以检测您的 ARImageAnchor 当前是否正在使用类似这样的东西作为启动器进行跟踪:

    //--------------------------
    //MARK: -  ARSessionDelegate
    //--------------------------
    
    extension ViewController: ARSessionDelegate{
    
        func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    
            //1. Enumerate Our Anchors To See If We Have Found Our Target Anchor
            for anchor in anchors{
    
                if let imageAnchor = anchor as? ARImageAnchor, imageAnchor == videoAnchor{
    
                    //2. If The ImageAnchor Is No Longer Tracked Then Handle The Event
                    if !imageAnchor.isTracked{
    
                    }else{
    
    
                    }
                }
            }
         }
    }
    

    其中videoAnchor 只是一个ARImageAnchor 我已将引用存储为Global Variable

    或者,如果您想在特定 SCNNode 位于相机的 Frostrum 之外时取消操作,您可以执行以下操作:

    /// Stops All VideoPlayers Outside Of Frostrum
    ///
    /// - Parameter currentVideoNode: SCNNode
    func stopAllVideoPlayersOutsideOfPointOfView(){
    
        //a. Get The Current Point Of You & Our SCNScene
        guard let currentPointOfView = self.augmentedRealityView?.pointOfView,
              let scnView = self.augmentedRealityView else { return }
    
        //b. Loop Through All The Hierachy
        if let childNodes = self.augmentedRealityView?.scene.rootNode.childNodes{
    
            childNodes.forEach { (node) in
    
                //c. If Our Node Isn't In View Of The Camera Then Stop The Video
                if !scnView.isNode(node, insideFrustumOf: currentPointOfView){
    
    
                }
            }
    
        }
    }
    

    希望对你有帮助...

    【讨论】:

    • 很抱歉打扰你……我正在为一个 SceneKit 问题而苦苦挣扎,你能帮帮我吗?提问:stackoverflow.com/questions/52428397/…
    • 非常感谢。我已经尝试过你的代码,但看起来它永远不会被触发,我想我做错了什么。我在视图控制器类之前添加了它,并替换了简单打印(“我在”)的逻辑。 var imageAnchor = [ARImageAnchor]() extension ViewController: ARSessionDelegate{ func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { //1.枚举我们的锚点,看看我们是否找到了我们的目标锚点,用于锚点中的锚点{ print("I am IN") } } }
    • 你设置了 ARSession 代理吗?
    • var imageAnchor = [ARImageAnchor]() extension ViewController: ARSessionDelegate{ func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { //1. Enumerate Our Anchors To See If We Have Found Our Target Anchor for anchor in anchors{ print("I am IN") } } } class ViewController: UIViewController, ARSCNViewDelegate {
    猜你喜欢
    • 2020-07-17
    • 2019-01-30
    • 1970-01-01
    • 2018-12-16
    • 2019-01-29
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多