尾巴 · tail


V4 把 50 个生成部件分别改成轮廓与内部线条约束的三角网格,再用 11 个柔边笔刷控制发梢、衣摆和飘带。尾巴改用连续曲线。纹理沿用 V3。
翻折检查覆盖 397 个时刻,即每 0.25 帧一次。它是几何检查,不代表动作已还原准确;发型、服装、表情仍有生成素材本身的差异。
“仅改网格”沿用 V3 的骨骼、关键帧和贴图。完整 V4 才加入笔刷、平滑时间插值、尾巴曲线,以及左前臂支点修正。这样能分清布线与动作各自的作用。
视频共 100 帧,27 fps。浏览器同步播放允许解码时差;逐帧拖动可检查同一编号。观察重点:衣摆和发梢现在可以相对根部弯曲,尾巴中段转向更连续。整个人物的姿态与原视频仍有明显差距。
画布上方可同时开启骨骼、网格、轮廓/线条约束,以及当前笔刷权重。选择部件后可单独显示并放大。把笔刷幅度从 1 拖到 0,直接查看局部形变的贡献;尾巴曲线不受这个幅度控制。
深色表示高权重;根部保护区为零权重。权重定义在未变形的部件上,随网格显示。多次笔刷的位移可以叠加。当前实现由代码记录笔刷范围与关键帧,尚未提供鼠标绘制笔刷的编辑器。
每张图左侧为 V3,右侧为 V4,使用相同生成贴图。深色轮廓限制网格边界;红色内部线条是剖分必须保留的约束。透明凹口、孔洞和分离小岛分别处理。纯色或弱纹理部件可能只有轮廓约束。
| 部件 | V3 三角形 | V4 三角形 | 内部约束边 | 像素覆盖率 | 最小角 |
|---|---|---|---|---|---|
| 尾巴 · tail | 896 | 1100 | 70 | 99.80507% | 20.05° |
| 大衣后片 · coat_back | 200 | 1221 | 220 | 100.00000% | 20.32° |
| 左大腿内层 · thigh_left | 200 | 376 | 46 | 100.00000% | 20.01° |
| 左小腿内层 · shin_left | 200 | 400 | 69 | 100.00000% | 20.10° |
| 右大腿内层 · thigh_right | 200 | 525 | 59 | 100.00000% | 20.08° |
| 右小腿内层 · shin_right | 200 | 377 | 41 | 100.00000% | 20.15° |
| 长裙 · skirt | 200 | 1794 | 426 | 100.00000% | 20.02° |
| 后发 · rear_hair | 200 | 2651 | 452 | 100.00000% | 20.03° |
| 右上臂衣袖 · sleeve_right | 200 | 487 | 131 | 100.00000% | 20.14° |
| 右前臂 · forearm_right | 200 | 85 | 0 | 100.00000% | 21.03° |
| 右袖口 · cuff_right | 200 | 293 | 86 | 100.00000% | 20.01° |
| 胸口布料 · chest_base | 200 | 447 | 52 | 100.00000% | 20.19° |
| 绿色衣身 · bodice | 200 | 1226 | 316 | 100.00000% | 20.02° |
| 左大衣前片 · coat_left | 200 | 2143 | 345 | 99.98547% | 16.74° |
| 右大衣前片 · coat_right | 200 | 982 | 200 | 100.00000% | 20.14° |
| 左衣领 · lapel_left | 200 | 784 | 174 | 100.00000% | 20.19° |
| 右衣领 · lapel_right | 200 | 798 | 188 | 100.00000% | 20.05° |
| 左交叉带 · strap_left | 200 | 21 | 0 | 100.00000% | 23.11° |
| 右交叉带 · strap_right | 200 | 46 | 0 | 100.00000% | 21.03° |
| 左飘带 · ribbon_left | 200 | 218 | 32 | 100.00000% | 20.06° |
| 右飘带 · ribbon_right | 200 | 236 | 27 | 100.00000% | 20.06° |
| 左上臂衣袖 · sleeve_left | 200 | 428 | 111 | 100.00000% | 20.13° |
| 左袖口 · cuff_left | 200 | 201 | 55 | 100.00000% | 20.26° |
| 左前臂 · forearm_left | 200 | 64 | 0 | 100.00000% | 21.03° |
| 表带 · watch_band | 200 | 114 | 6 | 100.00000% | 21.03° |
| 左手掌 · palm_left | 200 | 135 | 12 | 100.00000% | 20.68° |
| 左拇指 · thumb_left | 50 | 74 | 5 | 100.00000% | 20.06° |
| 左食指 · index_left | 50 | 64 | 9 | 100.00000% | 21.03° |
| 左中指 · middle_left | 50 | 63 | 8 | 100.00000% | 20.47° |
| 左无名指 · ring_left | 50 | 87 | 5 | 100.00000% | 20.23° |
| 左小指 · little_left | 50 | 89 | 14 | 100.00000% | 20.43° |
| 右手掌 · palm_right | 200 | 150 | 17 | 100.00000% | 20.24° |
| 右拇指 · thumb_right | 50 | 82 | 8 | 100.00000% | 21.03° |
| 右食指 · index_right | 50 | 83 | 11 | 100.00000% | 20.50° |
| 右中指 · middle_right | 50 | 75 | 12 | 100.00000% | 20.66° |
| 右无名指 · ring_right | 50 | 80 | 11 | 100.00000% | 20.05° |
| 右小指 · little_right | 50 | 66 | 7 | 100.00000% | 20.54° |
| 信封 · papers | 200 | 124 | 12 | 100.00000% | 20.76° |
| 胸牌 · badge | 200 | 184 | 37 | 100.00000% | 20.22° |
| 表盘 · watch_face | 200 | 115 | 16 | 100.00000% | 20.71° |
| 蝴蝶结 · bow | 200 | 106 | 14 | 100.00000% | 20.26° |
| 闭眼脸 · face | 200 | 503 | 67 | 100.00000% | 20.05° |
| 耳朵 · ear | 200 | 353 | 68 | 100.00000% | 20.29° |
| 帽子 · hood | 200 | 1106 | 171 | 100.00000% | 20.03° |
| 左刘海 · fringe_left | 200 | 574 | 56 | 100.00000% | 20.02° |
| 中刘海 · bangs | 200 | 598 | 102 | 100.00000% | 20.05° |
| 右刘海 · fringe_right | 200 | 345 | 49 | 100.00000% | 20.02° |
| 右长发束 · lock_right | 200 | 199 | 16 | 100.00000% | 20.10° |
| 发冠 · crown | 200 | 276 | 46 | 100.00000% | 20.21° |
| 吊牌与绳 · tags | 200 | 434 | 51 | 100.00000% | 20.01° |




































































































纹理的处理前后与生成原图保留在 V3 拆件报告。本轮只改几何,未重新分割或生成角色图片。
| 选择 | 解决的问题 | 本轮取舍 |
|---|---|---|
| 逐部件约束剖分 | 网格跨透明空区,折线和发梢缺少对应边 | 优先做;可用几何检查精确验证 |
| 平顶柔边笔刷 | 部件整体转动,缺少根部固定、末端弯曲 | 先覆盖 9 个最适合局部弯曲的部件 |
| 连续尾巴中心线 | 长骨链混合造成局部收缩与折角 | 先复用已人工判断的轨迹方向;不新增追踪模型 |
| 全身 IK、接触与大幅转面 | 整身姿态和原视频不同 | 本轮未扩展;先解决拓扑与局部形变基础 |
参考 repo 中 old_stuff/scripts/triangulation.py 的传统边缘检测。旧实现按边缘强度随机采点,再做普通 Delaunay;V4 使用 alpha 轮廓、简化后的 Canny 线段和位于部件内部的骨骼支点。所有线段先处理交点,再交给约束剖分。每个部件独立执行,表情部件用全部状态的 alpha 并集。
Triangle 接受带线段和孔洞的平面图,能够保留输入约束并细化内部三角形。代码使用质量与面积约束,具体实现参考 Triangle Python API 和 Triangle 作者文档。轮廓留少量透明余量,贴图像素不变。余量受邻近部件岛与孔洞间隙限制,避免把检测出的岛合并或小孔填平;分析缩图中的零面积点/线噪点不生成独立多边形。
初次全尺寸分析得到约 5.1 万个三角形,小表盘也有近千顶点。复核后按屏幕尺寸调整分析分辨率,降至 22,982 个角色三角形。V3 为 9,196 个;新布线更贵,优先保证结构而非最低面数。
椭圆笔刷中央保持固定权重,边缘用 smoothstep 平滑降至零,再乘以根部保护蒙版。每次笔刷记录二维位移关键帧,先在静止部件上叠加,再应用骨骼变换。发梢、衣摆使用不同事件时刻,时间插值采用无分量过冲的三次 Hermite 曲线。
这种方式借鉴艺术家的局部形变操作。Live2D 官方变形笔刷说明也把权重、尺寸与硬度作为不同控制项。这里的具体权重函数与关键帧由本实验定义,并非 Cubism 算法复刻。
LLM 负责选择受控部件、笔刷位置、动作时刻和视觉复核;代码负责生成权重、剖分、插值、渲染及检测。没有可微渲染、图像 loss 拟合或参数搜索。
第一版把尾巴的中心线坐标直接在时间上插值。关键帧看似正常,中间转向时却出现最多 76 个翻折三角形(在最终网格上复测)。修正版改为插值展开后的方向角,以固定 330 px 弧长重建曲线;宽度随曲率平滑收窄,弯曲越急影响越大。默认完整动画的 397 个采样时刻均为零翻折。
曲率保护牺牲了部分厚度,不保持体积。这是明确的几何折中。首版候选、完整检测和选择理由均保留在下载数据中。
全身动作仍主要来自 V3 的人工关键帧;局部衣摆/头发运动是本轮编排,尚未建立新的逐帧运动观测。脸部仍通过纹理混合切换表情,有中间态重影。尾巴没有深度和体积模型,急弯处收窄;角色生成比例与服装变化仍影响视觉对应。
零翻折只说明所采样时刻的三角形朝向正确,不能排除自遮挡、全部自交或感知上的不自然;也不覆盖用户手动修改后的所有动作。
边长变化定义为 |当前长度/绑定长度 − 1|。尾巴最大值对小边很敏感,不等于视觉质量。不同拓扑不共享同一组边,因此不把它作为版本优劣的统一分数。对照曲线中的“仅改网格”与 V4 使用相同拓扑。
| 检查 | 结果 | 范围 |
|---|---|---|
| 逐部件像素覆盖 | 最低 99.80507% | 全部表情 alpha 并集,alpha > 16;光栅检查共 1034 个未覆盖像素 |
| 最小三角形角度 | 16.74° | 剖分分析坐标,不是变形后最小角 |
| 内部约束完整性 | 3,930 条均为三角边 | 对每个返回的约束段检查边索引 |
| Python / JS 计算一致性 | 最大误差 7.28e-12 px | 6 个时刻、5 类部件,含骨骼编辑 |
| 导出编辑重放 | 逐像素一致 | 骨骼平移/旋转、0.65 倍笔刷、手动表情组合;下载后重新加载 |
| 源目录完整性 | 123 文件 hash 不变 | old_stuff 全部文件;V3 场景、纹理与运行时代码另有冻结 hash |
模型包含生成贴图、场景、网格、权重和普通 WebGL 播放器。解压后用本地 HTTP 服务打开,无需原视频或模型 API。实验代码包用于现有 Livideo2D repo,依赖已有 V3 素材和对照场景;报告视频参考原帧。
在项目根目录重建实验:
完整流程与文件说明见源码包内 experiments/edge_v4/README.md。V4 仍是这段已反复观察的 100 帧视频上的研究原型,没有新的盲测或泛化结论。