質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

428閲覧

Swift ARKit 複数のオブジェクトが異なる音声が再生されるようにしたいです。

oyshwk46

総合スコア15

ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/02/10 10:17

編集2019/02/11 11:09

前提・実現したいこと

Xcode Swift4にてARKitを用い、AR空間にあるオブジェクトをタップすると音が再生されるというアプリを作っています。
最終的には、オブジェクトを複数配置し、それぞれ別の音が鳴るようにしたいと考えています。

例)オブジェクトAは音声1を再生、オブジェクトBは音声2を再生

発生している問題・エラーメッセージ

オブジェクトを2個配置し、同じ音を再生させることは出来たのですが、オブジェクトごとに違う音声を再生させることができません。

該当のソースコード

Swift

1import UIKit 2import SceneKit 3import ARKit 4import AVFoundation 5 6 7class ViewController: UIViewController, ARSCNViewDelegate { 8 9 @IBOutlet var sceneView: ARSCNView! 10 11 let node1 = SCNNode() 12 let node2 = SCNNode() 13 var audioPlayer1:AVAudioPlayer! 14 var audioPlayer2:AVAudioPlayer! 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 // Set the view's delegate 20 sceneView.delegate = self 21 // sceneView.debugOptions = [.showWorldOrigin, .showFeaturePoints] 22 23 node1.geometry = SCNSphere(radius: 1) 24 let marerial1 = SCNMaterial() 25 marerial1.diffuse.contents = UIColor(red: 255/255, green: 0/255, blue: 0/255, alpha: 1.0) 26 node1.geometry?.materials = [marerial1] 27 28 node2.geometry = SCNSphere(radius: 1) 29 let marerial2 = SCNMaterial() 30 marerial2.diffuse.contents = UIColor(red: 0/255, green: 255/255, blue: 0/255, alpha: 1.0) 31 node2.geometry?.materials = [marerial2] 32 33 34 let phi1:Double = 252.292 35 let PHI1:Double = phi1 * (.pi/180) 36 let theta1:Double = 69.663 37 let THETA1:Double = theta1 * (.pi/180) 38 39 let phi2:Double = 246 40 let PHI2:Double = phi2 * (.pi/180) 41 let theta2:Double = 80 42 let THETA2:Double = theta2 * (.pi/180) 43 44 let r:Double = 100 45 46 let x1:Double = r * sin(PHI1) * cos(THETA1) 47 let y1:Double = r * sin(THETA1) * sin(PHI1) 48 let z1:Double = r * cos(THETA1) 49 50 let x2:Double = r * sin(PHI2) * cos(THETA2) 51 let y2:Double = r * sin(THETA2) * sin(PHI2) 52 let z2:Double = r * cos(THETA2) 53 54 node1.position = SCNVector3(Double(y1), Double(z1), -Double(x1)) 55 node2.position = SCNVector3(Double(y2), Double(z2), -Double(x2)) 56 57 sceneView.scene.rootNode.addChildNode(node1) 58 sceneView.scene.rootNode.addChildNode(node2) 59 60 let audioPath1 = Bundle.main.path(forResource: "sheep-cry1", ofType:"mp3")! 61 let audioPath2 = Bundle.main.path(forResource: "dog1", ofType:"mp3")! 62 63 let audioUrl1 = URL(fileURLWithPath: audioPath1) 64 let audioUrl2 = URL(fileURLWithPath: audioPath2) 65 66 var audioError1:NSError? 67 do{ 68 audioPlayer1 = try AVAudioPlayer(contentsOf: audioUrl1) 69 } catch let error as NSError { 70 audioError1 = error 71 audioPlayer1 = nil 72 } 73 if let error = audioError1 { 74 print("Error (error.localizedDescription)") 75 } 76 77 var audioError2:NSError? 78 do{ 79 audioPlayer2 = try AVAudioPlayer(contentsOf: audioUrl2) 80 } catch let error as NSError { 81 audioError2 = error 82 audioPlayer2 = nil 83 } 84 if let error = audioError2 { 85 print("Error (error.localizedDescription)") 86 } 87 88 audioPlayer1.delegate = self as? AVAudioPlayerDelegate 89 audioPlayer1.prepareToPlay() 90 audioPlayer2.delegate = self as? AVAudioPlayerDelegate 91 audioPlayer2.prepareToPlay() 92 } 93 94 95 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 96 guard let touchLocation = touches.first?.location(in: sceneView), 97 let hitResults = sceneView.hitTest(touchLocation, options: [:]).first else { return } 98 99 let node = hitResults.node 100 101 if node.name == "node1" { 102 103 audioPlayer1.play() 104 105 } else if node.name == "node2" { 106 107 audioPlayer2.play() 108 109 } 110 } 111 112 override func viewWillAppear(_ animated: Bool) { 113 super.viewWillAppear(animated) 114 115 let configuration = ARWorldTrackingConfiguration() 116 117 sceneView.session.run(configuration) 118 119 } 120 121 override func viewWillDisappear(_ animated: Bool) { 122 super.viewWillDisappear(animated) 123 124 // Pause the view's session 125 sceneView.session.pause() 126 } 127} 128

試したこと

オブジェクトを1つ配置し、音が再生されるといったコードは以下になります。

swift

1import UIKit 2import SceneKit 3import ARKit 4import AVFoundation 5 6 7class ViewController: UIViewController, ARSCNViewDelegate { 8 9 @IBOutlet var sceneView: ARSCNView! 10 let node1 = SCNNode() 11 var audioPlayer1:AVAudioPlayer! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 // Set the view's delegate 17 sceneView.delegate = self 18 // sceneView.debugOptions = [.showWorldOrigin, .showFeaturePoints] 19 20 // let node1 = SCNNode() 21 //node.geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0) 22 node1.geometry = SCNSphere(radius: 1) 23 let marerial1 = SCNMaterial() 24 marerial1.diffuse.contents = UIColor(red: 255/255, green: 0/255, blue: 0/255, alpha: 1.0) 25 node1.geometry?.materials = [marerial1] 26 27 let phi1:Double = 252.292 28 let PHI1:Double = phi1 * (.pi/180) 29 let theta1:Double = 69.663 30 let THETA1:Double = theta1 * (.pi/180) 31 32 let r:Double = 100 33 34 let x1:Double = r * sin(PHI1) * cos(THETA1) 35 let y1:Double = r * sin(THETA1) * sin(PHI1) 36 let z1:Double = r * cos(THETA1) 37 38 node1.position = SCNVector3(Double(y1), Double(z1), -Double(x1)) 39 sceneView.scene.rootNode.addChildNode(node1) 40 41 let audioPath1 = Bundle.main.path(forResource: "sheep-cry1", ofType:"mp3")! 42 let audioUrl1 = URL(fileURLWithPath: audioPath1) 43 44 var audioError:NSError? 45 do{ 46 audioPlayer1 = try AVAudioPlayer(contentsOf: audioUrl1) 47 } catch let error as NSError { 48 audioError = error 49 audioPlayer1 = nil 50 } 51 if let error = audioError { 52 print("Error (error.localizedDescription)") 53 } 54 55 audioPlayer1.delegate = self as? AVAudioPlayerDelegate 56 audioPlayer1.prepareToPlay() 57 } 58 59 @IBAction func tap(_ sender: UITapGestureRecognizer) { 60 61 let sceneView = sender.view as!ARSCNView 62 let touchLocation = sender.location(in: sceneView) 63 let hitResults = sceneView.hitTest(touchLocation, options: [:]) 64 65 if !hitResults.isEmpty { 66 audioPlayer1.play() 67 } 68 else { 69 audioPlayer1.stop() 70 } 71 } 72 73 override func viewWillAppear(_ animated: Bool) { 74 super.viewWillAppear(animated) 75 76 let configuration = ARWorldTrackingConfiguration() 77 78 sceneView.session.run(configuration) 79 80 } 81 82 override func viewWillDisappear(_ animated: Bool) { 83 super.viewWillDisappear(animated) 84 85 // Pause the view's session 86 sceneView.session.pause() 87 } 88} 89

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

ノードの名前をつけたら出来ました。

投稿2019/02/12 08:15

oyshwk46

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問