blender瞎玩5:自制刚性绑定插件(二) 一键创建骨骼
连夜赶制出 Rigid Bind Tool v1.3 版!加入了一键创建骨骼功能
(1)
昨天发的v1.2版有个缺陷,就是骨骼要自己手摆,62根骨骼每次都要手摆想想还有点麻烦,
于是我就想把这部分自动化了,结果实行起来还真不容易,毕竟我没学会几个命令,
不过边看老外教程边做了一天,终于完成了
(2)
现在界面是这样的,新增了一个添加骨架按钮

现在绑定就方便多了,先准备一个人型角色,身体各部位都是分离的物体

点击添加骨架后,效果如下


我这里骨骼和模型的尺寸都是 180m ,因为这是daz3d和marvelousdesigner的默认尺寸。
然后稍微调整一下骨骼

然后就可以绑定了,点一下物体,点一下按钮

加个动作试试看

似模似样嘛
(3)
我发现做这种简单脚本,最困难的是找命令
以下贴出需要的命令
[1]
定义变量
armature_name="human"
bone_name,parent_bone,head_position,tail_position的值写在一个组里了
需要提前定义好的数据有,本层骨头名称,上层骨头名称,骨头根位置坐标,骨头尖位置坐标
b_p=(
("","hip",(0,3.6,105),(0,0.1,117.8)),
("hip","stom",(0, 0.1, 117.8),(0, -1.3, 126.6)),
...
...
)
以下为需要用“保持偏移”模式的骨头
offset_bone=(
"shoulder.r",
...
...
)
[2]
创建骨头写成一个函数:add_bone(parent_bone,bone_name,head_position,tail_position)
bpy.ops.armature.bone_primitive_add(name=bone_name) # 在编辑模式增加骨头
data_editbone=bpy.data.armatures[armature_name].edit_bones[bone_name] # 一个bone TYPE
bpy.data.armatures[armature_name].edit_bones.active=data_editbone # 给骨头命名,超麻烦
bpy.context.active_bone.head = head_position # 骨头根位置
bpy.context.active_bone.tail = tail_position # 骨头尖位置
data_editbone=bpy.data.armatures[armature_name].edit_bones[parent_bone]
bpy.data.armatures[armature_name].edit_bones.active=data_editbone # 激活某根骨头
bpy.ops.armature.parent_set(type='OFFSET') # 骨头间连接,类型为保持偏移
经验:这里有个很坑爹的问题,在连接骨头时,本来应该选中本层骨头,加选上层骨头,执行连接,这时本层骨头仍保持激活状态。 但是代码里是反着的,对本层骨头操作完后,需要“激活”上层骨头,而使用“选择”命令则是无效的
[3]
这个函数要加入条件,当遇到hip即最上层骨头时,不赋予父级。然后遇到肩膀,手指,大腿等位置是选择保持偏移模式
if bpy.context.active_bone.name != "hip":
if bone_name in offset_bone:
#bpy.data.objects[armature_name].data.edit_bones[parent_bone].select = True
#bpy.data.objects[armature_name].data.edit_bones[bone_name].select_tail = True
#bpy.data.objects[armature_name].data.edit_bones[bone_name].select_head = True
data_editbone=bpy.data.armatures[armature_name].edit_bones[parent_bone]
bpy.data.armatures[armature_name].edit_bones.active=data_editbone
bpy.ops.armature.parent_set(type='OFFSET')
else :
data_editbone=bpy.data.armatures[armature_name].edit_bones[parent_bone]
bpy.data.armatures[armature_name].edit_bones.active=data_editbone
bpy.ops.armature.parent_set(type='CONNECTED')
[4]
其他命令写成另一个函数:add_armature()
bpy.ops.object.armature_add() # 创建骨架
bpy.context.active_object.name = armature_name # 命名骨架
bpy.data.objects[armature_name].data.name = armature_name # 命名下一层级
bpy.ops.object.editmode_toggle()
data_basebone=bpy.data.objects[armature_name].data.edit_bones["Bone"]
bpy.data.objects[armature_name].data.edit_bones.remove(data_basebone) # 删除默认骨头
[5]
这个函数要加入循环,自动生成所有62个骨骼
x=0
length=len(b_p)
for x in range(length):
add_bone(b_p[x][0],b_p[x][1],b_p[x][2],b_p[x][3],) # 执行上一个函数
x=x+1
[6]
最后把下面这个class添加到按钮里
class AddArmature(bpy.types.Operator):
bl_idname = "add.armature"
bl_label = "Add Armature"
def execute(self, context):
add_armature()
return {'FINISHED'}
大功告成!
关于省略的步骤,请自行参考文章右下角的附件代码
关于class或函数怎么使用,插件怎么制作,请参考上一篇文章“blender瞎玩4:自制刚性绑定插件”
(4)
贴上新版代码以供参考
取名为 Rigid Bind Tool v1.3 版!














































































