blender瞎玩4:自制刚性绑定插件
一种偷懒的绑定方法
(1)
我们到底要做什么?
刚性绑定,RigidBind,似乎在maya里看见过这个说法,不知道和我要说的是一回事吗?
总之,
刚性绑定就是,通过把整个孤岛加入顶点组,设置权重为1,然后添加骨骼修改器,顶点组和骨骼取相同的命名,由此连接骨骼和顶点组,达到简单的绑定效果。

或者也可以说是没有蒙皮的简单绑定。
骨骼的父子级操作里有一个“附带空顶点组”,本文就是在此思路的基础上做些改进。

重点在于,
我的目的不是“完成这个操作”,而是使其尽可能的自动化!
如果人不想要偷懒,那和咸鱼有什么区别!
问题:
这时有人会问了,什么顶点组?!为啥你不直接用子集嘞!?
我也不知道为啥。。。不过顶点组有个已知的优点,就是做好绑定后可以随意拆分合并物体,这样的话做的时候分开做,最后再合并为一个物体,就可以导出成点缓存mdd了。因为blen的mdd只能导出激活的那一个物体,这个有点蠢。
如果不需要mdd,用子集的方法似乎也没啥问题。
又有人会说,什么刚性绑定?!老子们公司流程用不上!搞这浪费时间玩意干啥!?
额,好像确实没啥用。不过我觉得用作概念设计挺好,30秒绑定,各个模块随想随改,完全不用在乎顶点顺序和拓扑什么的
嗯。。。暂时就想到这几个优点
(2)
要做成什么样?

这是一个,嗯。。形似人类身体的面板。上面有62个按钮,对应人体的各个骨骼
目标是通过“点一下物体,点一下按钮”的简单步骤,来完成绑定
至于为什么界面做成这个丑样,因为我不会更高级的做法!

如上图,使用这个插件前,我们需要建立一组名为human的骨架,且需要给每段骨骼以上上图的方式命名。至于为什么这么麻烦,为什么不能完全自动化?那当然还是因为我技术有限,只会做成这样!
总之,准备好一切东西,就可以“点一下物体,点一下按钮”来绑定物体了。
注意,因为相应的顶点组和骨骼名称相同,且物体有骨骼修改器连接到骨骼,所以才能生效

来个实例,上图是我随手绑定好的模型,姑且取名为:Super.Cube_Man

做了个简单动作,顺便说一句,blen里有个对称姿态功能挺好使的

(3)
具体要怎么做呢?
我现在用的是 blender 2.80.75
首先,把要使用的命令列出来
没错,接下来开始编程。。。不想看可以跳过,直接看附件的插件代码

先选择物体,然后
bpy.context.active_object.modifiers.clear() # 清空修改器
bpy.ops.object.modifier_add(type='ARMATURE') # 添加骨骼修改器
bpy.context.object.modifiers["Armature"].object = bpy.data.objects["human"] # 所链接的骨骼的名字叫“human”
bpy.context.active_object.vertex_groups.clear() # 清空顶点组
bpy.context.active_object.vertex_groups.new(name=name_vertexgroup) # 新建一个顶点组,这里名字是个变量,用于后面的函数,在控制台不能这么写
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.object.vertex_group_assign() # 指定全部点到新建的顶点组
bpy.ops.object.editmode_toggle()
话说啊,我一个外行人为什么要在这写编程教程呢!?
哦对了,这根本不算教程,只是瞎玩而已
(5)
稍微说说一个operator或panel该怎么写
如果不知从何入手,可以看看官方自带的模板,
虽然也可以直接看插件py文件,但是真的很难看懂
模板位置如下图

按理说,之前那一串命令应该写成一个class类才对,但是我不知道为啥会出错,所以只能换个方法写。
[1]
开头要写上
import bpy
[2]
首先把上面那堆命令定义成一个函数
def fun_rigidbind(name_vertexgroup): # 括号里是变量,代表不同段骨骼和相应顶点组的名字
bpy.context.active_object.modifiers.clear() # 以下是上面的那一堆命令
...
bpy.context.active_object.vertex_groups.new(name=name_vertexgroup)
...
bpy.ops.object.editmode_toggle()
[3]
然后再把函数塞到类里
class Bind_head(bpy.types.Operator): # 类名,似乎必须首字母大写?
bl_idname = "bind.head" # 索引名,似乎必须有且只有一个“.” 我不知道为什么
bl_label = "head" # 显示名,这两个名字是必需的
def execute(self, context):
fun_rigidbind("head") # 调用上面定义的函数,并输入一个字符串
return {'FINISHED'}
但是这里有个问题,我怎么也找不到给类加入变量的方法,所以对于不同的骨骼,我只好把上面这个6行的类写了62次!如果有谁知道怎么写请一定要告诉我
[4]
然后是作为主体的类
用于产生面板和按钮
class Panel_RigidBind(bpy.types.Panel):
bl_label = "Rigid Bind"
bl_idname = "OBJECT_PT_rigidbind"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "constraint" # 必须小写,这里我把插件面板装在我不怎么用的约束面板
...
...
后面太长了不写了,这个panel类很好懂,大家可以看看模板来学习,比如下图这个模板

有些要注意的,比如给按钮一个operator时,前面不要加bpy.ops,后面不要加()
col.operator(" bind.head ",text="head")
[5]
主体后面需要写上所有类的名字,大概是用来批量注册的
classes = (
Panel_RigidBind,
Bind_head,
...
...
...
Bind_toe1_l,
)
[6]
最后还要给所有类注册,嗯,其实我不知道是不是必须要注册,到底是“注册了才能调用”?还是“注册了才能下次调用”?反正批量注册的代码如下
def register():
from bpy.utils import register_class
for cls in classes:
register_class(cls)
def unregister():
from bpy.utils import unregister_class
for cls in classes:
unregister_class(cls)
if __name__ == "__main__":
register()
(6)
这就算写完了
如果只写一个operator类,那你可以在控制台输入 bpy.ops.类名 来调用
panel类似乎调用了也没反应
那么如何把它做成插件呢?
简单,最前面加上下面这几行
bl_info = {
"name": "Rigid Bind:Human",
"author": "steelkettle/zhr",
"version": (1, 0),
"blender": (2, 80, 0),
"location": "",
"description": "Rigid Bind:Human",
"warning": "",
"wiki_url": "",
"category": "",
}
双引号里都是首选项插件界面显示的信息,不填其实也没啥影响
写完后,在首选项>插件里安装你的插件就好了

(7)
一点抱怨:
看了无数教学视频得出一个结论,国内教程根本学不了!不是说国内没技术,大佬当然多得是,杂鱼却更多,不管是大佬还是杂鱼,他们大都不能把人教懂。要不就是百科式的教学,等于没教,要不就是过于浅显,空洞无物。看了他们的教学,连照葫芦画瓢都很难,更不可能举一反三了!
我就是饿死,死外面,也不会再看一眼国内的教程了!
话说blenderCN的教程真好看,真香
推荐俩老外的blender教程,挺基础的,ianscott888 和 Jayanam,油管上搜就行了
(8)
最后附上代码,需要作为插件安装,装好后在约束面板里

我觉得我应该叫它,刚性绑定插件v1.2,或者,Rigid Bind Tool V1.2
这样可以看起来牛逼点
文章和代码仅供参考

















































































