声学物理

声学物理

实时区块感知声学,支持遮挡、衍射、反射、混响及流体声音传播。

为 Minecraft 世界带来实时声学物理效果

Version ![Minecraft](https://img.shields.io/badge/Minecraft-1.21.11 | 26.1.2 | 26.2-62b47a?style=for-the-badge) ![Loaders](https://img.shields.io/badge/Loaders-Fabric | Forge | NeoForge-4c78a8?style=for-the-badge)

功能特性 · 工作原理 · 兼容性 · 安装方法 · 构建指南 · 报告问题


它能做什么?

当墙壁挡住去路、走出房间或进入水中时,声音都会发生变化。AcousticSystem 会持续读取当前的世界几何结构,因此放置或破坏方块也会影响正在播放的声音。

功能特性

  • 基于墙壁材质和厚度的声音遮蔽效果
  • 声音可绕过角落、穿过开口并沿连接结构传播
  • 来自墙壁、地板和天花板的反射声
  • 由房间大小、开口和表面材质共同塑造的混响效果
  • 空气、水和熔岩之间物理真实的声音过渡
  • 对移动声源、听者和改变后的方块进行持续更新
  • 四个质量预设及详细设置选项
  • 基于 JSON 的方块和流体声学属性配置

工作原理

每一个位置性的世界声音都会经过相同的传播管线处理。结果并非从预设的房间列表中选取。

世界几何结构与材质
            ↓
直达声与透射
            ↓
衍射与结构路径
            ↓
早期反射与后期声场追踪
            ↓
距离、空气与介质损耗
            ↓
实时软件混音器

传播与遮蔽

直达声路径并非以单条中心射线采样,而是以有限的“第一菲涅尔区”波前进行采样。每个采样点都会与实际碰撞形状求交,并累积在每个材质内部传播的距离。随后,透射损耗会独立应用于八个频段,因此多层墙壁会持续衰减声音,而薄墙或部分遮挡的方块也不会表现得像完整的一米厚墙壁一样。

衍射

当直达波前被阻挡时,求解器会按需构建一个由区块、门户、可见性和衍射边缘节点组成的层级结构。A*(A-Star)算法会在该图中搜索穿过门、绕过角落以及通过多转弯通道的完整路径。路径完成后,将基于菲涅尔参数和菲涅尔-基尔霍夫衰减近似,按频段使用刃边衍射模型进行评估。有效的声到达会按能量和方向进行合并,而非选择任意一个门口。

距离与空气吸收

自由场距离损耗遵循球面扩展规律:声压大约按 1 / 距离 衰减,这对应于强度与距离的平方成反比,且每当距离加倍时,声压级会降低约 6 分贝。

空气吸收在八个频段中的每一个都使用 ISO 9613-1 模型。温度、相对湿度和大气压力决定了氧气和氮气的弛豫损耗。对于长度为 d 的路径,每个频段获得的声压增益为 exp(-αd),因此高频声音在长距离传播时会衰减得更快,而无需引入人为的听觉截止。

反射

早期反射使用来自附近表面的镜像声源候选。每个候选都会根据当前的世界几何结构进行检查,然后应用其延迟、方向、距离损耗以及依赖于材质的吸收、透射和散射效应。这使得石头、木头、羊毛和其他材质组产生不同的反射频谱。

房间分析与混响

后期声场使用多次反弹的蒙特卡洛光线追踪进行测量。光线在每次碰到材质时都会损失能量,并通过真实的开口逃逸。开口损耗通过类似萨宾(Sabine)的房间能量模型计算,同时一个 0.5 毫秒的能量直方图记录到达声场。通过反向薛定谔(Schroeder)能量积分和衰减曲线回归,可从追踪到的响应中估算每个频段的 RT60(混响时间)。

测量到的声场由一个运行在 24 kHz 的八延迟线反馈延迟网络(FDN)渲染。该网络使用相互不可通约的延迟、一个保能量的归一化哈达玛(Hadamard)反馈矩阵,以及四个薛定谔全通扩散器,以构建致密的混响尾部,而不会变成重复的回声。对于往返时间为 τ 的延迟线,其反馈增益计算为 g = 10^(-3τ / RT60),使得能量在测量的衰减时间内下降 60 分贝。单极点滤波器在 250 Hz 和 4 kHz 处分割反馈,因此低频、中频和高频的衰减速率可以根据追踪到的 RT60 频谱独立计算。

流体与介质边界

空气、水和熔岩被视为具有各自声速和阻抗的声学介质。每条路径都会被分割成其真实的介质段。在边界处,反射和透射的能量来自两种介质之间的阻抗关系,而延迟则来自以每种介质声速传播的距离。流体表面附近的声源耦合会在六个体素面的小块上进行积分,这避免了将短暂暴露或部分浸没的声源视为纯空气或纯水的特例。

结构声传播

接触声也可以激发相连的碰撞实体。A*(A-Star)算法沿面连接的实心方块进行追踪,而材质耦合和频率相关的阻尼决定了有多少振动能到达听者。这是用于脚步声在地板中传播等情况的路径;它不绑定于特定的声音 ID。

动态更新与性能

世界数据存储在不可变的区块截面快照中。方块和流体的更改仅替换受影响的截面,而传播计算则在渲染线程之外运行。当声源、听者或几何结构发生变化时,活动声音会重新评估,并且音频回调会持续应用最新的方向和声学系数。质量预设会调整追踪预算,而不是切换为不同的声学模型。

材质吸收、透射损耗、散射、介质阻抗及相关频段数据定义在 src/client/resources/assets/acousticsystem/acoustic_materials/default.json 中。

兼容性

Minecraft Java Fabric Forge NeoForge
1.21.11 21 ✓ ✓ ✓
26.1.2 25 ✓ ✓ ✓
26.2 25 ✓ ✓ ✓

AcousticSystem 是一款客户端模组。Fabric 安装还需要相应版本的 Fabric API。其软件混音器需要一个支持 AL_SOFT_callback_buffer 的 OpenAL Soft 设备。

安装方法

  1. 选择与你的 Minecraft 版本和模组加载器匹配的 JAR 文件。
  2. 将其放入你的 Minecraft mods 文件夹中。
  3. 打开 音乐与声音选项 → 声音物理 以选择质量预设或调整各项设置。

如果你发现错误或声音不自然,请提交一个 issue,并附上你的 Minecraft 版本、模组加载器和复现步骤。