EG/plugins/user/skeletal_animation_system/README.md
2025-10-30 11:46:41 +08:00

274 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 骨骼动画系统插件
## 概述
骨骼动画系统插件为EG项目提供完整的骨骼动画支持。该插件基于Panda3D的Actor系统支持模型加载、动画播放、速度控制、动画混合等高级功能。
## 功能特性
1. **Actor模型加载** - 支持加载带有骨骼动画的3D模型
2. **动画播放控制** - 播放、停止、暂停、恢复动画
3. **速度调节** - 可调节动画播放速度
4. **动画混合** - 支持多个动画之间的平滑混合
5. **序列播放** - 支持动画序列的连续播放
6. **事件驱动** - 通过事件系统控制动画播放
7. **GUI控制面板** - 提供可视化控制界面
8. **多Actor管理** - 支持同时管理多个动画角色
9. **动画信息查询** - 提供详细的动画状态信息
## 系统架构
插件采用模块化设计,包含以下核心组件:
1. **SkeletalAnimationManager** - 核心动画管理器负责Actor和动画的管理
2. **AnimationEventManager** - 事件管理器,处理事件驱动的动画控制
3. **SkeletalAnimationGUI** - GUI界面提供可视化控制面板
## 安装和启用
### 启用插件
在主程序中启用插件:
```python
# 启用插件系统
world.plugin_manager.enable_plugin_system()
# 启用骨骼动画插件
world.plugin_manager.enable_plugin("skeletal_animation_system")
```
## 使用方法
### 基本使用
```python
# 获取插件实例
skeletal_plugin = world.plugin_manager.get_plugin("skeletal_animation_system")
animation_manager = skeletal_plugin.get_animation_manager()
# 加载Actor模型
actor, actor_id = animation_manager.load_actor(
model_path="path/to/model.egg",
anim_dict={
"walk": "path/to/walk.egg",
"run": "path/to/run.egg"
},
actor_id="my_hero", # 可选,自动生成如果未提供
position=(0, 0, 0), # 可选
scale=1.0 # 可选
)
# 播放动画
if actor:
animation_manager.play_animation(actor_id, "walk", loop=True)
```
### 高级使用
```python
# 动画混合
blend = animation_manager.blend_animations(
actor_id,
"walk",
"run",
blend_time=2.0,
loop=True
)
# 创建动画序列
sequence = animation_manager.create_animation_sequence(
actor_id,
["walk", "run", "jump"],
loop=True
)
# 获取动画信息
anim_info = animation_manager.get_animation_info(actor_id, "walk")
actor_info = animation_manager.get_actor_info(actor_id)
```
### 事件驱动控制
插件注册了以下事件:
- `skeletal.load_actor` - 加载Actor模型
- `skeletal.play_animation` - 播放动画
- `skeletal.stop_animation` - 停止动画
- `skeletal.set_animation_speed` - 设置动画速度
- `skeletal.pause_animation` - 暂停动画
- `skeletal.resume_animation` - 恢复动画
使用方法:
```python
# 通过事件加载Actor
world.send("skeletal.load_actor", [
"models/character.egg",
{"walk": "anim/walk.egg"},
"hero",
(0, 0, 0),
1.0
])
# 通过事件播放动画
world.send("skeletal.play_animation", ["hero", "walk", True, 1.0])
```
## API参考
### SkeletalAnimationManager 类
#### load_actor(model_path, anim_dict=None, actor_id=None, position=None, scale=None)
加载Actor模型
**参数:**
- `model_path` (str): 模型文件路径
- `anim_dict` (dict): 动画文件路径字典,格式 {'anim_name': 'anim_path'}
- `actor_id` (str): Actor标识符如果为None则自动生成
- `position` (tuple): 位置坐标 (x, y, z)
- `scale` (float or tuple): 缩放比例
**返回:**
- Actor对象和actor_id
#### unload_actor(actor_id)
卸载Actor
**参数:**
- `actor_id` (str): 要卸载的Actor标识符
#### play_animation(actor_id, anim_name, loop=False, play_rate=1.0, start_frame=None, end_frame=None)
播放动画
**参数:**
- `actor_id` (str): Actor标识符
- `anim_name` (str): 动画名称
- `loop` (bool): 是否循环播放
- `play_rate` (float): 播放速度
- `start_frame` (int): 起始帧
- `end_frame` (int): 结束帧
#### stop_animation(actor_id, anim_name=None)
停止动画
**参数:**
- `actor_id` (str): Actor标识符
- `anim_name` (str): 动画名称如果为None则停止所有动画
#### set_animation_speed(actor_id, anim_name, speed)
设置动画播放速度
**参数:**
- `actor_id` (str): Actor标识符
- `anim_name` (str): 动画名称
- `speed` (float): 播放速度
#### pause_animation(actor_id, anim_name=None)
暂停动画
**参数:**
- `actor_id` (str): Actor标识符
- `anim_name` (str): 动画名称如果为None则暂停所有动画
#### resume_animation(actor_id, anim_name=None)
恢复动画播放
**参数:**
- `actor_id` (str): Actor标识符
- `anim_name` (str): 动画名称如果为None则恢复所有动画
#### blend_animations(actor_id, from_anim, to_anim, blend_time=1.0, loop=True)
混合两个动画
**参数:**
- `actor_id` (str): Actor标识符
- `from_anim` (str): 起始动画名称
- `to_anim` (str): 目标动画名称
- `blend_time` (float): 混合时间
- `loop` (bool): 是否循环混合
#### create_animation_sequence(actor_id, anim_list, loop=False)
创建动画序列
**参数:**
- `actor_id` (str): Actor标识符
- `anim_list` (list): 动画名称列表
- `loop` (bool): 是否循环播放序列
#### get_actor_animations(actor_id)
获取Actor的所有动画名称
**参数:**
- `actor_id` (str): Actor标识符
**返回:**
- 动画名称列表
#### get_animation_info(actor_id, anim_name)
获取动画信息
**参数:**
- `actor_id` (str): Actor标识符
- `anim_name` (str): 动画名称
**返回:**
- 动画信息字典
#### get_actor_info(actor_id)
获取Actor详细信息
**参数:**
- `actor_id` (str): Actor标识符
**返回:**
- Actor信息字典
## 支持的文件格式
- 模型格式: .egg, .bam, .fbx, .gltf, .glb等Panda3D支持的格式
- 动画格式: .egg, .bam等包含动画数据的格式
## 配置选项
插件支持以下配置选项config.json:
- `default_play_rate`: 默认播放速度
- `default_loop`: 默认循环播放设置
- `enable_gui`: 是否启用GUI控制面板
- `enable_events`: 是否启用事件系统
- `max_actors`: 最大Actor数量
- `animation_cache_size`: 动画缓存大小
- `blend_default_time`: 默认混合时间
- `debug_mode`: 调试模式
## 注意事项
1. 确保模型文件包含正确的骨骼信息
2. 动画文件需要与模型骨骼结构匹配
3. 插件会在禁用时自动清理所有加载的Actor
4. 使用完毕后应调用unload_actor释放资源
5. 大量Actor可能影响性能注意优化
6. 某些格式如FBX可能需要额外的转换处理
## 故障排除
常见问题及解决方案:
1. **模型加载失败**: 检查文件路径和格式支持
2. **动画无法播放**: 确认动画名称正确且与模型匹配
3. **性能问题**: 减少同时播放的动画数量及时卸载不需要的Actor
4. **事件无响应**: 确认插件已正确启用且事件系统工作正常
## 扩展开发
插件采用模块化设计,可以轻松扩展:
1. 继承SkeletalAnimationManager添加新功能
2. 扩展AnimationEventManager处理自定义事件
3. 修改SkeletalAnimationGUI创建自定义界面
4. 添加新的动画控制算法
## 示例代码
查看 `examples.py` 文件获取详细的使用示例。