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