检测到参考图像时用于播放音频的惰性变量
Lazy var for playing audio when reference image is detected
我想播放参考图像中的单个音频文件。
我会使用 lazy var
加载音频文件然后使用
func getNode(withImageName name: String)
触发播放哪个音频?
可以。
如果您想知道如何使用 SceneKit positional audio
,请阅读 。
如果您在应用中使用 RealityKit positional audio
– 请阅读 this post。
让我们看看您的代码在 lazy var
:
中的样子
lazy var geoAndAudioNode: SCNNode = {
guard let scene: SCNScene = SCNScene(named: "pixar.usdz"),
let node: SCNNode = scene.rootNode.childNode(withName: "model",
recursively: true)
else { return SCNNode() }
let myPath = Bundle.main.path(forResource: "audio", ofType: "mp3")
let myURL = URL(fileURLWithPath: myPath!)
let mySource = SCNAudioSource(url: myURL)!
let audioNode = SCNNode()
let player = SCNAudioPlayer(source: mySource)
node.addChildNode(audioNode)
audioNode.addAudioPlayer(player)
return node
}()
下面是您的代码在 renderer
方法中的样子:
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode,
for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor,
let imageName = imageAnchor.referenceImage.name
else { return }
let geometryNode = retrieveNode(name: imageName)
node.addChildNode(geometryNode)
}
func retrieveNode(name: String) -> SCNNode {
var node = SCNNode()
switch name {
case "geoAndAudioImage": node = geoAndAudioNode
default: break
}
return node
}
}
我想播放参考图像中的单个音频文件。
我会使用 lazy var
加载音频文件然后使用
func getNode(withImageName name: String)
触发播放哪个音频?
可以。
如果您想知道如何使用 SceneKit positional audio
,请阅读
如果您在应用中使用 RealityKit positional audio
– 请阅读 this post。
让我们看看您的代码在 lazy var
:
lazy var geoAndAudioNode: SCNNode = {
guard let scene: SCNScene = SCNScene(named: "pixar.usdz"),
let node: SCNNode = scene.rootNode.childNode(withName: "model",
recursively: true)
else { return SCNNode() }
let myPath = Bundle.main.path(forResource: "audio", ofType: "mp3")
let myURL = URL(fileURLWithPath: myPath!)
let mySource = SCNAudioSource(url: myURL)!
let audioNode = SCNNode()
let player = SCNAudioPlayer(source: mySource)
node.addChildNode(audioNode)
audioNode.addAudioPlayer(player)
return node
}()
下面是您的代码在 renderer
方法中的样子:
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode,
for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor,
let imageName = imageAnchor.referenceImage.name
else { return }
let geometryNode = retrieveNode(name: imageName)
node.addChildNode(geometryNode)
}
func retrieveNode(name: String) -> SCNNode {
var node = SCNNode()
switch name {
case "geoAndAudioImage": node = geoAndAudioNode
default: break
}
return node
}
}