现象
序列帧播放时角色整体左右摆动,肉眼可见。
实测(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 独立跟踪。
现象
序列帧播放时角色整体左右摆动,肉眼可见。
实测(2026-08-11,512 画布,16 帧走路)
包围盒中心几乎不动 = 对齐确实生效了,但它对齐的是错的东西:身体在摆,包围盒不摆。
根因
ai_engine/postprocess/pack.py:cw // 2 - w // 2= 把包围盒水平居中。包围盒包含所有延展物。实测该序列左边界(披挂侧)摆动 15 px,于是对齐为了"把包围盒摆正",反过来把身体推走约 8 px —— 延展物摆多少,身体就被反向推多少。
与既有规则冲突
项目工作规则第 6 条原文:
规则是踩坑后写下的,但实现用的是包围盒中心,与规则相反。
影响面
不只是披风。任何在身体一侧摆动或延伸的东西都会触发:背负大件、长柄武器、尾巴、飘带。角色越有辨识度,偏移越明显。
纵向不受影响(脚线在 16 帧上恒为同一 y)。
修改方向
横向锚点从包围盒中心改为躯干中心,延展物不参与定位。
躯干的判定方式需要设计,可选:主体像素的水平中位数(对细长延展物天然稳健)、按行加权、或只取躯干高度区间。需要在多个角色上验证再定,包括四足与背负大件的形态。
验收
同一批帧,改前改后对照头部中心的横向摆动幅度;人形角色期望降到步幅同级(个位数 px)。同时确认脚线纵向不受影响、无延展物的角色产物逐像素不变。
相关
与 #195(提示词凭空加斗篷)叠加:那件不该存在的斗篷正是当前偏移的来源之一,但即使去掉斗篷,本问题依然存在——背负大件、长柄武器同样会触发。两条需要分别修。
代码在 #180 / #181 的范围内,本 Issue 独立跟踪。