# 3D空间音效插件

一个功能完整的3D空间音效系统插件，为EG引擎提供基于Panda3D的3D音频处理功能，支持空间音效、环境音效和音频效果处理。

## 功能特性

### 核心功能
- **3D音频定位**: 基于听者位置和方向的实时3D音频定位
- **2D音频支持**: 支持传统的2D音频播放
- **音频源管理**: 完整的音频源创建、播放、暂停、停止和删除功能
- **环境音频**: 区域化的环境音效系统
- **音频效果**: 支持多种音频效果处理（混响、回声、滤波等）
- **音频缓存**: 智能音频文件缓存系统，提高加载性能
- **淡入淡出**: 支持音频的淡入淡出效果

### 音频处理
- **空间化处理**: 基于距离和方向的音量衰减和声道平衡
- **多普勒效应**: 根据音源和听者的相对运动计算频率变化
- **HRTF支持**: 头部相关传递函数实现更真实的3D音效
- **环境混响**: 根据房间尺寸和材质自动计算混响参数
- **音量控制**: 精确的音量控制和淡入淡出效果
- **距离衰减**: 可配置的最小/最大距离和衰减因子
- **音频优先级**: 音频资源管理和优先级控制

### 音频效果
- **混响效果**: 模拟不同环境的混响效果
- **回声效果**: 创建回声和延迟效果
- **滤波效果**: 低通、高通和带通滤波器
- **失真效果**: 音频失真和过载效果
- **压缩效果**: 动态范围压缩
- **均衡器**: 多频段均衡器
- **合声/镶边**: 调制效果
- **效果链**: 支持多个效果的组合应用

### 环境系统
- **音频区域**: 定义具有特定音频属性的3D区域
- **环境音效**: 区域内的背景环境音效
- **区域属性**: 可配置的区域音频参数
- **动态切换**: 听者在不同区域间移动时的音频切换
- **过渡效果**: 区域间平滑的音频过渡
- **遮挡效果**: 音频遮挡和 occlusion 处理
- **回调系统**: 区域进入/离开/内部状态回调

### 编辑功能
- **可视化编辑**: 图形化界面编辑音频场景
- **多种工具**: 选择、添加音效、添加区域等工具
- **场景保存/加载**: 音频场景的序列化和反序列化
- **网格对齐**: 网格对齐功能提高编辑精度
- **实时预览**: 编辑过程中的实时音频预览

### 性能优化
- **资源管理**: 智能的音频资源加载和卸载
- **内存优化**: 音频缓冲区管理和内存复用
- **批量处理**: 支持大量音频源的同时处理
- **LOD支持**: 根据距离调整音频处理质量
- **对象池**: 音频对象池减少GC压力

## 使用方法

### 快捷键操作
- **F1**: 切换音频调试模式
- **F2**: 切换空间音频
- **F3**: 播放测试音效
- **F4**: 停止所有音频
- **F5**: 显示音频统计信息
- **F6**: 切换环境音频
- **F7**: 应用混响效果
- **F8**: 应用回声效果
- **F9**: 创建测试区域
- **F10**: 切换多普勒效应
- **F11**: 切换HRTF
- **F12**: 显示详细统计信息

### GUI界面操作
插件会在屏幕左上角创建控制面板，右上角创建编辑器面板，可以通过按钮直接操作音频功能。

### 编程接口
```python
# 获取插件实例
audio_plugin = world.plugin_manager.get_plugin("spatial_audio")

# 创建3D音效
sound_id = audio_plugin.create_3d_sound(
    "sounds/footsteps.wav", 
    (10, 0, 5),     # 位置
    False,          # 循环
    0.8,            # 音量
    1.0,            # 最小距离
    100.0,          # 最大距离
    1.0             # 衰减因子
)

# 创建2D音效
music_id = audio_plugin.create_2d_sound("sounds/background_music.mp3", True, 0.6)

# 播放音效（支持淡入）
audio_plugin.play_sound(sound_id, fade_in_time=1.0)

# 设置音源位置
audio_plugin.set_sound_position(sound_id, (15, 0, 8))

# 设置音量
audio_plugin.set_sound_volume(sound_id, 0.5)

# 检查音效状态
if audio_plugin.is_sound_playing(sound_id):
    print("音效正在播放")

# 创建音频效果
reverb_effect_id = audio_plugin.create_audio_effect("reverb", {
    "reverb_time": 2.0,
    "early_reflections": 0.3,
    "late_reverb": 0.7
})

# 应用效果到音效
audio_plugin.apply_effect_to_sound(sound_id, reverb_effect_id)

# 创建环境区域
audio_plugin.create_environment_zone("cave", (0, 0, 0), 20.0, {
    "reverb": 0.8,
    "absorption": 0.3,
    "ambient_volume": 0.4
})

# 为区域添加环境音效
audio_plugin.environment_audio_manager.add_ambient_sound_to_zone(
    "cave", "sounds/cave_ambience.wav", 0.4, True)

# 设置听者位置
audio_plugin.set_listener_position((5, 0, 5))

# 设置听者方向
audio_plugin.set_listener_orientation((0, 0, 0))

# 停止音效（支持淡出）
audio_plugin.stop_sound(sound_id, fade_out_time=1.0)

# 删除音效
audio_plugin.delete_sound(sound_id)

# 使用预设效果
cathedral_reverb = audio_plugin.create_preset_effect("cathedral_reverb")
audio_plugin.apply_effect_to_sound(sound_id, cathedral_reverb)

# 设置主音量
audio_plugin.set_master_volume(0.8)

# 绑定音效到对象
audio_plugin.attach_sound_to_object(sound_id, character_node)

# 添加区域回调
def on_enter_zone(zone_id):
    print(f"进入区域: {zone_id}")
    
audio_plugin.add_zone_enter_callback("cave", on_enter_zone)
```

## 核心组件

### 音频源管理器
负责音频源的创建、播放和控制。

主要功能：
- 3D和2D音效创建
- 音频播放控制（播放、暂停、停止）
- 音源位置和属性设置
- 音频状态查询
- 资源管理和缓存
- 淡入淡出效果

### 音频效果处理器
处理各种音频效果的应用和管理。

主要功能：
- 多种音频效果创建
- 效果参数配置
- 效果应用到音源
- 效果启用/禁用控制
- 效果链管理
- 预设效果系统

### 环境音频管理器
管理环境音效和区域音频效果。

主要功能：
- 音频区域创建和管理
- 环境音效播放
- 区域属性配置
- 区域间音频切换
- 动态环境效果
- 区域状态回调

### 音频编辑器
提供可视化编辑音频场景的功能。

主要功能：
- 图形化界面编辑
- 多种编辑工具
- 场景保存和加载
- 实时预览
- 网格对齐

## 音频组件

### 音频源组件
为游戏对象添加音频播放功能。

主要功能：
- 音频文件加载
- 3D空间化处理
- 音频播放控制
- 对象绑定

### 音频听者组件
设置音频听者位置和方向。

主要功能：
- 听者位置设置
- 听者方向设置
- 对象绑定

### 音频效果组件
为音频源应用效果。

主要功能：
- 音频效果创建
- 效果参数配置
- 效果应用和移除

## 音频工具

### 距离计算
计算两点间距离用于音量衰减计算。

### 音量衰减
基于距离的音量衰减计算。

### 声道平衡
根据音源相对位置计算左右声道平衡。

### 多普勒效应
计算音源和听者相对运动引起的频率变化。

### HRTF处理
头部相关传递函数实现更真实的3D音效。

## 性能优化

### 资源管理
- **智能加载**: 根据需要动态加载音频资源
- **内存复用**: 音频缓冲区复用减少内存分配
- **自动卸载**: 不使用的音频资源自动卸载
- **缓存系统**: 音频文件智能缓存

### 处理优化
- **批量更新**: 批量处理音频源更新
- **LOD系统**: 根据距离调整处理质量
- **效果优化**: 根据重要性调整效果处理

### 内存优化
- **对象池**: 音频对象池减少GC压力
- **流式加载**: 大型音频文件流式加载
- **压缩存储**: 音频数据压缩存储

## 扩展开发

### 添加新的音频效果
1. 在[effects](file:///home/hello/EG/plugins/user/spatial_audio/effects)目录中创建新的效果处理器
2. 实现效果处理逻辑
3. 在[AudioEffectProcessor](file:///home/hello/EG/plugins/user/spatial_audio/effects/audio_effect_processor.py#L11-L94)中注册新效果

### 添加新的音频组件
1. 在[components](file:///home/hello/EG/plugins/user/spatial_audio/components)目录中创建新的组件类
2. 继承AudioComponent基类
3. 实现组件功能

### 添加新的工具函数
1. 在[utils](file:///home/hello/EG/plugins/user/spatial_audio/utils)目录中创建新的工具模块
2. 实现工具函数
3. 在需要的地方使用工具函数

## 故障排除

### 音频无法播放
1. 检查音频文件路径是否正确
2. 确认音频格式是否支持
3. 检查音频系统是否正确初始化
4. 验证音频文件是否损坏

### 3D音效不工作
1. 确认听者位置是否正确设置
2. 检查音源位置是否正确设置
3. 验证音频系统是否支持3D音效
4. 检查音频格式是否支持3D处理

### 性能问题
1. 使用音频统计功能分析性能瓶颈
2. 减少同时播放的音频数量
3. 降低音频处理质量
4. 使用LOD系统优化远处音频

### 环境音频问题
1. 检查区域定义是否正确
2. 确认听者位置是否在区域内
3. 验证环境音效文件是否正确加载
4. 检查区域属性设置

## API参考

### Plugin类主要方法

#### 初始化和控制
- `initialize()` - 初始化插件
- `enable()` - 启用插件
- `disable()` - 禁用插件
- `finalize()` - 清理插件资源
- `update(dt)` - 更新插件状态

#### 音频源操作
- `create_3d_sound(filepath, position, loop, volume, min_distance, max_distance, rolloff_factor)` - 创建3D音效
- `create_2d_sound(filepath, loop, volume)` - 创建2D音效
- `play_sound(sound_id, fade_in_time)` - 播放音效
- `stop_sound(sound_id, fade_out_time)` - 停止音效
- `pause_sound(sound_id)` - 暂停音效
- `resume_sound(sound_id)` - 恢复音效
- `set_sound_position(sound_id, position)` - 设置音源位置
- `set_sound_volume(sound_id, volume)` - 设置音源音量
- `set_sound_loop(sound_id, loop)` - 设置音源循环模式
- `is_sound_playing(sound_id)` - 检查音效是否正在播放
- `get_sound_duration(sound_id)` - 获取音效时长
- `get_sound_position(sound_id)` - 获取音源位置
- `delete_sound(sound_id)` - 删除音效
- `stop_all_sounds()` - 停止所有音频
- `attach_sound_to_object(sound_id, obj)` - 绑定音效到对象
- `detach_sound_from_object(sound_id)` - 解绑音效从对象

#### 音频效果操作
- `create_audio_effect(effect_type, parameters)` - 创建音频效果
- `apply_effect_to_sound(sound_id, effect_id)` - 应用效果到音效
- `remove_effect_from_sound(sound_id, effect_id)` - 从音效移除效果
- `create_preset_effect(preset_name)` - 创建预设效果
- `enable_audio_effects(enable)` - 启用/禁用音频效果处理

#### 听者操作
- `set_listener_position(position)` - 设置听者位置
- `set_listener_orientation(orientation)` - 设置听者方向
- `get_listener_velocity()` - 获取听者速度

#### 环境音频操作
- `create_environment_zone(zone_id, position, radius, properties)` - 创建环境区域
- `set_zone_property(zone_id, property_name, value)` - 设置区域属性
- `add_zone_enter_callback(zone_id, callback)` - 添加区域进入回调
- `add_zone_exit_callback(zone_id, callback)` - 添加区域离开回调

#### 系统控制
- `set_master_volume(volume)` - 设置主音量
- `get_master_volume()` - 获取主音量
- `set_audio_quality(quality)` - 设置音频质量
- `set_doppler_factor(factor)` - 设置多普勒效应因子
- `set_environment_occlusion(enable)` - 启用/禁用环境遮挡效果

#### 统计和信息
- `get_stats()` - 获取插件统计信息
- `get_cached_sound_files()` - 获取已缓存的音频文件列表
- `clear_sound_cache()` - 清空音频文件缓存

## 音频格式支持

支持的音频格式：
- **WAV**: 未压缩的PCM音频
- **OGG**: Ogg Vorbis压缩音频
- **MP3**: MPEG音频层III

## 性能调优建议

### 音频源管理
1. 合理控制同时播放的音频数量
2. 及时删除不需要的音频源
3. 使用对象池管理音频对象
4. 预加载常用的音频资源
5. 合理设置音频缓存大小

### 效果处理
1. 根据重要性选择效果
2. 限制同时应用的效果数量
3. 使用简化的效果处理远处音频
4. 及时移除不需要的效果

### 环境音频
1. 合理设置区域大小
2. 控制区域内环境音效数量
3. 使用LOD系统优化远处区域
4. 及时清理不需要的区域

### 内存管理
1. 定期清理音频缓存
2. 及时释放不需要的音频资源
3. 使用流式加载大型音频文件
4. 监控内存使用情况

## 版本信息

- 版本: 1.0.0
- 作者: EG Team
- 发布日期: 2024年

## 许可证

本插件遵循EG引擎许可证协议。