Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARKit和SceneKit。如何根据IOS swift中检测到的图像锚物理宽度触发动作/播放视频_Ios_Swift_Xcode_Swift4_Arkit - Fatal编程技术网

ARKit和SceneKit。如何根据IOS swift中检测到的图像锚物理宽度触发动作/播放视频

ARKit和SceneKit。如何根据IOS swift中检测到的图像锚物理宽度触发动作/播放视频,ios,swift,xcode,swift4,arkit,Ios,Swift,Xcode,Swift4,Arkit,我能够使用ARKit检测图像中的对象,然后我触发一个动作,根据图像大小(检测到的大小的物理大小)播放视频 问题是视频大小调整不当,如下面的屏幕截图所示。 这是我试过的代码。让我知道handleFoundImage功能中有任何缺失/错误 var scnNodeBarn: SCNNode = SCNNode() var currentNode: SCNNode? = nil var currentARImageAnchorIdentifier: UUID? var timer: Timer! /

我能够使用ARKit检测图像中的对象,然后我触发一个动作,根据图像大小(检测到的大小的物理大小)播放视频

问题是视频大小调整不当,如下面的屏幕截图所示。

这是我试过的代码。让我知道handleFoundImage功能中有任何缺失/错误

var scnNodeBarn: SCNNode = SCNNode()
var currentNode: SCNNode? = nil
var currentARImageAnchorIdentifier: UUID?
var timer: Timer!

/// - Tag: ARImageAnchor-Visualizing
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let imageAnchor = anchor as? ARImageAnchor else { return }
    let referenceImage = imageAnchor.referenceImage
    let name = imageAnchor.referenceImage.name!
    print("you found a \(name) image")
    DispatchQueue.main.async {
        self.label.text = "You are watching  \"\(name)\""
    }
    // The following timer fires after 0.6 seconds, but everytime when there found an anchor the timer is stopped.
    // So when there is no ARImageAnchor found the timer will be completed and the current scene node will be deleted and the variable will set to nil
    DispatchQueue.main.async {
        if(self.timer != nil){
            self.timer.invalidate()
        }
        self.timer = Timer.scheduledTimer(timeInterval: 0.6 , target: self, selector: #selector(self.imageLost(_:)), userInfo: nil, repeats: false)
    }
    // Check if there is found a new image on the basis of the ARImageAnchorIdentifier, when found delete the current scene node and set the variable to nil
    if(self.currentARImageAnchorIdentifier != imageAnchor.identifier &&
        self.currentARImageAnchorIdentifier != nil
        && self.currentNode != nil){
        //found new image
        self.currentNode!.removeFromParentNode()
        self.currentNode = nil
    }
    //        updateQueue.async
    DispatchQueue.main.async{
        //If currentNode is nil, there is currently no scene node
        if(self.currentNode == nil){
            handleFoundImage(imageAnchor, node, nameVideo: "Cup.mp4" )
        }
        self.currentARImageAnchorIdentifier = imageAnchor.identifier
        // Delete anchor from the session to reactivate the image recognition
        self.sceneView.session.remove(anchor: anchor)
    }

}

private func handleFoundImage(_ imageAnchor: ARImageAnchor, _ node: SCNNode, nameVideo: String) {
    let name = imageAnchor.referenceImage.name!
    DispatchQueue.main.async {
        self.label.text = "You are watching  \"\(name)\""
    }
    let size = imageAnchor.referenceImage.physicalSize
    let documentsPathURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    let videopath = documentsPathURL?.appendingPathComponent("/3DScenes/\(nameVideo)")
    // 2
    let avPlayerItem = AVPlayerItem(url: videopath!)
    avPlayer = AVPlayer(playerItem: avPlayerItem)
    avPlayer?.play()
    // 3
    NotificationCenter.default.addObserver(
        forName: .AVPlayerItemDidPlayToEndTime,
        object: nil,
        queue: nil) { notification in
            self.avPlayer?.seek(to: .zero)
            self.avPlayer?.play()
    }
    // 4
    let avMaterial = SCNMaterial()
    avMaterial.diffuse.contents = avPlayer
    // 5 HERE NEED TO MAKE CHANGE TO PLAY/DISPLAY AS PER IMAGE SIZE
    let videoPlane = SCNPlane(width: size.width, height: size.height)
    videoPlane.materials = [avMaterial]
    self.scnNodeBarn.transform = node.transform
    scnNodeBarn.geometry = videoPlane
    scnNodeBarn.eulerAngles.x = -.pi / 2
    self.sceneView.scene.rootNode.addChildNode(self.scnNodeBarn)
    self.currentNode = self.scnNodeBarn
}


    @objc func imageLost(_ sender:Timer){
    self.currentNode!.removeFromParentNode()
    self.currentNode = nil
}

如何在swift iOS中显示/播放/显示与图像锚物理大小相同的视频

@KNV。如果您需要解决方案,请回答。@BlackMirrorz。如果你想知道答案,请回答