V4 实验

沿边缘布线,再刷局部形变


V4 把 50 个生成部件分别改成轮廓与内部线条约束的三角网格,再用 11 个柔边笔刷控制发梢、衣摆和飘带。尾巴改用连续曲线。纹理沿用 V3。

打开 V4 交互模型下载完整模型V3 报告与原始拆件
50 / 50角色部件独立布线
3,930内部特征约束边
11 / 9笔刷次数 / 受影响部件
0默认动画的网格翻折

翻折检查覆盖 397 个时刻,即每 0.25 帧一次。它是几何检查,不代表动作已还原准确;发型、服装、表情仍有生成素材本身的差异。

先看三组对照

“仅改网格”沿用 V3 的骨骼、关键帧和贴图。完整 V4 才加入笔刷、平滑时间插值、尾巴曲线,以及左前臂支点修正。这样能分清布线与动作各自的作用。

0 / 99 帧
原视频 · 动作参考
V4 · 边缘网格+局部形变
V3 · 规则网格+骨骼
仅改网格 · 原 V3 动作

视频共 100 帧,27 fps。浏览器同步播放允许解码时差;逐帧拖动可检查同一编号。观察重点:衣摆和发梢现在可以相对根部弯曲,尾巴中段转向更连续。整个人物的姿态与原视频仍有明显差距。

模型中直接看骨骼、网格与权重

画布上方可同时开启骨骼、网格、轮廓/线条约束,以及当前笔刷权重。选择部件后可单独显示并放大。把笔刷幅度从 1 拖到 0,直接查看局部形变的贡献;尾巴曲线不受这个幅度控制。

深色表示高权重;根部保护区为零权重。权重定义在未变形的部件上,随网格显示。多次笔刷的位移可以叠加。当前实现由代码记录笔刷范围与关键帧,尚未提供鼠标绘制笔刷的编辑器。

全部部件:处理前/处理后

每张图左侧为 V3,右侧为 V4,使用相同生成贴图。深色轮廓限制网格边界;红色内部线条是剖分必须保留的约束。透明凹口、孔洞和分离小岛分别处理。纯色或弱纹理部件可能只有轮廓约束。

50 个部件
布线统计表 · 点击表头排序
部件V3 三角形V4 三角形内部约束边像素覆盖率最小角
尾巴 · tail896 11007099.80507%20.05°
大衣后片 · coat_back200 1221220100.00000%20.32°
左大腿内层 · thigh_left200 37646100.00000%20.01°
左小腿内层 · shin_left200 40069100.00000%20.10°
右大腿内层 · thigh_right200 52559100.00000%20.08°
右小腿内层 · shin_right200 37741100.00000%20.15°
长裙 · skirt200 1794426100.00000%20.02°
后发 · rear_hair200 2651452100.00000%20.03°
右上臂衣袖 · sleeve_right200 487131100.00000%20.14°
右前臂 · forearm_right200 850100.00000%21.03°
右袖口 · cuff_right200 29386100.00000%20.01°
胸口布料 · chest_base200 44752100.00000%20.19°
绿色衣身 · bodice200 1226316100.00000%20.02°
左大衣前片 · coat_left200 214334599.98547%16.74°
右大衣前片 · coat_right200 982200100.00000%20.14°
左衣领 · lapel_left200 784174100.00000%20.19°
右衣领 · lapel_right200 798188100.00000%20.05°
左交叉带 · strap_left200 210100.00000%23.11°
右交叉带 · strap_right200 460100.00000%21.03°
左飘带 · ribbon_left200 21832100.00000%20.06°
右飘带 · ribbon_right200 23627100.00000%20.06°
左上臂衣袖 · sleeve_left200 428111100.00000%20.13°
左袖口 · cuff_left200 20155100.00000%20.26°
左前臂 · forearm_left200 640100.00000%21.03°
表带 · watch_band200 1146100.00000%21.03°
左手掌 · palm_left200 13512100.00000%20.68°
左拇指 · thumb_left50 745100.00000%20.06°
左食指 · index_left50 649100.00000%21.03°
左中指 · middle_left50 638100.00000%20.47°
左无名指 · ring_left50 875100.00000%20.23°
左小指 · little_left50 8914100.00000%20.43°
右手掌 · palm_right200 15017100.00000%20.24°
右拇指 · thumb_right50 828100.00000%21.03°
右食指 · index_right50 8311100.00000%20.50°
右中指 · middle_right50 7512100.00000%20.66°
右无名指 · ring_right50 8011100.00000%20.05°
右小指 · little_right50 667100.00000%20.54°
信封 · papers200 12412100.00000%20.76°
胸牌 · badge200 18437100.00000%20.22°
表盘 · watch_face200 11516100.00000%20.71°
蝴蝶结 · bow200 10614100.00000%20.26°
闭眼脸 · face200 50367100.00000%20.05°
耳朵 · ear200 35368100.00000%20.29°
帽子 · hood200 1106171100.00000%20.03°
左刘海 · fringe_left200 57456100.00000%20.02°
中刘海 · bangs200 598102100.00000%20.05°
右刘海 · fringe_right200 34549100.00000%20.02°
右长发束 · lock_right200 19916100.00000%20.10°
发冠 · crown200 27646100.00000%20.21°
吊牌与绳 · tags200 43451100.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 的人工关键帧;局部衣摆/头发运动是本轮编排,尚未建立新的逐帧运动观测。脸部仍通过纹理混合切换表情,有中间态重影。尾巴没有深度和体积模型,急弯处收窄;角色生成比例与服装变化仍影响视觉对应。

零翻折只说明所采样时刻的三角形朝向正确,不能排除自遮挡、全部自交或感知上的不自然;也不覆盖用户手动修改后的所有动作。

几何检查覆盖每 0.25 帧;曲线可点击图例隐藏。

边长变化定义为 |当前长度/绑定长度 − 1|。尾巴最大值对小边很敏感,不等于视觉质量。不同拓扑不共享同一组边,因此不把它作为版本优劣的统一分数。对照曲线中的“仅改网格”与 V4 使用相同拓扑。

检查结果范围
逐部件像素覆盖最低 99.80507%全部表情 alpha 并集,alpha > 16;光栅检查共 1034 个未覆盖像素
最小三角形角度16.74°剖分分析坐标,不是变形后最小角
内部约束完整性3,930 条均为三角边对每个返回的约束段检查边索引
Python / JS 计算一致性最大误差 7.28e-12 px6 个时刻、5 类部件,含骨骼编辑
导出编辑重放逐像素一致骨骼平移/旋转、0.65 倍笔刷、手动表情组合;下载后重新加载
源目录完整性123 文件 hash 不变old_stuff 全部文件;V3 场景、纹理与运行时代码另有冻结 hash
原始结果文件

汇总指标 · 逐部件网格统计 · 最终逐时刻检查 · 失败候选检查 · 视觉复核记录 · 浏览器与导出重放检查 · 源文件完整性

下载与复现

独立模型与三个对照场景 本轮实验代码

模型包含生成贴图、场景、网格、权重和普通 WebGL 播放器。解压后用本地 HTTP 服务打开,无需原视频或模型 API。实验代码包用于现有 Livideo2D repo,依赖已有 V3 素材和对照场景;报告视频参考原帧。

python -m http.server 8765 # Open http://127.0.0.1:8765/model/

在项目根目录重建实验:

.venv/bin/python experiments/edge_v4/build.py .venv/bin/python experiments/edge_v4/motion.py .venv/bin/python experiments/edge_v4/refine.py .venv/bin/python experiments/edge_v4/audit.py 02_refined .venv/bin/python experiments/edge_v4/export.py .venv/bin/python -m unittest discover -s tests -v .venv/bin/python -m livideo2d verify-source

完整流程与文件说明见源码包内 experiments/edge_v4/README.md。V4 仍是这段已反复观察的 100 帧视频上的研究原型,没有新的盲测或泛化结论。