ARKIT 2.0 - ARImageTrackingConfiguration - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть приложение, которое обнаруживает несколько изображений и выполняет некоторые эффекты (в основном воспроизводит видео внутри изображения), если рендерер функций запускается при обнаружении изображения, есть ли функция, которая запускается при отсутствии изображенияОбнаружено?

Когда изображение не обнаружено, я бы хотел остановить воспроизведение видео.Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Если вы посмотрите на документацию, вы увидите, что ARImageAnchor соответствует ARTrackable Protocol, который:

принят классами ARKit, такими как класс ARFaceAnchor, которые представляютперемещение объектов в сцене.

ARSCNView и ARSKView автоматически скрывают узлы для якорей, свойство isTracked которых имеет значение false.

ARKit автоматически управляет представлениями таких объектов в активном сеансе AR, гарантируя, что изменения вположение и ориентация объекта реального мира (свойство transform для якорей) отражается в соответствующих объектах 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){


            }
        }

    }
}

Надеюсь, это поможет ...

...