EG/plugins/user/advanced_skeletal_animation
2025-12-12 16:16:15 +08:00
..
__init__.py 编译修复 2025-12-12 16:16:15 +08:00
advanced.py 编译修复 2025-12-12 16:16:15 +08:00
config.json 编译修复 2025-12-12 16:16:15 +08:00
core.py 编译修复 2025-12-12 16:16:15 +08:00
examples.py 编译修复 2025-12-12 16:16:15 +08:00
network.py 编译修复 2025-12-12 16:16:15 +08:00
optimization.py 编译修复 2025-12-12 16:16:15 +08:00
plugin.py 编译修复 2025-12-12 16:16:15 +08:00
README.md 编译修复 2025-12-12 16:16:15 +08:00
tools.py 编译修复 2025-12-12 16:16:15 +08:00

高级骨骼动画系统插件

概述

高级骨骼动画系统插件为EG项目提供了一个完整且功能丰富的骨骼动画解决方案。该插件基于Panda3D的Actor系统提供了从基础动画播放到高级动画控制的全套功能包括动画状态机、逆向运动学、物理集成、动画压缩、网络同步和性能优化等。

功能特性

核心功能

  1. Actor模型加载 - 支持加载带有骨骼动画的3D模型
  2. 动画播放控制 - 播放、停止、暂停、恢复动画
  3. 速度调节 - 可调节动画播放速度
  4. 动画混合 - 支持多个动画之间的平滑混合
  5. 序列播放 - 支持动画序列的连续播放
  6. 事件驱动 - 通过事件系统控制动画播放

高级功能

  1. 动画状态机 - 管理复杂的动画状态转换和混合
  2. 逆向运动学系统 - 实现骨骼的IK控制
  3. 动画曲线编辑器 - 支持对动画属性进行曲线编辑和自定义
  4. 物理动画集成 - 将物理模拟与骨骼动画结合

性能优化

  1. 动画压缩 - 支持关键帧压缩、量化等多种压缩算法
  2. LOD系统 - 根据距离和性能自动调整动画质量
  3. 智能缓存 - 提供高效的动画数据缓存机制

网络功能

  1. 动画状态同步 - 支持多人环境中动画状态的同步
  2. 分布式动画管理 - 管理网络环境中的动画同步
  3. 状态序列化 - 支持动画状态的序列化和反序列化

工具系统

  1. 动画分析器 - 提供动画性能、质量和内存使用分析
  2. 动画编辑器 - 支持关键帧编辑、曲线编辑等功能
  3. 调试可视化工具 - 提供骨骼、边界框等可视化功能
  4. 性能分析器 - 提供详细的性能分析和优化建议

系统架构

插件采用模块化设计,包含以下核心组件:

  1. SkeletalAnimationCore - 核心动画管理器负责Actor和动画的管理
  2. AnimationNetworkSync - 网络同步系统,处理网络环境中的动画同步
  3. AnimationStateMachine - 动画状态机,管理复杂的动画状态转换
  4. AnimationCurveEditor - 动画曲线编辑器,支持动画属性的曲线控制
  5. PhysicsAnimationIntegration - 物理动画集成系统,结合物理模拟与动画
  6. AnimationCompressor - 动画压缩系统,减少动画数据大小
  7. AnimationLODSystem - 动画LOD系统根据条件调整动画质量
  8. AnimationCacheManager - 动画缓存管理器,提高动画加载性能
  9. AnimationAnalyzer - 动画分析器,分析动画性能和质量
  10. AnimationEditor - 动画编辑器,提供关键帧编辑功能
  11. DebugVisualizer - 调试可视化工具,提供可视化调试功能
  12. AnimationProfiler - 性能分析器,分析动画系统性能

安装和启用

启用插件

在主程序中启用插件:

# 启用插件系统
world.plugin_manager.enable_plugin_system()

# 启用高级骨骼动画插件
world.plugin_manager.enable_plugin("advanced_skeletal_animation")

使用方法

基本使用

# 获取插件实例
plugin = world.plugin_manager.get_plugin("advanced_skeletal_animation")
core_system = plugin.get_core_system()

# 加载Actor模型
actor, actor_id = core_system.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:
    core_system.play_animation(actor_id, "walk", loop=True)

高级使用

# 动画混合
core_system.blend_animations(
    actor_id, 
    "walk", 
    "run", 
    blend_time=2.0
)

# 获取动画信息
anim_info = core_system.get_animation_info(actor_id, "walk")
actor_info = core_system.get_actor_info(actor_id)

状态机使用

from plugins.user.advanced_skeletal_animation.advanced import AnimationStateMachine

# 创建状态机
state_machine = AnimationStateMachine(actor)

# 添加状态
state_machine.add_state("idle", "idle_anim", loop=True)
state_machine.add_state("walk", "walk_anim", loop=True)
state_machine.add_state("run", "run_anim", loop=True)

# 设置状态转换
state_machine.set_transition("idle", "walk")
state_machine.set_transition("walk", "run")
state_machine.set_transition("run", "idle")

# 进入初始状态
state_machine.enter_state("idle")

# 在更新循环中更新状态机
def state_machine_update(task):
    dt = globalClock.getDt()
    state_machine.update(dt)
    return task.cont
    
world.taskMgr.add(state_machine_update, "state_machine_update")

网络同步使用

# 获取网络系统
network_system = plugin.get_network_system()

# 设置网络模式
from plugins.user.advanced_skeletal_animation.network import NetworkMode, SyncMode
network_system.set_network_mode(NetworkMode.SERVER)
network_system.set_sync_mode(SyncMode.STATE_SYNC)

# 注册Actor进行网络同步
network_id = network_system.register_actor_for_sync(actor_id)

工具系统使用

# 获取分析器
analyzer = plugin.get_analyzer()
analyzer.start_analysis()

# 分析动画
analysis_result = analyzer.analyze_animation(actor_id, "walk", AnimationAnalysisType.PERFORMANCE)

# 获取编辑器
editor = plugin.get_editor()
editor.start_editing(actor_id, "walk")

# 获取可视化工具
visualizer = plugin.get_visualizer()
visualizer.enable_visualization(True)
visualizer.set_mode(DebugVisualizationMode.SKELETON)

# 获取性能分析器
profiler = plugin.get_profiler()
profiler.start_profiling()

API参考

SkeletalAnimationCore 类

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, blend_mode='linear')

混合两个动画

参数:

  • actor_id (str): Actor标识符
  • from_anim (str): 起始动画名称
  • to_anim (str): 目标动画名称
  • blend_time (float): 混合时间
  • blend_mode (str): 混合模式 ('linear', 'ease_in', 'ease_out', 'ease_in_out')

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信息字典

AnimationStateMachine 类

add_state(state_name, animations, loop=True, play_rate=1.0, blend_time=0.3)

添加动画状态

参数:

  • state_name (str): 状态名称
  • animations (str or list): 动画名称或列表
  • loop (bool): 是否循环
  • play_rate (float): 播放速度
  • blend_time (float): 状态切换混合时间

set_transition(from_state, to_state, transition_type='smooth', condition=None, transition_time=0.3)

设置状态转换

参数:

  • from_state (str): 起始状态
  • to_state (str): 目标状态
  • transition_type (str): 转换类型 ('immediate', 'smooth', 'blend', 'conditional')
  • condition (function): 转换条件函数
  • transition_time (float): 转换时间

enter_state(state_name)

进入指定状态

参数:

  • state_name (str): 状态名称

AnimationNetworkSync 类

set_network_mode(mode)

设置网络模式

参数:

  • mode (NetworkMode): 网络模式 (DISABLED, SERVER, CLIENT, PEER_TO_PEER)

set_sync_mode(mode)

设置同步模式

参数:

  • mode (SyncMode): 同步模式 (STATE_SYNC, INPUT_SYNC, INTERPOLATION)

register_actor_for_sync(actor_id, network_id=None)

注册Actor以进行网络同步

参数:

  • actor_id (str): Actor ID
  • network_id (str): 网络ID如果为None则自动生成

返回:

  • 网络ID

AnimationCompressor 类

compress_animation(actor, anim_name, method='keyframe_reduction')

压缩指定动画

参数:

  • actor (Actor): Actor对象
  • anim_name (str): 动画名称
  • method (str): 压缩方法 ('keyframe_reduction', 'quantization', 'delta_compression', 'rle')

返回:

  • 压缩后的动画数据

AnimationAnalyzer 类

analyze_animation(actor_id, anim_name, analysis_type=AnimationAnalysisType.PERFORMANCE)

分析指定动画

参数:

  • actor_id (str): Actor ID
  • anim_name (str): 动画名称
  • analysis_type (AnimationAnalysisType): 分析类型 (PERFORMANCE, QUALITY, MEMORY, COMPRESSION)

返回:

  • 分析结果

AnimationEditor 类

start_editing(actor_id, anim_name)

开始编辑动画

参数:

  • actor_id (str): Actor ID
  • anim_name (str): 动画名称

返回:

  • 是否成功开始编辑

add_keyframe(actor_id, anim_name, bone_name, frame, position=None, rotation=None, scale=None)

添加关键帧

参数:

  • actor_id (str): Actor ID
  • anim_name (str): 动画名称
  • bone_name (str): 骨骼名称
  • frame (int): 帧号
  • position (tuple): 位置
  • rotation (tuple): 旋转
  • scale (tuple): 缩放

DebugVisualizer 类

set_mode(mode)

设置可视化模式

参数:

  • mode (DebugVisualizationMode): 模式 (SKELETON, BOUNDS, NORMALS, WIREFRAME, COLLISION)

enable_visualization(enabled=True)

启用/禁用可视化

参数:

  • enabled (bool): 是否启用

AnimationProfiler 类

start_profiling()

开始性能分析

stop_profiling()

停止性能分析

get_performance_report()

获取性能报告

返回:

  • 性能报告字典

支持的文件格式

  • 模型格式: .egg, .bam, .fbx, .gltf, .glb等Panda3D支持的格式
  • 动画格式: .egg, .bam等包含动画数据的格式

配置选项

插件支持以下配置选项config.json:

{
    "modules": {
        "core": {
            "enabled": true,
            "max_actors": 1000,
            "default_play_rate": 1.0,
            "default_loop": false,
            "blend_time": 0.3
        },
        "network": {
            "enabled": true,
            "sync_interval": 0.1,
            "interpolation_mode": "linear",
            "enable_compression": true
        },
        "advanced": {
            "state_machine": true,
            "curve_editor": true,
            "physics_integration": true
        },
        "optimization": {
            "compression": true,
            "lod": true,
            "cache": true,
            "cache_size": 500
        },
        "tools": {
            "analyzer": true,
            "editor": true,
            "visualizer": true,
            "profiler": true
        }
    },
    "performance": {
        "target_fps": 60,
        "lod_threshold": 30,
        "max_buffer_size": 100
    }
}

性能优化建议

  1. 使用LOD系统 - 根据Actor距离摄像机的远近自动调整动画质量
  2. 启用动画压缩 - 减少内存占用,提高加载速度
  3. 合理使用缓存 - 避免重复加载相同动画数据
  4. 优化网络同步 - 根据网络状况调整同步频率
  5. 及时释放资源 - 不需要的Actor及时调用unload_actor释放
  6. 使用工具系统 - 通过分析器和性能分析器找出性能瓶颈

故障排除

常见问题及解决方案:

  1. 模型加载失败: 检查文件路径和格式支持
  2. 动画无法播放: 确认动画名称正确且与模型匹配
  3. 性能问题: 减少同时播放的动画数量及时卸载不需要的Actor
  4. 网络同步问题: 确认网络模式设置正确,检查防火墙设置
  5. 状态机问题: 检查状态和转换定义是否正确
  6. 工具系统问题: 确认工具模块已正确初始化

扩展开发

插件采用模块化设计,可以轻松扩展:

  1. 继承现有类添加新功能
  2. 实现自定义的压缩算法
  3. 添加新的动画控制方式
  4. 扩展网络同步协议
  5. 集成其他物理引擎
  6. 开发新的工具模块

示例代码

查看 examples.py 文件获取详细的使用示例。

每个模块都有完整的使用示例,可以直接运行测试。

技术支持

如遇到问题,请查看以下资源:

  1. 官方文档和API参考
  2. 示例代码和使用说明
  3. 社区论坛和技术支持
  4. GitHub Issues页面

版本历史

v1.0.0 (当前版本)

  • 初始版本发布
  • 实现完整的骨骼动画系统
  • 包含所有核心功能和高级特性
  • 提供完整的文档和示例
  • 添加工具系统支持

许可证

本插件遵循EG项目的许可证条款。

联系方式

如有任何问题或建议,请联系开发团队。