""" Morphing和变形动画插件使用示例 提供各种使用场景的详细示例 """ from panda3d.core import * from direct.showbase.ShowBase import ShowBase from direct.task import Task # 导入插件模块 from .core import MorphingCore, InterpolationMode from .advanced import AnimationStateMachine, AnimationCurveEditor, PhysicsAnimationIntegration, AnimationStateType, TransitionType, CurveType from .optimization import AnimationCompressor, AnimationLODSystem, AnimationCacheManager, CompressionMethod from .network import AnimationNetworkSync, NetworkMode, SyncMode def example_basic_morphing(): """ 基础Morphing使用示例 """ print("=== 基础Morphing使用示例 ===") # 假设我们有一个world对象和模型 # world = ShowBase() # model = world.loader.loadModel("path/to/model") # model.reparentTo(world.render) # 创建Morphing核心系统 # morphing_core = MorphingCore(world) # 注册模型 # model_id = morphing_core.register_model(model, "my_model") # 创建Morph目标(示例数据) # vertex_offsets = [(0.1, 0.0, 0.0)] * 100 # 假设有100个顶点 # morphing_core.create_morph_target(model_id, "smile", vertex_offsets) # 设置Morph目标权重 # morphing_core.set_morph_target_weight(model_id, "smile", 0.5) print("基础Morphing示例:") print(" 1. 创建MorphingCore实例") print(" 2. 注册模型") print(" 3. 创建Morph目标") print(" 4. 设置Morph目标权重") print("=== 基础Morphing使用示例结束 ===\n") def example_animation_state_machine(): """ 动画状态机使用示例 """ print("=== 动画状态机使用示例 ===") # 假设已有morphing_core和model_id # state_machine = AnimationStateMachine(morphing_core, model_id) # 添加状态 # state_machine.add_state("idle", {"neutral": 1.0}, duration=0.0, loop=True) # state_machine.add_state("happy", {"smile": 1.0}, duration=2.0) # state_machine.add_state("sad", {"frown": 1.0}, duration=2.0) # 设置状态转换 # state_machine.set_transition("idle", "happy", TransitionType.SMOOTH, transition_time=0.5) # state_machine.set_transition("happy", "sad", TransitionType.SMOOTH, transition_time=0.5) # state_machine.set_transition("sad", "idle", TransitionType.SMOOTH, transition_time=0.5) # 进入初始状态 # state_machine.enter_state("idle") # 启动更新 # state_machine.start_updating() print("动画状态机示例:") print(" 1. 创建AnimationStateMachine实例") print(" 2. 添加动画状态") print(" 3. 设置状态转换") print(" 4. 进入初始状态") print(" 5. 启动更新") print("=== 动画状态机使用示例结束 ===\n") def example_curve_editor(): """ 曲线编辑器使用示例 """ print("=== 曲线编辑器使用示例 ===") # 假设已有morphing_core # curve_editor = AnimationCurveEditor(morphing_core) # 创建曲线 # control_points = [(0.0, 0.0), (0.5, 1.0), (1.0, 0.0)] # curve_editor.create_curve("bounce", CurveType.BEZIER, control_points) # 应用曲线到Morph目标 # curve_editor.apply_curve_to_morph_target("bounce", model_id, "smile", 0.5) print("曲线编辑器示例:") print(" 1. 创建AnimationCurveEditor实例") print(" 2. 创建动画曲线") print(" 3. 应用曲线到Morph目标") print("=== 曲线编辑器使用示例结束 ===\n") def example_physics_integration(): """ 物理集成使用示例 """ print("=== 物理集成使用示例 ===") # 假设已有morphing_core # physics_system = PhysicsAnimationIntegration(morphing_core) # 添加物理约束 # physics_system.add_constraint(model_id, "spring_smile", "spring", "smile", stiffness=2.0, damping=0.5) # 启动更新 # physics_system.start_updating() print("物理集成示例:") print(" 1. 创建PhysicsAnimationIntegration实例") print(" 2. 添加物理约束") print(" 3. 启动更新") print("=== 物理集成使用示例结束 ===\n") def example_compression(): """ 动画压缩使用示例 """ print("=== 动画压缩使用示例 ===") # 创建压缩器 # compressor = AnimationCompressor() # 创建测试数据 # morph_data = [(0.0, 0.0, 0.0), (0.1, 0.05, 0.02), (0.2, 0.1, 0.04)] # 压缩数据 # compressed = compressor.compress_morph_data(morph_data, CompressionMethod.KEYFRAME_REDUCTION) # 解压缩数据 # if compressed: # decompressed = compressor.decompress_morph_data(compressed) print("动画压缩示例:") print(" 1. 创建AnimationCompressor实例") print(" 2. 准备Morph数据") print(" 3. 压缩数据") print(" 4. 解压缩数据") print("=== 动画压缩使用示例结束 ===\n") def example_lod_system(): """ LOD系统使用示例 """ print("=== LOD系统使用示例 ===") # 假设已有world对象 # lod_system = AnimationLODSystem(world) # 设置相机 # lod_system.set_camera(world.camera) # 更新LOD级别(在渲染循环中) # lod_system.update_lod_levels(models) print("LOD系统示例:") print(" 1. 创建AnimationLODSystem实例") print(" 2. 设置相机") print(" 3. 更新LOD级别") print("=== LOD系统使用示例结束 ===\n") def example_network_synchronization(): """ 网络同步使用示例 """ print("=== 网络同步使用示例 ===") # 假设已有world和morphing_core # network_sync = AnimationNetworkSync(world, morphing_core) # 设置网络模式 # network_sync.set_network_mode(NetworkMode.SERVER) # network_sync.set_sync_mode(SyncMode.STATE_SYNC) # 注册模型进行同步 # network_id = network_sync.register_model_for_sync(model_id) # 启动同步任务 # network_sync.start_sync_task() print("网络同步示例:") print(" 1. 创建AnimationNetworkSync实例") print(" 2. 设置网络模式") print(" 3. 注册模型进行同步") print(" 4. 启动同步任务") print("=== 网络同步使用示例结束 ===\n") def example_complete_workflow(): """ 完整工作流程示例 """ print("=== 完整工作流程示例 ===") print("完整Morphing动画工作流程:") print(" 1. 初始化系统") print(" - 创建MorphingCore") print(" - 创建高级功能模块") print(" - 创建优化模块") print(" - 创建网络模块") print(" 2. 模型设置") print(" - 加载模型") print(" - 注册到MorphingCore") print(" - 创建Morph目标") print(" 3. 动画创建") print(" - 使用状态机管理复杂动画") print(" - 使用曲线编辑器创建自定义曲线") print(" - 集成物理效果") print(" 4. 性能优化") print(" - 应用动画压缩") print(" - 设置LOD系统") print(" - 使用缓存管理") print(" 5. 网络同步") print(" - 配置网络同步") print(" - 注册模型同步") print(" - 启动同步任务") print(" 6. 运行时更新") print(" - 在主循环中更新各模块") print(" - 处理用户输入") print(" - 监控性能") print("=== 完整工作流程示例结束 ===\n") def example_plugin_usage(): """ 插件使用示例 """ print("=== 插件使用示例 ===") print("在主程序中使用Morphing动画插件:") print(" # 启用插件系统") print(" world.plugin_manager.enable_plugin_system()") print("") print(" # 启用Morphing动画插件") print(" world.plugin_manager.enable_plugin('morphing_animation')") print("") print(" # 获取插件实例") print(" plugin = world.plugin_manager.get_plugin('morphing_animation')") print("") print(" # 获取核心系统") print(" core_system = plugin.get_core_system()") print("") print(" # 使用核心系统功能") print(" model_id = core_system.register_model(model_node)") print(" core_system.create_morph_target(model_id, 'target_name', vertex_offsets)") print(" core_system.set_morph_target_weight(model_id, 'target_name', 0.5)") print("=== 插件使用示例结束 ===\n") # 主函数用于测试示例 def main(): """ 主函数 - 运行所有示例 """ print("Morphing和变形动画插件使用示例") print("=" * 50) example_basic_morphing() example_animation_state_machine() example_curve_editor() example_physics_integration() example_compression() example_lod_system() example_network_synchronization() example_complete_workflow() example_plugin_usage() print("所有示例运行完毕") if __name__ == "__main__": main()