humanoid-motion
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinesehumanoid-motion — a generated two-view take in, a gated clip on the contract out
humanoid-motion — 双视角 take 输入,按 contract 输出经过 gate 的片段
A clip here starts as one video in which a front and a side view of the character perform the
move together, and ends as an action on the humanoid contract skeleton
( → ), so every contract character plays
it unchanged. The front half solves the motion straight onto the character's own rig; the back
half cleans, gates and ships it.
unity-rigged-characterreference/humanoid-contract.md此处的片段始于一个视频,其中角色的正面和侧面视角同步完成同一动作,最终生成 humanoid contract 骨架( → )上的 action,使所有 contract 角色均可原样播放。前半部分直接将动作解算到角色自身的 rig;后半部分负责清理、gate 验证并交付。
unity-rigged-characterreference/humanoid-contract.mdStart here — symptom → where to look
从这里开始——症状 → 查看位置
| Symptom | Go to |
|---|---|
| "Turn this move into an animation"; two-camera mocap; which source (video or a pack) | Which source; |
| The halves of the H3 take play out of step, colours swap, a limb vanishes | reroll the seed ( |
| |
| |
"The solve pops": | |
| Jitter on a clean overlay | raise |
| "Feet slide", "lock the feet"; no plant found | |
| |
| Where to cut the walk loop; the loop pops at the seam | |
| A clip without travel for a controller | |
| Fingers flat or wrong | |
| Can this clip be sold in the EU? | |
The solve is raw material, never the clip. Each stage has a gate that can fail, and a take that fails is re-rolled, re-filmed or trimmed, not hand-repaired. Nothing here retimes a clip or paints a pose.
| 症状 | 查看位置 |
|---|---|
| “把这个动作转换为动画”;双摄像头 mocap;应使用哪种源素材(视频还是素材包) | 选择源素材; |
| H3 take 的前后两部分播放不同步、颜色互换或某个肢体消失 | 重新生成 seed( |
| |
| |
“解算结果出现跳变”:解算中存在 | |
| 干净叠加画面上出现抖动 | 提高 |
| “脚部滑动”“锁定双脚”;未找到 plant(足部落地点) | |
| |
| 在哪里剪切行走循环;循环在接缝处出现跳变 | |
| 为 controller 提供不带位移的片段 | |
| 手指平直或姿势错误 | |
| 此片段能否在欧盟销售? | |
解算结果只是原始素材,绝不是最终片段。 每个阶段都有一个可能失败的 gate;失败的 take 应重新生成、重新拍摄或裁剪,而不是手工修复。这里没有任何步骤会重新定时片段或绘制 pose。
Which source
选择源素材
| The move | Source | Read |
|---|---|---|
| Any move for a contract-rigged character: walk, run, idle, a strike, a leap no actor can do, a Q-version body | two cameras: front + side reference → local H3 video → per-character reader → two-view triangulation → fitted to the rig, no retarget | |
| A clip pack already has it | a pack, retargeted (in place or with translation) | |
| 动作 | 源素材 | 阅读 |
|---|---|---|
| contract rig 角色的任意动作:行走、跑步、待机、一次攻击、演员无法完成的跳跃、Q 版体型 | 双摄像头:正面 + 侧面参考 → 本地 H3 视频 → 角色专属 reader → 双视图三角测量 → 拟合至 rig,无需 retarget | |
| 动画片段包中已有对应动作 | 片段包,经过 retarget(原地或带位移) | |
The front half — scripts/twocam/twocam.py
scripts/twocam/twocam.py前半部分——scripts/twocam/twocam.py
scripts/twocam/twocam.pyOne cross-platform runner, one subcommand per stage, files under . Blender comes
from or the environment variable (default on the PATH). Exit codes:
0 pass, 2 a gate failed (the runner carries on, so the overlay, the fit and the GLB are there to
look at), 1 refused input or an error (it stops).
runs/<character>/--blenderBLENDERblender| # | Subcommand | Once per | Writes | Look at before the next |
|---|---|---|---|---|
| 1 | | character | | the solved bones and feet it lists |
| 2 | | character | | |
| 3 | | move | | the H3 take itself: both halves in step, colours unswapped. A bad take is rerolled here, before an hour of training |
| 4 | | character | | |
| 5 | | character (CUDA) | | |
| 6 | | move | | |
| 7 | | move | | slide, |
The prompt for comes from (one action sentence per clip). Training does not
run on a Mac; read and fit do. The stages, the frame, the reader, the fit and their gates:
.
filmmake_prompt.pyreference/two-camera.md一个跨平台 runner,每个阶段对应一个子命令,文件存放在 下。Blender 路径来自 或 环境变量(默认从 PATH 中查找 )。退出码:
0 表示通过;2 表示 gate 失败(runner 会继续执行,因此仍可查看叠加结果、拟合结果和 GLB);1 表示输入被拒绝或发生错误(流程停止)。
runs/<character>/--blenderBLENDERblender| # | 子命令 | 执行范围 | 输出 | 下一步前检查 |
|---|---|---|---|---|
| 1 | | 角色 | | 列出的解算骨骼和脚部 |
| 2 | | 角色 | | |
| 3 | | 动作 | | H3 take 本身:前后两部分同步、颜色未互换。错误的 take 应在此阶段重新生成,避免浪费数小时训练时间 |
| 4 | | 角色 | | |
| 5 | | 角色(CUDA) | | |
| 6 | | 动作 | | |
| 7 | | 动作 | | 滑动、 |
filmmake_prompt.pyreference/two-camera.mdThe back half
后半部分
| # | Stage | Run | Gate |
|---|---|---|---|
| 1 | Contact bake | | exit 0: slide p95 ≤ 1.5 cm, max ≤ 3 cm, |
| 2 | Loop cut | | |
| 3 | Gate | | exit 0 |
| 4 | FBX | | |
| 5 | Unity | | every binding resolves on every contract character |
| 6 | Record | | |
Commands in full, the runner's walk worked through, and what each failure means:
.
reference/pipeline.md| # | 阶段 | 运行 | Gate |
|---|---|---|---|
| 1 | 接触烘焙 | | 退出码 0:滑动 p95 ≤ 1.5 cm、最大值 ≤ 3 cm、 |
| 2 | 循环剪切 | | |
| 3 | Gate | | 退出码 0 |
| 4 | FBX | 使用 | |
| 5 | Unity | | 所有 contract 角色上的每个绑定均可正确解析 |
| 6 | 记录 | | |
完整命令、runner 的实际执行流程以及每种失败的含义见:。
reference/pipeline.mdFiles
文件
| Path | Role |
|---|---|
| the runner: |
| the stages it calls (layout, skeleton, prompt, film, reader, detect, solve, exam, Blender scripts): |
| host (BVH) or Blender (action): plants from contact probabilities or the shared plant detector, sole heights from |
| BVH read/write/FK and Euler conversions for |
| the front half: the frame, the skeleton, the stages, the reader, the fit, the gates, the exam |
| the back half: commands, the ledger records, failures and fixes |
| the fixed hand poses a clip ships with |
bash
S=<repo>/skills/humanoid-motion/scripts
python3 $S/bvh_io.py --selftest && python3 $S/contact_bake.py --selftest
blender -b --factory-startup -P $S/contact_bake.py -- --selftest-blendercontact_bake.pymotion_metrics.pyskills/blender-retarget/scriptsreference/two-camera.md| 路径 | 作用 |
|---|---|
| runner: |
| runner 调用的各个阶段(布局、骨架、prompt、film、reader、detect、solve、exam、Blender 脚本): |
| host(BVH)或 Blender(action)模式:根据接触概率或共享 plant 检测器生成 plant;从 |
| 为 |
| 前半部分:坐标系、骨架、各阶段、reader、拟合、gates 和检查 |
| 后半部分:命令、记录条目、失败与修复方法 |
| 片段交付时使用的固定 hand pose |
bash
S=<repo>/skills/humanoid-motion/scripts
python3 $S/bvh_io.py --selftest && python3 $S/contact_bake.py --selftest
blender -b --factory-startup -P $S/contact_bake.py -- --selftest-blendercontact_bake.pyskills/blender-retarget/scriptsmotion_metrics.pyreference/two-camera.mdRules the route is built on
此流程所依据的规则
- One skeleton. The solve is fitted onto the contract rig itself; nothing downstream knows how the motion was made.
- Look at the take before training. comes before
filmanddataset: a take whose halves drift apart is rerolled for a few minutes of filming, not discovered after the reader.train - Translation is part of the clip. The solve moves Hips; stays at rest until root motion is split off downstream.
Root - Plant once, measure everywhere. A plant is the shared definition (sole under 4 cm, under
0.15 m/s ground-relative, 3 frames) or a contact probability ≥ 0.5. The sole is the joint's
height less its rest height above the ground (), and the bake and the gate read the same plant.
sole_offsets - A pop the video has is not the solve's. reports a spike the two-view readings also show as
motion_metrics, not gated; only a spike the fit added counts inpops_in_source. Both count one event per frame and joint, so a twist bone beside the shin is not a second pop. Jitter is gated over 1.2 x the readings' on the same frames; unread fingers take their hand's.popsreplaces a one- or two-frame pop the fit added with a slerp of its neighbours and lists what it changed.solve.py --despike - Hands are fixed. Two views do not resolve fingers; the clip ships with a hand pose layered on
().
reference/hands.md - The licence travels by link. The video carries ; the clip links to it with
licence, so a local H3 video's exclusion (depends-on: US, EU, UK, KR) reaches every clip solved from it.minimax-h3-local
- 单一骨架。 解算结果直接拟合到 contract rig 本身;下游无需了解动作的制作方式。
- 训练前先检查 take。 位于
film和dataset之前:如果 take 的前后两部分逐渐错位,应花费几分钟重新拍摄,而不是等到 reader 训练完成后才发现问题。train - 位移是片段的一部分。 解算会移动 Hips;在下游分离 root motion 之前,Root 保持静止。
- 只生成一次 plant,并在所有位置统一测量。 plant 的统一定义为:脚底低于 4 cm、相对地面的速度低于 0.15 m/s,并持续 3 帧;或者接触概率 ≥ 0.5。脚底高度等于关节高度减去其静止时离地的高度();bake 和 gate 读取同一份 plant 数据。
sole_offsets - 视频中已有的跳变不属于解算问题。 如果双视图读数也将某个尖峰显示为 ,则
pops_in_source不会将其纳入 gate;只有拟合引入的尖峰才计入motion_metrics。两者对每帧、每个关节都只计为一次事件,因此胫骨旁的扭转骨骼不会被计为第二次跳变。抖动 gate 的阈值为相同帧上读数抖动的 1.2 倍;无法读取手指时,使用手部的抖动值。pops会用相邻姿态的 slerp 替换拟合引入的一帧或两帧跳变,并列出所做的修改。solve.py --despike - 手部姿态固定。 两个视图无法解析手指;片段交付时会叠加固定 hand pose()。
reference/hands.md - licence 通过链接传递。 视频携带 ;片段通过
licence链接到视频,因此本地 H3 视频的排除限制(depends-on:美国、欧盟、英国、韩国)会传递到由该视频解算出的每个片段。minimax-h3-local
Scope — what this skill does NOT do
范围——此 skill 不做什么
- Installing models or GPU environments: the user does it.
- Rigging the character onto the contract: (Auto-Rig Pro), or
character-autorigby hand.blender-character-rig - Retarget internals and pack clips (conjugation, , in place, the bake-off):
k.blender-retarget - Generating video (the ComfyUI server, H3 templates, the queue): .
comfyui-asset-generation - Unity import, Avatars and masks: ; runtime foot IK and blending:
unity-rigged-character.unity-animation - Text-to-motion: not in this release.
- 2D sprite loops from video: .
sprite-from-video
- 安装模型或 GPU 环境:由用户完成。
- 将角色绑定到 contract:(Auto-Rig Pro),或使用
character-autorig手动绑定。blender-character-rig - Retarget 内部处理和片段包(conjugation、、原地处理、bake-off):
k。blender-retarget - 生成视频(ComfyUI server、H3 templates、队列):。
comfyui-asset-generation - Unity 导入、Avatar 和遮罩:;运行时脚部 IK 和混合:
unity-rigged-character。unity-animation - Text-to-motion:此版本不支持。
- 从视频生成 2D sprite 循环:。
sprite-from-video