387 lines
11 KiB
Python
387 lines
11 KiB
Python
"""
|
||
高级骨骼动画系统使用示例
|
||
提供各种使用场景的代码示例
|
||
"""
|
||
|
||
def example_basic_usage(world):
|
||
"""
|
||
基本使用示例
|
||
"""
|
||
print("=== 高级骨骼动画插件基本使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
plugin = world.plugin_manager.get_plugin("advanced_skeletal_animation")
|
||
if not plugin:
|
||
print("错误: 高级骨骼动画插件未加载")
|
||
return
|
||
|
||
core_system = plugin.get_core_system()
|
||
|
||
# 1. 加载简单的Actor
|
||
print("1. 加载Actor...")
|
||
actor, actor_id = core_system.load_actor(
|
||
model_path="models/characters/robot.egg",
|
||
position=(0, 0, 0),
|
||
scale=1.0
|
||
)
|
||
|
||
if actor:
|
||
print(f" 成功加载Actor: {actor_id}")
|
||
|
||
# 2. 获取可用动画
|
||
animations = core_system.get_actor_animations(actor_id)
|
||
print(f"2. 可用动画: {animations}")
|
||
|
||
# 3. 播放动画
|
||
if animations:
|
||
print("3. 播放第一个动画...")
|
||
core_system.play_animation(
|
||
actor_id=actor_id,
|
||
anim_name=animations[0],
|
||
loop=True,
|
||
play_rate=1.0
|
||
)
|
||
|
||
# 4. 获取动画信息
|
||
if animations:
|
||
info = core_system.get_animation_info(actor_id, animations[0])
|
||
print(f"4. 动画信息: {info}")
|
||
|
||
print("=== 基本使用示例结束 ===\n")
|
||
|
||
|
||
def example_advanced_usage(world):
|
||
"""
|
||
高级使用示例
|
||
"""
|
||
print("=== 高级骨骼动画插件高级使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
plugin = world.plugin_manager.get_plugin("advanced_skeletal_animation")
|
||
if not plugin:
|
||
print("错误: 高级骨骼动画插件未加载")
|
||
return
|
||
|
||
core_system = plugin.get_core_system()
|
||
|
||
# 1. 加载带多个动画的Actor
|
||
print("1. 加载带多个动画的Actor...")
|
||
anim_dict = {
|
||
"walk": "models/anim/walk.egg",
|
||
"run": "models/anim/run.egg",
|
||
"jump": "models/anim/jump.egg",
|
||
"idle": "models/anim/idle.egg"
|
||
}
|
||
|
||
actor, actor_id = core_system.load_actor(
|
||
model_path="models/characters/hero.egg",
|
||
anim_dict=anim_dict,
|
||
position=(5, 0, 0),
|
||
scale=1.2
|
||
)
|
||
|
||
if actor:
|
||
print(f" 成功加载Actor: {actor_id}")
|
||
|
||
# 2. 播放循环动画
|
||
print("2. 播放循环idle动画...")
|
||
core_system.play_animation(actor_id, "idle", loop=True)
|
||
|
||
# 3. 3秒后切换到walk动画
|
||
def switch_to_walk():
|
||
print("3. 切换到walk动画...")
|
||
core_system.stop_animation(actor_id, "idle")
|
||
core_system.play_animation(actor_id, "walk", loop=True)
|
||
|
||
# 使用Panda3D的任务系统在3秒后执行
|
||
def schedule_task(task):
|
||
if task.time >= 3.0:
|
||
switch_to_walk()
|
||
return task.done
|
||
return task.cont
|
||
|
||
world.taskMgr.doMethodLater(3.0, schedule_task, "switch_animation_task")
|
||
|
||
# 4. 动画混合示例
|
||
print("4. 创建动画混合...")
|
||
core_system.blend_animations(
|
||
actor_id,
|
||
"walk",
|
||
"run",
|
||
blend_time=2.0
|
||
)
|
||
|
||
print("=== 高级使用示例结束 ===\n")
|
||
|
||
|
||
def example_state_machine_usage(world):
|
||
"""
|
||
状态机使用示例
|
||
"""
|
||
print("=== 动画状态机使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
plugin = world.plugin_manager.get_plugin("advanced_skeletal_animation")
|
||
if not plugin:
|
||
print("错误: 高级骨骼动画插件未加载")
|
||
return
|
||
|
||
core_system = plugin.get_core_system()
|
||
|
||
# 加载Actor
|
||
actor, actor_id = core_system.load_actor(
|
||
model_path="models/characters/character.egg",
|
||
anim_dict={
|
||
"idle": "models/anim/idle.egg",
|
||
"walk": "models/anim/walk.egg",
|
||
"run": "models/anim/run.egg"
|
||
},
|
||
position=(10, 0, 0)
|
||
)
|
||
|
||
if actor:
|
||
# 导入状态机类
|
||
from .advanced import AnimationStateMachine
|
||
|
||
# 创建状态机
|
||
state_machine = AnimationStateMachine(actor)
|
||
|
||
# 添加状态
|
||
state_machine.add_state("idle", "idle", loop=True)
|
||
state_machine.add_state("walk", "walk", loop=True)
|
||
state_machine.add_state("run", "run", 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, f"state_machine_update_{actor_id}")
|
||
|
||
print(f"状态机已为Actor {actor_id} 创建并启动")
|
||
|
||
print("=== 状态机使用示例结束 ===\n")
|
||
|
||
|
||
def example_network_sync_usage(world):
|
||
"""
|
||
网络同步使用示例
|
||
"""
|
||
print("=== 网络同步使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
plugin = world.plugin_manager.get_plugin("advanced_skeletal_animation")
|
||
if not plugin:
|
||
print("错误: 高级骨骼动画插件未加载")
|
||
return
|
||
|
||
core_system = plugin.get_core_system()
|
||
network_system = plugin.get_network_system()
|
||
|
||
# 设置网络模式
|
||
from .network import NetworkMode, SyncMode
|
||
network_system.set_network_mode(NetworkMode.SERVER)
|
||
network_system.set_sync_mode(SyncMode.STATE_SYNC)
|
||
|
||
# 加载Actor并注册网络同步
|
||
actor, actor_id = core_system.load_actor(
|
||
model_path="models/characters/player.egg",
|
||
anim_dict={
|
||
"idle": "models/anim/idle.egg",
|
||
"walk": "models/anim/walk.egg"
|
||
},
|
||
position=(15, 0, 0)
|
||
)
|
||
|
||
if actor:
|
||
network_id = network_system.register_actor_for_sync(actor_id)
|
||
print(f"Actor {actor_id} 已注册网络同步 (网络ID: {network_id})")
|
||
|
||
# 播放动画
|
||
core_system.play_animation(actor_id, "walk", loop=True)
|
||
|
||
print("=== 网络同步使用示例结束 ===\n")
|
||
|
||
|
||
def example_lod_usage(world):
|
||
"""
|
||
LOD系统使用示例
|
||
"""
|
||
print("=== LOD系统使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
plugin = world.plugin_manager.get_plugin("advanced_skeletal_animation")
|
||
if not plugin:
|
||
print("错误: 高级骨骼动画插件未加载")
|
||
return
|
||
|
||
core_system = plugin.get_core_system()
|
||
lod_system = plugin.get_lod_system()
|
||
|
||
# 设置LOD参数
|
||
from .optimization import LODStrategy
|
||
lod_system.set_lod_strategy(LODStrategy.DISTANCE_BASED)
|
||
lod_system.set_distance_thresholds([10.0, 25.0, 50.0])
|
||
|
||
# 加载多个Actor
|
||
actors_data = [
|
||
{"pos": (-5, -5, 0), "name": "actor_1"},
|
||
{"pos": (5, -5, 0), "name": "actor_2"},
|
||
{"pos": (0, -10, 0), "name": "actor_3"}
|
||
]
|
||
|
||
for actor_data in actors_data:
|
||
actor, actor_id = core_system.load_actor(
|
||
model_path="models/characters/npc.egg",
|
||
anim_dict={"idle": "models/anim/idle.egg"},
|
||
actor_id=actor_data["name"],
|
||
position=actor_data["pos"]
|
||
)
|
||
|
||
if actor:
|
||
core_system.play_animation(actor_id, "idle", loop=True)
|
||
print(f"加载Actor: {actor_id} 位置: {actor_data['pos']}")
|
||
|
||
print("=== LOD系统使用示例结束 ===\n")
|
||
|
||
|
||
def example_compression_usage(world):
|
||
"""
|
||
动画压缩使用示例
|
||
"""
|
||
print("=== 动画压缩使用示例 ===")
|
||
|
||
# 获取插件实例
|
||
plugin = world.plugin_manager.get_plugin("advanced_skeletal_animation")
|
||
if not plugin:
|
||
print("错误: 高级骨骼动画插件未加载")
|
||
return
|
||
|
||
core_system = plugin.get_core_system()
|
||
|
||
# 加载Actor
|
||
actor, actor_id = core_system.load_actor(
|
||
model_path="models/characters/compress_test.egg",
|
||
anim_dict={"walk": "models/anim/walk.egg"},
|
||
position=(20, 0, 0)
|
||
)
|
||
|
||
if actor:
|
||
# 导入压缩类
|
||
from .optimization import AnimationCompressor, CompressionMethod
|
||
compressor = AnimationCompressor()
|
||
|
||
# 压缩动画
|
||
compressed_data = compressor.compress_animation(
|
||
actor,
|
||
"walk",
|
||
CompressionMethod.KEYFRAME_REDUCTION
|
||
)
|
||
|
||
if compressed_data:
|
||
stats = compressor.get_compression_stats(compressed_data)
|
||
print(f"动画压缩统计: {stats}")
|
||
|
||
print("=== 动画压缩使用示例结束 ===\n")
|
||
|
||
|
||
def run_all_examples(world):
|
||
"""
|
||
运行所有示例
|
||
"""
|
||
print("开始运行高级骨骼动画插件所有示例...")
|
||
|
||
example_basic_usage(world)
|
||
example_advanced_usage(world)
|
||
example_state_machine_usage(world)
|
||
example_network_sync_usage(world)
|
||
example_lod_usage(world)
|
||
example_compression_usage(world)
|
||
|
||
print("所有示例运行完成!")
|
||
|
||
|
||
# 使用说明和API参考
|
||
USAGE_GUIDE = """
|
||
高级骨骼动画插件使用说明
|
||
=====================
|
||
|
||
1. 基本概念
|
||
----------
|
||
- Actor: 带有骨骼的3D模型对象
|
||
- Animation: 应用于Actor的动画序列
|
||
- Core System: 管理所有Actor和动画的中心控制器
|
||
|
||
2. 主要功能模块
|
||
--------------
|
||
- Core System: 核心动画管理
|
||
- Network System: 网络同步
|
||
- LOD System: 细节层次管理
|
||
- Cache Manager: 缓存管理
|
||
- State Machine: 动画状态机
|
||
- Curve Editor: 动画曲线编辑器
|
||
- Physics Integration: 物理集成
|
||
- Compressor: 动画压缩
|
||
|
||
3. 核心API
|
||
----------
|
||
SkeletalAnimationCore:
|
||
- load_actor(): 加载Actor模型
|
||
- unload_actor(): 卸载Actor
|
||
- play_animation(): 播放动画
|
||
- stop_animation(): 停止动画
|
||
- set_animation_speed(): 设置动画速度
|
||
- pause_animation(): 暂停动画
|
||
- resume_animation(): 恢复动画
|
||
- blend_animations(): 混合动画
|
||
|
||
4. 网络同步
|
||
----------
|
||
AnimationNetworkSync:
|
||
- set_network_mode(): 设置网络模式
|
||
- register_actor_for_sync(): 注册Actor同步
|
||
- send_actor_state(): 发送状态
|
||
- receive_actor_state(): 接收状态
|
||
|
||
5. 高级功能
|
||
----------
|
||
AnimationStateMachine:
|
||
- add_state(): 添加状态
|
||
- set_transition(): 设置转换
|
||
- enter_state(): 进入状态
|
||
|
||
AnimationLODSystem:
|
||
- set_lod_strategy(): 设置LOD策略
|
||
- update_lod_levels(): 更新LOD级别
|
||
|
||
AnimationCompressor:
|
||
- compress_animation(): 压缩动画
|
||
- decompress_animation(): 解压缩动画
|
||
|
||
6. 性能优化
|
||
----------
|
||
- 使用LOD系统根据距离调整动画质量
|
||
- 使用缓存管理器提高加载性能
|
||
- 使用动画压缩减少内存占用
|
||
- 合理设置网络同步频率
|
||
|
||
7. 注意事项
|
||
----------
|
||
- 确保模型文件包含正确的骨骼信息
|
||
- 动画文件需要与模型骨骼结构匹配
|
||
- 插件会在禁用时自动清理所有加载的Actor
|
||
- 使用完毕后应调用unload_actor释放资源
|
||
- 大量Actor可能影响性能,注意优化
|
||
"""
|
||
|
||
if __name__ == "__main__":
|
||
print(USAGE_GUIDE) |