Если вы посмотрите на документацию, вы увидите, что 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){
}
}
}
}
Надеюсь, это поможет ...