Skip to content

fix(generation): 无地面接触的动作按躯干中心对齐 - #564

Open
johnnyzhang-eng wants to merge 1 commit into
1024XEngineer:mainfrom
johnnyzhang-eng:fix/airborne-centroid-anchor
Open

fix(generation): 无地面接触的动作按躯干中心对齐#564
johnnyzhang-eng wants to merge 1 commit into
1024XEngineer:mainfrom
johnnyzhang-eng:fix/airborne-centroid-anchor

Conversation

@johnnyzhang-eng

Copy link
Copy Markdown
Contributor

Closes #534

align_bottom_center 垂直方向按包围盒底边对齐到 foot_line。飞 / 游 / 攀全程没有地面接触,底边是尾羽与爪子、逐帧在变,钉死底边等于让身体跟着延展物反向浮动。

新增 anchor 参数(foot / centroid),质心那档落在 foot_line - fill_h/2,即参考姿态包围盒的纵向中心,所以换锚点不改变构图也不改变尺寸。fill_h / fill_w / ref_height 那套定标一行未动。

不在后端按动作名猜。 引擎的类型体系里没有「全程无地面」这个信息,飞 / 游 / 攀只能以 CUSTOM 进来;jump 腾空但要回地,仍走脚线。所以由调用方沿请求链显式声明,非 CUSTOM 传了直接报错而不是静默忽略。贯通链:

web/api/generation.py:204:442orchestrator/model.py:84service.py:51(asdict 落库)→ MQ → worker/handlers.py:87(重建)→ executor.py:343,347,349:390common/models/character.py:248strategy/base.py:64,70character_generator.py:189,247,270 → 消费点 postprocess/pack.py:297-301

缺陷的量

躯干 std 改前改后的对比不能当证据:质心锚点按定义就是把躯干中心钉在固定线上,它的躯干 std 趋近零是定义不是疗效。换一个这个修法不直接优化的量 —— 「包围盒底边到躯干中心的距离」,它逐帧变多少,脚线锚点就把身体推动多少。43 条线上已交付序列:

动作 n 距离 std 中位 极差中位
walk 13 0.0051 0.0195
idle 11 0.0110 0.0410
custom 16 0.0171 0.0654
attack 3 0.0171 0.0605

单位是占画布高的比例。custom 是 walk 的 3.4 倍;最差的 #197 极差达到 0.3398 —— 脚线锚点会把画布高 34% 的延展物长度变化注入到身体位置上。

这批数里有一条 walk(#69)也高达 0.1077,说明这个驱动量是逐序列的而非按动作名可推,正好是本 PR 走显式声明而不走动作名查表的理由。

验证

六个变异体全部转红(脚本 + try/finally,结束校验 sha256 还原):

改回什么 结果
消费点换回按底边 2 failed,报「躯干仍在浮动:脚线 std=10.16 → 质心 std=10.16」
_lastmile 不传 anchor= 1 failed
vertical_anchor 恒返回脚线 2 failed
_action_input 丢掉该字段(MQ 那一环) 1 failed
编排层不落进 ActionSpec 1 failed
请求层不往下传 1 failed

有地面接触那侧不变:默认出帧与显式 anchor="foot" 逐像素相同,脚线仍落在 0.92(43 条真实序列重对齐后脚线中位 0.9180)。core_span 的行方向改走 _core_rows(本体的位置与跨度共用一把尺子),重构前后在 600 个随机样本上对拍 0 例不一致。

本分支验证:ruff check . 通过、lint-imports 2 kept 0 broken、export_openapiopenapi.json 无漂移、pytest -q 1351 passed / 14 skipped。

未覆盖

  • 测试里的飞行序列是合成的(躯干恒定、尾羽与爪子逐帧伸缩),不是线上产出。上面那张表用的是真实序列,但量的是缺陷的驱动量,不是端到端的前后对比。
  • 前端还没有这个开关:frontend/src/entities/generation/api.ts:611-619 只在 custom 时发 loop,不发 ground_contact。在补 UI 之前,从网页提交的「飞」仍按脚线对齐。
  • 质心那档下方留 0.39*ch,悬在躯干中心以下超过约 0.63×参考高 的部分会被裁,而 pack.py 现有的溢出日志只覆盖宽度。这是既有缺口,未扩。

#524 有文件重叠(orchestrator/executor.pycharacter_generator.py),改动位置不同,先合哪个都需要另一个 rebase。

飞 / 游 / 攀全程没有地面接触,包围盒底边是尾羽与爪子、逐帧在变,钉死底边身体反而
上下浮动。这类动作只能以 custom 进来,故由调用方沿请求链显式声明,不按描述文字猜;
jump 腾空但要回地,仍走脚线。

Refs 1024XEngineer#534
@vercel

vercel Bot commented Aug 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
windup Ignored Ignored Preview Aug 23, 2026 4:55pm

@codecov

codecov Bot commented Aug 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已按固定提交范围 17b25a723410244d9f0a68209d3c946ca0698b56...3a988aef17a389ee324c5673dcd13e5858a62051 完整检查本 PR。质心锚点的几何计算、默认脚线行为、jump/custom 的动作映射,以及 HTTP → 持久化/MQ → worker → 引擎的 ground_contact 传递彼此一致,未发现达到报告阈值的新增正确性、兼容性或安全问题。

验证:所有变更 Python 文件均通过 AST 编译检查,git diff --check 无输出;未能运行 pytest,因为当前环境未安装 pytest 及项目运行依赖。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: 飞行类动作按脚线对齐导致上下颠簸,无地面接触的动作应按质心对齐

1 participant