Post

Replies

Boosts

Views

Activity

Tracking different videos on multiple Images
Hello ! I am currently trying to track multiple images with the ARKit - there should be a video tracked on every detected image like this: IMAGE A gets VIDEO a - IMAGE B gets VIDEO B. I already managed to detect my two images and track a plane on them - but now I don't really know how to match the right video with the right image. I'm always facing some errors. Here is my code so far: import SceneKit import ARKit import AVFoundation import SpriteKit class ViewController: UIViewController, ARSCNViewDelegate {   @IBOutlet var sceneView: ARSCNView!           override func viewDidLoad() {     super.viewDidLoad()           // Set the view's delegate     sceneView.delegate = self     sceneView.autoenablesDefaultLighting = true                     // Show statistics such as fps and timing information     sceneView.showsStatistics = true           // Create a new scene     let scene = SCNScene(named: "art.scnassets/shot1.scn")!           // Set the scene to the view     sceneView.scene = scene   }      override func viewWillAppear(_ animated: Bool) {     super.viewWillAppear(animated)           // Create a session configuration     let configuration = ARImageTrackingConfiguration()           //Programm sagen nach welchen Bildern es suchen soll:     if let trackingImages = ARReferenceImage.referenceImages(inGroupNamed: "Images", bundle: Bundle.main){       configuration.trackingImages = trackingImages       configuration.maximumNumberOfTrackedImages = 2           }     // Run the view's session     sceneView.session.run(configuration)   }       override func viewWillDisappear(_ animated: Bool) {     super.viewWillDisappear(animated)           // Pause the view's session     sceneView.session.pause()   }       //Node corresponding to a newly added anchor (Echtwelt Position und Orientation) Expects to return SCENE NODE   func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {           let node = SCNNode()     //Checken, ob gefundener Anker ein ARImageAnchor is     if let imageAnchor = anchor as? ARImageAnchor{     let size = imageAnchor.referenceImage.physicalSize //image Anchor gleich groß wie Echtgröße               //PLANE       let plane = SCNPlane(width: size.width, height: size.height) //Fläche erstellt mit Variable size (Echtgröße)       plane.firstMaterial?.diffuse.contents = UIColor.white // Material von plane festgelegt = weiße Farbe       let planeNode = SCNNode(geometry: plane)       planeNode.eulerAngles.x = -.pi / 2       node.addChildNode(planeNode)               //VIDEOS               let shot1URL = Bundle.main.url(forResource: "shot1", withExtension: "mp4")!       let videoPlayerShot1 = AVPlayer(url: shot1URL)       let shot2URL = Bundle.main.url(forResource: "shot2", withExtension: "mp4")!       let videoPlayerShot2 = AVPlayer(url: shot2URL)               let videoScene1 = SKScene(size: CGSize(width: 4096.0, height: 3072.0))       let videoScene2 = SKScene(size: CGSize(width: 4630.0, height: 3274.0))               let videoNode1 = SKVideoNode(avPlayer: videoPlayerShot1)         videoNode1.position = CGPoint(x: videoScene1.size.width/2, y: videoScene1.size.height/2) // durch zwei um mittig zu sein         videoNode1.size = videoScene1.size         videoNode1.yScale = -1 // flips video damits nd kopfüber is               videoScene1.addChild(videoNode1)               let videoNode2 = SKVideoNode(avPlayer: videoPlayerShot2)         videoNode2.position = CGPoint(x: videoScene2.size.width/2, y: videoScene2.size.height/2) // durch zwei um mittig zu sein         videoNode2.size = videoScene2.size         videoNode2.yScale = -1 // flips video damits nd kopfüber is                         videoScene2.addChild(videoNode2)               if imageAnchor.referenceImage.name == "shot1Image" {         let shot1 = planeNode.childNode(withName: "shot1", recursively: false)         shot1!.geometry?.firstMaterial?.diffuse.contents = videoScene1         videoNode1.play()       } else{         let shot2 = planeNode.childNode(withName: "shot2", recursively: false)         shot2!.geometry?.firstMaterial?.diffuse.contents = videoScene2         videoNode2.play()       }                   }           return node         } } When I want to run the software on my IPhone it always says com.apple.scenekit.scnview-renderer (10): Fatal error: Unexpectedly found nil while unwrapping an Optional value so my expressions "shot1" and "shot2" are nil But I think that that's not the only thing I'm doing wrong right? If would be glad if somebody could help me!!
1
0
599
Dec ’21