3 步搞定 Blockbench 骨骼权重绘制从 VertexGroups 到 Skinning【免费下载链接】blockbenchBlockbench - A low poly 3D model editor项目地址: https://gitcode.com/GitHub_Trending/bl/blockbench你刚在 Blockbench 里给低模角色绑完骨骼一按播放——肩膀直接撕成两半。十有八九这不是建模的问题而是骨骼权重没画好顶点没拿到对应骨骼的权重动画一来就被两边扯开。这篇以权重笔刷为主线带你走一遍从 VertexGroups 创建到 Skinning 预览的完整路径外加 3 个最常见的权重事故。5 分钟上手。⚡ 为什么你的模型动不起来一次骨骼绑定翻车现场场景很典型一个方块人的模型绑了 Armature手臂骨骼也摆好了位置播放动画的那一刻上臂和躯干之间的网格像被手撕的纸一样裂开甚至整块飞出屏幕。根因其实就一句话顶点不知道听谁的。Skinned Mesh 的变形逻辑是每个顶点被若干骨骼按各自权重拉扯如果你从没给顶点写过权重所有骨骼对它的权重都是 0——骨骼转了顶点原地不动缝隙就这么撕出来了。VertexGroups顶点组就是那张听谁的话、听几成的声明表。在 Blockbench 里它不单独存在而是直接挂在每根骨骼上。VertexGroups 到底在管什么3 个数字完成一次骨骼绑定整个数据结构可以压缩成三要素一个顶点、一根骨骼、一个权重值。顶点可以同时对多根骨骼持有权重理想情况下总和为 1。具体存储长这样骨架来自 js/outliner/types/armature_bone.tsthis.vertex_weights {}; // 形如 { a1b2c3:17: 1, a1b2c3:18: 0.6 } getVertexWeight(mesh, vkey) { const key mesh.uuid.slice(0, 6) : vkey; return this.vertex_weights[key] ?? 0; } setVertexWeight(mesh, vkey, weight) { const key mesh.uuid.slice(0, 6) : vkey; weight ? this.vertex_weights[key] weight : delete this.vertex_weights[key]; }也就是说权重表的 key 是网格 ID 前 6 位 顶点编号value 就是 0~1 的浮点数。传 0 或不传等价于删除这条权重所以清掉权重和写权重走的是同一个入口。权重值含义0.0这根骨骼对该顶点完全无效等于没绑0.5和邻接骨骼五五分成顶点停在两者中间1.0顶点完全跟随这根骨骼动画里它只认这一个方向权重相关的动作注册都汇聚在 js/modeling/mesh_editing.js里面 import 了 set_vertex_weights 这套选中顶点 → 选骨骼 → 填权重的对话框逻辑。️ 动手框选 → 权重笔刷 → 镜像笔刷权重绘制全流程先说结论80% 的权重靠笔刷磨出来框选只负责铺底。下面按顺序做。框选顶点让权重扩散出去编辑模式下把选择切到顶点层级拉框框住上臂全部顶点漏掉的用 Shift 点选补上。在 Outliner 里选中对应骨骼ShiftE可以给当前骨骼快速加子骨——先保证骨骼链和模型对得上。触发设置顶点权重动作选上臂骨骼权重填1.0勾选 overwrite把这块区域彻底划归它。没把握哪块归谁时直接点计算顶点权重让引擎自动分配一遍再手动修正——它的算法在 js/modeling/mesh/attach_armature.ts按顶点离骨骼线段多近、是否被骨骼轮廓环包围来打分。留一手关节处肘、肩、胯的顶点先别给满权重给到 0.5 左右留给笔刷过渡。拿权重笔刷把过渡区域磨平滑在 Outliner 选中目标骨骼比如前臂骨在 Toolbox 点权重笔刷核心逻辑在 js/modeling/weight_paint.ts。底部两个滑杆size默认 50管笔刷直径limit默认 100是画上去想达到的权重值。按住鼠标在肘部区域拖动圈内顶点按距离衰减混合向 limit 靠近。衰减核心不长const falloff (1 - distance / radius) * (1 baseRadius); const influence Math.hermiteBlend(Math.clamp(falloff, 0, 1)); if (event.ctrlKey) { value value * (1 - influence); // Ctrl减去 } else { value value (limit - value) * influence; // 默认向目标值混合 } value 0.04 ? deleteWeight(vkey) : setWeight(value); // 自动清掉微量权重注意最后一行小于 0.04 的权重会被直接删掉所以擦掉一笔就够干净不用抠像素。按住 Ctrl 切减去模式把画歪的地方扣回来按住 Shift 强度降为 1/8专门给过渡带做细磨。混合模式选 set 时给这根骨加权重会自动从其他骨等量扣减——总权重天然不超过 1。这套屏幕坐标 → 模型空间的映射和 UV 编辑里 js/texturing/uv.js 的 getBrushCoordinates 是同款思路先算笔刷半径覆盖范围再对覆盖到的顶点逐一点算。这些按钮背后的动作注册系统入口在 js/interface/actions.js 和共享动作表里。镜像复制省掉一半工作量确认左右网格关于 X0 对称摆放——镜像识别靠找到对面的镜像顶点摆歪了它找不到对应点直接不生效。打开 Mirror Modeling 开关并在工具配置里勾上 enabled两处都要开。只画左侧brush 每落一笔js/modeling/mirror_modeling.ts 里的 symmetrizeArmature 会把刚改的顶点权重同步写到右侧镜像骨骼上。中间轴上的顶点x≈0会被跳过不会自我覆盖——脊柱附近的权重建议单独手画。画完切到顶点权重显示模式扫一眼左右对称性色块不对称的地方就是漏网的。 Skinning 技术骨骼矩阵怎么搬动顶点权重画完变形公式只有一条最终位置 Σ骨骼世界矩阵 × 逆绑定矩阵 × 静息位置× 该骨权重。function applyBoneInfluence(vertex, boneList) { const rest vertex.position.clone().applyMatrix4(vertex.inverseBind); const result new THREE.Vector3(); for (const {bone, weight} of boneList) { if (weight 0) continue; result.add(rest.clone() .applyMatrix4(bone.matrixWorld) .multiplyScalar(weight)); } return result; }一句话人话顶点先还原到绑定时刻的姿势再让每根骨骼按自己动画后的姿态把它拉过去各拉各的比例由权重决定。骨骼的世界矩阵和逆绑定矩阵的更新逻辑在 js/modeling/transform.js 这条变换链上。两条性能建议够用就行权重烘焙把权重表烘成顶点数据随几何体一起导出glTF 的 JOINTS/WEIGHTS 属性运行时零查表开销。顶点合并相邻顶点权重差小于 0.01 的合并成共享顶点既省顶点数又天然消除接缝——笔刷那行 0.04 删权重就是同一思想的轻量版。️ 踩坑记录权重衰减 Falloff 最常见的 3 起事故坑 1权重总和溢出手臂像面团一样膨胀事故现象播放动画时某块区域被吹大越动越肿。原因用 add 混合模式在同一批顶点上连刷了多根骨骼权重和远超 1。修复混合模式切回 set加权重时自动从其他骨扣减。limit 滑杆压到 60~80 重刷一遍事故区域。切到顶点权重显示模式复核——一个顶点被两根骨骼同时亮满就是还没修干净。坑 2关节处动画抖动肘部像腿软事故现象弯曲手臂时过渡区高频颤动。原因两根骨骼影响区的边界太陡骨骼转 1° 顶点位移差就很大帧与帧之间互相抢。修复范围滑杆调大比如 8 → 12重刷过渡区把过渡带拉宽。falloff 换成 hermite spline让衰减曲线变圆润。抖动顽固时跑一次计算顶点权重重算再手动微调回退的部分。坑 3过渡区出现一条硬边事故现象关节弯下去的瞬间皮肤表面折出一道清晰的折线。原因用 constant falloff硬衰减画的权重从 1 直接跳到 0中间没有过渡顶点。这个坑我上周也踩过重刷一次就好。修复falloff 改回 linear 或 hermitelimit 降到 50 左右。按住 Shift1/8 强度沿折线补刷一两遍把硬切磨成渐变。折线所在的环如果本来就是分裂顶点在建模菜单里把它们焊接合并避免变形时各自为政。 收尾从 VertexGroups 到 Skinning 技术到这里你手里已经有一条完整链路框选铺底权重的 VertexGroups笔刷把 Falloff 过渡磨平滑镜像把工作量砍半Skinning 公式负责把骨骼矩阵和权重合成最终动画。剩下的功夫都花在看上——多切顶点权重显示模式眼睛比任何算法都先发现问题。下一步建议读一遍 js/modeling/mesh/attach_armature.ts 里自动权重的打分逻辑你会发现它处理顶点被骨骼环包围的几何判断比想象中讲究改一改就能变成自己的自动绑骨脚本。源码可以本地拉下来翻git clone https://gitcode.com/GitHub_Trending/bl/blockbench【免费下载链接】blockbenchBlockbench - A low poly 3D model editor项目地址: https://gitcode.com/GitHub_Trending/bl/blockbench创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?