我是游戏动画师。我的NPC的腿由一个大脑控制,该大脑在物理体(MyoSuite的MyoLeg,80块肌肉,在MuJoCo中)上使用增强学习训练。没有动画片段,也没有动作捕捉。下面是我把它导入Unreal的方法,以防帮助到想把外部模拟与UE5连接的人。

设置

  1. Python 运行物理和大脑,每秒100步,并通过UDP向Unreal发送每步一个OSC消息:位置、朝向、骨盆高度以及9块腿骨的滚转/俯仰/转向。共49个浮点数;第一个是格式版本,以免布局变化被错误解读。
  2. 一个Actor Blueprint(OSC插件)接收它,并相对于Actor移动其Skeletal Mesh组件,而不是移动Actor本身。
  3. Anim Blueprint每帧复制这些浮点数(AnimGraph只应读取自己的变量),并使用9个Transform(Modify)Bone节点应用它们:旋转模式“添加到已有”,旋转空间“骨骼空间”,在空闲姿态之上,介于Local To Component和Component To Local之间。
  4. 左键单击 -> Get Hit Result Under Cursor -> 减去Actor的位置 -> 通过OSC回传给Python作为行走目标。

4件出错的事

  • OSC服务器从未收到任何内容。在5.7中,我的Create OSC Server使用127.0.0.1实际上是监听我的LAN地址。Fix:Python发送到所有本地地址。(netstat -ano 显示哪个程序在监听哪个地址和端口。)

  • 骨骼方向错误。每个模型骨骼都有自己的坐标轴,所以“髋屈曲+30度”可能导致腿向后摆。我发了三个夸张角度的静态测试姿势,并在一张小表中修正每个关节的轴和符号,Python端在运行时重新读取该表。

  • NPC生成在地板下方。我把整个Actor移动到原始世界坐标。只移动Mesh相对于Actor,就解决了问题,Actor的位置成了NPC的“家”。

  • 慢动画(0.3-0.5x)。我训练的GPU模拟器适合成千上万的身体同时运行,但在实时渲染单个身体时表现不佳。单核CPU上的普通MuJoCo运行足够快,甚至有很大余裕。

Bonus:Blueprint节点是纯文本的剪贴板内容(Ctrl+C 到记事本),因此我用Python脚本生成完整的图表并粘贴进去。

目前仍然不稳,偶尔会摔倒(目前只是重置它);接下来是实现对称和正确停止。乐意回答关于OSC和Anim Blueprint的问题。