Skip to content

逐帧对齐锚在包围盒中心而非躯干中心,延展物摆动把身体反向推走(Refs #171 #21) #196

Description

@johnnyzhang-eng

现象

序列帧播放时角色整体左右摆动,肉眼可见。

实测(2026-08-11,512 画布,16 帧走路)

量的对象 横向摆动幅度
包围盒中心 0.5 px
脚部中心 29 px(步幅,正常)
头部中心 24.5 px(4.8% 画布宽)

包围盒中心几乎不动 = 对齐确实生效了,但它对齐的是错的东西:身体在摆,包围盒不摆。

根因

ai_engine/postprocess/pack.py

canvas.alpha_composite(crop, (cw // 2 - w // 2, int(ch * foot_line) - h - lift))

cw // 2 - w // 2 = 把包围盒水平居中。

包围盒包含所有延展物。实测该序列左边界(披挂侧)摆动 15 px,于是对齐为了"把包围盒摆正",反过来把身体推走约 8 px —— 延展物摆多少,身体就被反向推多少。

与既有规则冲突

项目工作规则第 6 条原文:

画布漂移是真问题、必须逐帧对齐。生成的每帧角色位置/尺寸都不同,按"脚底线 + 躯干中心"锚点对齐(忽略剑/围巾等延展物,否则包围盒被撑大导致身体横跳)。这是产品差异化内核之一。

规则是踩坑后写下的,但实现用的是包围盒中心,与规则相反。

影响面

不只是披风。任何在身体一侧摆动或延伸的东西都会触发:背负大件、长柄武器、尾巴、飘带。角色越有辨识度,偏移越明显。

纵向不受影响(脚线在 16 帧上恒为同一 y)。

修改方向

横向锚点从包围盒中心改为躯干中心,延展物不参与定位。

躯干的判定方式需要设计,可选:主体像素的水平中位数(对细长延展物天然稳健)、按行加权、或只取躯干高度区间。需要在多个角色上验证再定,包括四足与背负大件的形态。

验收

同一批帧,改前改后对照头部中心的横向摆动幅度;人形角色期望降到步幅同级(个位数 px)。同时确认脚线纵向不受影响、无延展物的角色产物逐像素不变。

相关

#195(提示词凭空加斗篷)叠加:那件不该存在的斗篷正是当前偏移的来源之一,但即使去掉斗篷,本问题依然存在——背负大件、长柄武器同样会触发。两条需要分别修。

代码在 #180 / #181 的范围内,本 Issue 独立跟踪。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions