# 骨骼动画系统插件 ## 概述 骨骼动画系统插件为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` 文件获取详细的使用示例。