blender瞎玩5:自制刚性绑定插件(二) 一键创建骨骼

保定/设计爱好者/5年前/471浏览
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 版!


6
Report
|
4
Share
相关推荐
评论
in to comment
Add emoji
喜欢TA的作品吗?喜欢就快来夸夸TA吧!
推荐素材
You may like
工作渲染
Homepage recommendation
相关收藏夹
3D类
3D类
3D类
3D类
作品收藏夹
企业展厅
企业展厅
企业展厅
企业展厅
精选收藏夹
作品收藏夹
ip形象设计+表情包
ip形象设计+表情包
ip形象设计+表情包
ip形象设计+表情包
精选收藏夹
作品收藏夹
IP形象及IP内容
IP形象及IP内容
IP形象及IP内容
IP形象及IP内容
精选收藏夹
作品收藏夹
IP形象——动物类
IP形象——动物类
IP形象——动物类
IP形象——动物类
精选收藏夹
作品收藏夹
文创
文创
文创
文创
精选收藏夹
作品收藏夹
大家都在看
Log in