go语言视频网站开发网站源码在线下载
- 作者: 多梦笔记
- 时间: 2026年02月16日 16:40
当前位置: 首页 > news >正文
go语言视频网站开发,网站源码在线下载,c 做网站看什么书,求个网站好人有好报20223D音频 在前面系列中#xff0c;我们了解如何定位追踪用户#xff08;实际是定位用户的移动设备#xff09;的位置与方向#xff0c;然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了#xff0c;则通过VIO 和 IMU更新用户的位置与方向信息…3D音频 在前面系列中我们了解如何定位追踪用户实际是定位用户的移动设备的位置与方向然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了则通过VIO 和 IMU更新用户的位置与方向信息更新投影矩阵这样就可以把虚拟物体固定在空间的某点上这个点就是锚点从而达到以假乱真的视觉体验。 3D音效处理的目的是让用户进一步相信AR 应用虚拟生成的数字世界是真实的营造沉浸的AR体验。事实上3D音效在电影、电视、电子游戏中被广泛应用但在AR 场景中3D声音的处理有其特别之处类似于电影采用的技术并不能很好地解决 AR中3D音效的问题。 在电影院中观众的位置是固定的因此可以通过在影院的四周都加装上音响设备通过设计不同位置音响设备上声音的大小和延迟就能给观众营造逼真的3D 声音效果。经过大量的研究与努力人们根据人耳的结构与声音的传播特性开发出了很多技术可以只用两个音响或者耳机就能模拟出3D音效这种技术叫双耳声Binaural Sound它的技术原理如图11-2所示。 在图11-2中从声源发出来的声音会直接传播到左耳和右耳但因为左耳离声源近所以声音会先到达左耳再到达右耳由于在传播过程中的衰减左耳听到的声音要比右耳大这是直接的声音信号大脑会接收到两只耳朵传过来的信号。同时从声源发出的声音也会被周围的物体反射这些反射与直接信号相比有一定的延迟并且音量更小这些是间接的声音信号。大脑会采集到直接信号与所有的间接信号并比较从左耳与右耳采集的信号经过分析计算从而达到定位声源的效果。在了解大脑的工作模式后就可以通过算法控制两个音响或者耳机的音量与延迟来达到模拟3D声源的效果让大脑产生出虚拟的3D声场效果。 3D声场原理 3D声场也称为三维音频、虚拟3D音频、双耳音频等它是根据人耳对声音信号的感知特性使用信号处理的方法对到达两耳的声音信号进行模拟以重建复杂的空间声场。 通俗地说就是把耳朵以外的世界看作一个系统对任意一个声音源在耳膜处接收到信号后三维声场重建就是把两个耳朵接收到的声音尽可能准确地模拟出来让人产生听到三维音频的感觉。 如前所述当人耳在接收到声源发出的声音时人的耳廓、耳道、头盖骨、肩部等对声波的折射、绕射和衍射及鼓膜接收到的信息会被大脑所接收大脑通过经验对声音的方位进行判断。与大脑工作原理类似在计算机中通过信号处理的数学方法构建头部相关传输函数HeadRelated Transfer Functions, HRTF根据多组的滤波器计算人耳接收到的声源的“位置信息”。 目前3D声场重建技术口冬比校成戴们不时加送之上术都假设用户是静止的或者说与用户位置无关而在 AR应用中情况却有很大不同AR应用的用户是随时移动的这意味着用户周围的3D声音也需要调整这一特殊情况导致目前的3D声场重建技术在AR应用时失效。 RealityKit 中的 3D 音效 ARKit 通过世界跟踪功能定位声源位置然后根据用户与声源的相对位置和方向自动混音将3D音频技术带人 AR中。在 AR场景中放置一个声源当用户接近或远离时声音音量大小会自动增加或减弱当用户围绕声源旋转时声音也会呈现沉浸式的3D效果。在 RealityKit 中使用3D音效的典型代码如代码如下所示稍后我们将对代码进行详细解析。 // // Audio3DView.swift // ARKitDeamo // // Created by zhaoquan du on 2024/3/22. //import SwiftUI import ARKit import RealityKit import Combinestruct Audio3DView: View {var body: some View {Audio3DViewContainer().navigationTitle(3D音频).edgesIgnoringSafeArea(.all)} }struct Audio3DViewContainer:UIViewRepresentable {func makeUIView(context: Context) - some ARView {let arView ARView(frame: .zero)let config ARWorldTrackingConfiguration()config.planeDetection .horizontal//createPlane(arView: arView)arView.session.run(config)arView.createAudioPlane()return arView}func updateUIView(_ uiView: UIViewType, context: Context) {}static var audioEvent : Cancellable!func createPlane(arView:ARView){let planAnchor AnchorEntity(plane: .horizontal)let boxMesh MeshResource.generateBox(size: 0.2)let boxMaterial SimpleMaterial(color: .red, isMetallic: true)let boxEntity ModelEntity(mesh: boxMesh, materials: [boxMaterial])guard let audio try? AudioFileResource.load(named: fox.mp3,in: .main, inputMode: .spatial,loadingStrategy: .preload,shouldLoop: false) else {return}let audioControler boxEntity.prepareAudio(audio)audioControler.play()boxEntity.generateCollisionShapes(recursive: false)planAnchor.addChild(boxEntity)arView.scene.addAnchor(planAnchor)arView.installGestures(for: boxEntity)Audio3DViewContainer.audioEvent arView.scene.subscribe(to: AudioEvents.PlaybackCompleted.self) { event inprint(音频播放完毕)}} } var audioEvent : Cancellable! extension ARView{func createAudioPlane(){do{let planeAnchor AnchorEntity(plane:.horizontal)let boxMesh MeshResource.generateBox(size: 0.2)let boxMaterial SimpleMaterial(color:.red,isMetallic: true)let boxEntity ModelEntity(mesh:boxMesh,materials:[boxMaterial])let audio try AudioFileResource.load(named:fox.mp3,in:.main,inputMode: .spatial,loadingStrategy: .preload,shouldLoop: false)boxEntity.playAudio(audio)let audioController boxEntity.prepareAudio(audio)audioController.play()boxEntity.generateCollisionShapes(recursive: false)planeAnchor.addChild(boxEntity)self.scene.addAnchor(planeAnchor)self.installGestures(.all,for:boxEntity)audioEvent self.scene.subscribe(to: AudioEvents.PlaybackCompleted.self){ event inprint(音频播放完毕)}}catch{print(Error Loading audio file)}} }#Preview {Audio3DView() }编译运行 AR 应用使用耳机注意耳机上的左右耳塞勿戴反一般会标有I.和 R字样或者双通道音响体验3D音效在检测到的平面放置虛拟立方体对象后移动手机或者旋转手机朝向体验在 AR场景中声源定位的效果。 从代码清单 11-3中我们可以看出在 RealityKit 中使用3D音频分为3步 1 加载音频。 2设置音频播放参数。 3将音频放置到 AR 场景中并播放。 下面我们针对这3个步骤进行详细学习。在 RealityKit 中使用音频必须将音频加载为 AudioResource或者其子类 AudioFileResource类型对象才能正确播放通常使用 AudioFileResource 类将音频从文件系统或者 URL 加载到内存中该类有4个方法可以同步/异步从文件/URL 中加载音频如表11-2所示。 表 11-2 AudioFileResource 类加载音频方法 方法 描述 load named: String, in: BundleinputMode: AudioResource. InputModeloadingStrategy: AudioFileResource. LoadingStrategy,shouldLoop: Bool— AudioFileResource 同步从程序 Bundle 中加载音频 loadAsyncnamed: String,in: Bundle inputMode: AudioResource. InputModeloadingStrategy: AudioFileResource. LoadingStrategyshouldLoop: Bool— LoadRequest AudioFileResource 异步从程序 Bundle 中加载音频 load ( contentsOf: URL, withName: String?, inputMode: AudioResource. InputMode,loadingStrategy: AudioFileResource. LoadingStrategy,shouldLoop Bool) - AudioFileResource 同步从 URL 中加载音频 load Async(contentsOf: URL, withName: String?, inputMode: AudioResource. InputMode,loadingStrategy: AudioFileResource. LoadingStrategy,shouldLoop Bool) - LoadRequest AudioFileResource 异步从 URL 中加载音频 在 RealityKit 中加载音频与加载模型一样每一种同步加载方法都有对应的异步加载方法。加载方法中的参数因加载方法不同而不同基本的参数及其意义如表11-3所示。 表11-3 加载音频方法中各参数的意义 描述 方法 named 从 Bundle 中加载时文件路径与名称 contentsOf 从 URL 中加载时的 URL 地址 withName 从 URL 中加载时的音频名称 in 从程序 Bundle 中加载时音频所在 Bundle 名称 shouldLoop 布尔值是否循环播放 loadingStrategy AudioFileResource. LoadingStrategy 枚举类型指定加载音频时的策略共有两个枚举值preload 预加载音频在使用之前将音频加载到内存中、stream流媒体编码边加载边播放。通常在使用时preload 适合短小、内存占用少播放频度高的音频而 stream适合较长、播放频度低的音频 inputMode AudioResource. InputMode 枚举类型指定3D音频类型共有3个枚举值nonSpatial不使用3D音效、spatial使用空间音效、ambient环境音效声音不会随距离发生音量变化但声音可以反映方向变化如用户围绕声源转动时音效会发生变化 在加载音频完成后可以通过实体对象的 prepareAudio_方法获取一个 AudioPlaybackController 类型的音频控制器利用该控制器可以使用其 play、pause、stop方法控制音频的播放可以通过isPlaying 属性获取音频的播放状态还可以设置音频的播放增益gain、速度speed、混音reverb SendL.evel及衰減fade方法和音频播放完后的回调completionHandler可以满足音频使用的各类个性化需求。 通常在 AR中使用3D音频需要将音频绑定到实体对象Entity上当实体对象放置在场景中时实体对象所在的空间位置即为声源位置RealityKit 会根据用户设备所在空间位置与声源位置进行3D音效模拟营造沉浸式的声场效果。 利用 AudioPlaybackController 类可以很方便地控制音频的播放而且可以重复地进行暂停、播放等操作但如果只需要一次性地播放也可以不使用该类而直接使用boxEntity. playAudioaudio这种方法更简洁当音频播放完后即结束特别适合3D物体音效模拟如子弹击中柽物时的音频播放。 在使用 AudioPlaybackController 类控制音频播放时可以通过其 completionHandler 属性设置音频播放完后的回调函数。除此之外也可以通过订阅 AudioEvents 事件进行后续处理目前音频只有一个AudioEvents. PlaybackCompleted 事件即音频播放完毕事件。 在订阅 AudioEvents事件时有两点需要注意一是保存事件订阅的引用不然无法捕获事件具体可参阅第2章相关内容三是只有当 shouldLoop 设置为 false即不循环播放时才会触发 AudioEvents.PlaybackCompleted 事件。
- 上一篇: google网站增加关键词百度搜索如何去广告
- 下一篇: go语言做网站网页制作软件排行榜
相关文章
-
google网站增加关键词百度搜索如何去广告
google网站增加关键词百度搜索如何去广告
- 站长
- 2026年02月16日
-
google网站排名查询电脑游戏排行榜2020前十名
google网站排名查询电脑游戏排行榜2020前十名
- 站长
- 2026年02月16日
-
google网站登录入口手机上的html编辑器
google网站登录入口手机上的html编辑器
- 站长
- 2026年02月16日
-
go语言做网站网页制作软件排行榜
go语言做网站网页制作软件排行榜
- 站长
- 2026年02月16日
-
gps定位网站建设淄博网站app
gps定位网站建设淄博网站app
- 站长
- 2026年02月16日
-
gta5资产网站正在建设网站维护推广怎么做
gta5资产网站正在建设网站维护推广怎么做
- 站长
- 2026年02月16日
