首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中改变SceneKit的环境反响?

在Swift中改变SceneKit的环境反响?
EN

Stack Overflow用户
提问于 2019-08-05 08:03:31
回答 1查看 261关注 0票数 1

我正在尝试在Swift中使用SceneKit获得3d音频效果。

我的scene.rootNode是一个尺寸为100x100x100的长方体几何图形。在scene.rootNode中,我有一个50x5050维度的boxNode。然后在boxNode内部,我让audioNode生成1x1x1维度的声音,以及生成1x1x1维度的cameraNode。位置audioNode是0,0,0,cameraNode的位置是0,0,-10。

为了给人更深的空间感,我想放一个混响。但是,我不能访问SCNView.AVAudioEnvironmentNode。

它可以编译,但环境会导致nil和崩溃。

代码语言:javascript
运行
复制
let environment = sceneView.audioEnvironmentNode
environment.reverbBlend = 0.5 // CRASH!: LLBD
environment.renderingAlgorithm = .HRTFHQ
let reverb = environment.reverbParameters
reverb.enable = true
reverb.loadFactoryReverbPreset(.mediumRoom)

我也尝试过制作自己的AVAudioEnvironment,启用混响,然后赋值给sceneView.audioEnvironmentNode,但XCode说sceneView.audioEnvironmentNode是不可变的。

如果有人能帮我把混响放到我的场景里我会很感激的。

这是我的测试代码。谢谢!

代码语言:javascript
运行
复制
import Cocoa
import AVFoundation
import SceneKit

class ViewController: NSViewController {

    @IBOutlet weak var sceneView: SCNView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let path = Bundle.main.path(forResource: "Sounds/Test_mono.mp3", ofType: nil)
        let url = URL(fileURLWithPath: path!)
        let source = SCNAudioSource(url: url)!
        source.loops = true
        source.shouldStream = false
        source.isPositional = true
        source.load()
        let player = SCNAudioPlayer(source: source)
        if let apn = player.audioNode as? AVAudioPlayerNode {
            apn.renderingAlgorithm = .HRTFHQ
            apn.reverbBlend = 0.5
        }

        let audioNode = SCNNode(geometry: SCNBox(width:1, height:1, length:1, chamferRadius: 0.1))
        let cameraNode = SCNNode(geometry: SCNBox(width:1, height:1, length:1, chamferRadius: 0.1))
cameraNode.camera = SCNCamera()
        let boxNode = SCNNode(geometry: SCNBox(width:50, height:50, length:50, chamferRadius: 1))
        boxNode.addChildNode(audioNode)
        audioNode.position = SCNVector3(x: 0, y: 0, z: 0)
        boxNode.addChildNode(cameraNode)
        cameraNode.position = SCNVector3(x: 0, y: 0, z: -10)

        let scene = SCNScene()
        scene.rootNode.geometry = SCNBox(width:100, height:100, length:100, chamferRadius: 0.1)
        scene.rootNode.addChildNode(boxNode)
        boxNode.position = SCNVector3(x: 0, y: 0, z: 0)

        sceneView.scene = scene
        sceneView.pointOfView = cameraNode
        sceneView.audioListener = cameraNode
        let environment = sceneView.audioEnvironmentNode
        environment.reverbBlend = 0.5 // CRASH!: LLBD
        environment.renderingAlgorithm = .HRTF
        let reverb = environment.reverbParameters
        reverb.enable = true
        reverb.loadFactoryReverbPreset(.mediumRoom)

        audioNode.addAudioPlayer(player)
        let move = SCNAction.moveBy(x:0, y:1, z:0, duration: 1)
        let sequence = SCNAction.sequence([move])
        let loop = SCNAction.repeatForever(sequence)
        audioNode.runAction(loop)


// Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}
EN

回答 1

Stack Overflow用户

发布于 2019-08-09 04:42:45

查看第一个代码段,您不能写入只读。audioEnvironmentNode是一个只读属性,用于对已添加到场景中的SCNPlayer中的音频进行空间化。

查看第二个(更长)代码段,您将创建两个节点并应用混响,但这些节点永远不会添加到场景中。

根据Apple Docs for SCNPlayer的说法

SCNAudioPlayer对象控制SceneKit场景中位置音频源的播放。若要使用位置音频,请首先创建可重用的SCNAudioSource或AVAudioNode对象以提供音频流。然后,创建一个音频播放器来控制该音频源的播放。最后,将音频播放器附加到SCNNode对象,以便基于该节点相对于场景的audioListener节点的位置进行空间化的3D音频播放。

如果查看您的代码,即使您已经创建了player : SCNPlayer并通过强制转换为apn = player.audioNode as? AVAudioPlayerNode添加了混响,但在代码中的任何一点都没有将任一节点附加到场景中的SCNNode。

我建议您将apn作为子对象添加到节点,然后将其添加到场景中。

如果您已经这样做了,但仍然遇到问题,请更新上面的代码片段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57351004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档