Shap-E是OpenAI开源的一个3D生成模型,它可以根据一句文本描述或者一张图片,直接生成一个隐式表示的三维物体,并能导出为mesh网格。不过很多人拿到生成结果后发现,这只是一个静态模型,想让它做出走路、挥手、翻转这类动画,就必须补上骨骼绑定和权重绘制这两块基础工作。这篇文章就以Shap-E生成的模型为素材,把骨骼绑定和权重绘制的基本流程讲清楚,并用Blender作为操作工具进行演示。

一、Shap-E生成模型的结构特点与导出处理
Shap-E输出的并不是传统软件里建出来的规整网格,而是通过隐式函数采样得到的mesh,其拓扑结构往往比较杂乱:顶点分布不均匀、面片大小差异大、某些区域可能存在非流形结构。这种网格直接拿去做骨骼绑定,权重分配时会非常难看,变形效果也容易出现撕裂。
所以在绑定骨骼之前,建议先做一次网格重建。常用的做法是利用Blender的重拓扑功能,或者直接导出后用第三方工具简化面数。下面是一段使用Shap-E官方代码生成模型并导出obj文件的示例:
import torch
from shap_e.diffusion.sample import sample_latents
from shap_e.diffusion.gaussian_diffusion import diffusion_from_config
from shap_e.models.download import load_model, load_config
from shap_e.util.notebooks import decode_latent_mesh
# 加载预训练的文本生成模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
xm = load_model('transmitter', device=device)
model = load_model('text300M', device=device)
diffusion = diffusion_from_config(load_config('diffusion'))
latents = sample_latents(
batch_size=1,
model=model,
diffusion=diffusion,
guidance_scale=15.0,
prompt='a walking robot character',
device=device,
)
# 解码并导出为obj格式,方便导入Blender
mesh = decode_latent_mesh(latents[0]).tri_mesh()
with open('robot.obj', 'w') as f:
mesh.write_obj(f)
print('模型已导出为 robot.obj')
导出的obj文件可以直接拖入Blender。导入后第一件事是检查法线方向和缩放值,按Ctrl+A应用缩放,否则后续骨骼变形会出现意想不到的拉伸。如果面数过高,可以添加Decimate修改器把面数控制在一万到五万之间,这个量级对于骨骼绑定来说既能保留细节,又不会让权重绘制的工作量失控。
二、在Blender中为模型搭建骨骼骨架
骨骼绑定是让模型可以被驱动的第一步。Blender中按Shift+A添加Armature骨架,然后进入编辑模式逐节搭建骨骼。以一个人形角色为例,通常需要依次创建脊柱、头部、手臂、手指和腿脚等骨骼链。搭建时注意让骨骼的关节位置对准模型的解剖位置,比如肘部骨骼的关节点应该落在模型手肘的网格内部,偏离太远会导致弯曲时出现破面。
骨架搭建完成后,需要把网格和骨架关联起来。先选中网格物体,再按住Shift选中骨架,然后按Ctrl+P选择With Automatic Weights,Blender会基于骨骼与网格的空间关系自动计算一份初始权重。这个自动权重对于Shap-E生成的模型来说往往不够精确,因为这类模型的网格疏密不均,自动算法在细密区域分配得还行,在稀疏区域就容易出错。
骨骼的命名也值得花点心思。规范的命名如arm.L、arm.R可以开启骨架的X轴镜像功能,这样调整左侧骨骼时右侧会同步变化,权重也能通过镜像工具复制到对侧,能省下一半的工作量。如果模型是对称的,强烈建议在搭建骨骼时就把镜像功能用起来。
三、权重绘制的原理与实操技巧
权重本质上是一个0到1之间的数值,表示某根骨骼对某个顶点的影响力大小。一个顶点可以被多根骨骼同时影响,所有影响力的总和会归一化处理。比如小臂区域的顶点,权重主要给小臂骨骼,同时分一点给上臂骨骼作为过渡,这样弯曲时关节处的网格才会平滑变形,而不是出现生硬的折角。
Blender的权重绘制模式是一个直观的调整工具。选中网格后切换到Weight Paint模式,模型表面会显示从蓝到红的颜色渐变,蓝色代表权重为0,红色代表权重为1。此时可以选中任意一根骨骼,用笔刷在模型表面涂抹。笔刷有Add、Subtract、Blur几种类型:Add用来增加权重,Subtract用来减少,Blur则用于柔化过渡区域。调整权重时有一个实用技巧——按住Ctrl并点击某根骨骼,可以直接进入该骨骼的权重显示,配合快捷键来回切换效率很高。
对于对称模型,可以开启镜像绘制选项(Topology Mirror),左侧画的权重会实时镜像到右侧。另外还可以使用权重渐变工具(Gradient工具),从关节到骨骼中段拉一条渐变线,快速做出平滑的权重过渡,这比手动涂抹效率高很多,特别适合处理腿部、手臂这类长条形区域。
四、常见变形问题与排查思路
权重调整完不等于结束,必须实际转动骨骼测试变形效果。常见问题有三种:一是弯曲关节时网格出现尖锐的折叠,这通常是关节附近权重过渡太硬造成的,用Blur笔刷把过渡区域柔化几笔即可;二是某些顶点完全不动,像被钉住一样,多半是这些顶点被意外分给了不相关的骨骼,进入权重绘制模式检查该区域的权重归属即可定位;三是模型整体跟着某根骨骼异常移动,这往往是根骨骼权重污染了大片区域,需要用Subtract笔刷把多余权重清除。
还有一个容易被忽略的点是骨骼的形变方式。每根骨骼的Bone Properties里可以设置Deform选项,只有勾选了Deform的骨骼才会参与权重计算。控制用的骨骼(比如IK控制器)应该取消这个勾选,否则会把权重体系搞乱。养成这个习惯后,骨架会清晰地区分出形变骨骼和控制骨骼,后期制作动画时会轻松很多。
最后建议把调整好的模型连同骨架一起保存为blend工程文件,或者导出为glTF格式。glTF对骨骼动画的支持很完善,导出后可以直接拿到Three.js、Unity等环境中使用。通过Shap-E生成加手工绑定权重这套流程,即使是零建模基础的人,也能快速获得可以动起来的3D角色资产。