ARKit和SceneKit。如何根据IOS swift中检测到的图像锚物理宽度触发动作/播放视频
我能够使用ARKit检测图像中的对象,然后我触发一个动作,根据图像大小(检测到的大小的物理大小)播放视频 问题是视频大小调整不当,如下面的屏幕截图所示。 这是我试过的代码。让我知道handleFoundImage功能中有任何缺失/错误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! /
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。如果你想知道答案,请回答