前提・実現したいこと
スマホ向けARアプリを制作しています。
あらかじめマーカとなる画像をいくつか登録しておき、スマホカメラで画像を認識すると、画像の種類に応じて異なる動画を再生するようにしたいと思っております。
現時点では、どのマーカを読み取っても"最高速度.MP4"という特定の動画しか再生できていません。
"最高速度"という部分を読み取ったマーカの名前と同じにしておくと紐付けされた適当な動画が再生できると考えております。そこで、ソースコードの//ビデオプレーヤ作成1にあります、guard let videoURL = Bundle.main.url(forResource: "最高速度",
withExtension: "mp4")の"最高速度"の位置に適切な変数を配置したいと思うのですが、どのように変数を配置すれば良いでしょうか?
該当箇所
let name = imageAnchor.referenceImage.name! videoURL = Bundle.main.url(forResource: "最高速度", withExtension: "mp4")
該当のソースコード
// MARK: ARImageの認識 private func setupImageDetection() { imageConfiguration = ARImageTrackingConfiguration() guard let referenceImages = ARReferenceImage.referenceImages( inGroupNamed: "AR Images", bundle: nil) else { fatalError("Missing expected asset catalog resources.") } imageConfiguration?.trackingImages = referenceImages } extension ViewController: ARSCNViewDelegate { func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { DispatchQueue.main.async { self.instructionLabel.isHidden = true } if let imageAnchor = anchor as? ARImageAnchor { handleFoundImage(imageAnchor, node) } else if let objectAnchor = anchor as? ARObjectAnchor { handleFoundObject(objectAnchor, node) } } private func handleFoundImage(_ imageAnchor: ARImageAnchor, _ node: SCNNode) { let name = imageAnchor.referenceImage.name!//←imageAnchorに登録されている画像の名前を取り出す。 print("you found a (name) image") let size = imageAnchor.referenceImage.physicalSize if let videoNode = makeDinosaurVideo(size: size) { node.addChildNode(videoNode) node.opacity = 1 } } //ビデオプレーヤの作成 private func makeDinosaurVideo(size: CGSize) -> SCNNode? { // 1 guard let videoURL = Bundle.main.url(forResource: "最高速度", withExtension: "mp4") else { return nil } // 2 let avPlayerItem = AVPlayerItem(url: videoURL) let avPlayer = AVPlayer(playerItem: avPlayerItem) avPlayer.play() // 3 NotificationCenter.default.addObserver( forName: .AVPlayerItemDidPlayToEndTime, object: nil, queue: nil) { notification in avPlayer.seek(to: .zero) avPlayer.play() } // 4 let avMaterial = SCNMaterial() avMaterial.diffuse.contents = avPlayer // 5 let videoPlane = SCNPlane(width: size.width, height: size.height) videoPlane.materials = [avMaterial] // 6 let videoNode = SCNNode(geometry: videoPlane) videoNode.eulerAngles.x = -.pi / 2 return videoNode }
試したこと
該当部分の二箇所が特に重要なところだと目をつけています。nameというもので画像の名前を確認しています。このnameを使うことで、ImageAnchorと同じ名前のMP4を再生できると考えております。
https://tutorialmore.com/questions-602576.htm
こちらのサイトを参考にして変更を試みましたが
//ビデオプレーヤ作成の1//の"最高速度"の部分を変数nameにしてみましたがエラーメッセージが表示されました。
nameを確認している箇所とビデをを作成しているprivate funcが異なるためnameをどのように使えるようにすればいいのかわかりません。
nameをreturnで返すことができればnameをうまく使えそうな気がするのですが、どうすればいいでしょうか?お力添えよろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Xcode バージョン11.0
ios13.1向け
あなたの回答
tips
プレビュー