【发布时间】:2019-02-25 18:25:59
【问题描述】:
我有一个应用程序可以检测一些图像并做一些效果(主要是在图像内播放视频) 只要检测到Image时触发func渲染器,有没有检测到Image时触发的func?
当没有检测到图像时,我想停止播放视频。 谢谢!
【问题讨论】:
我有一个应用程序可以检测一些图像并做一些效果(主要是在图像内播放视频) 只要检测到Image时触发func渲染器,有没有检测到Image时触发的func?
当没有检测到图像时,我想停止播放视频。 谢谢!
【问题讨论】:
如果您查看文档,您会发现 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){
}
}
}
}
希望对你有帮助...
【讨论】:
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 {