blender瞎玩4:自制刚性绑定插件

用户头像
保定/设计爱好者/6年前/426浏览
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

这样可以看起来牛逼点


文章和代码仅供参考




3
举报
|
2
分享
相关推荐
评论
用户头像
评论你的想法~
表情
喜欢TA的作品吗?喜欢就快来夸夸TA吧!
推荐素材
三维渲染的简约简洁极简风格几何体场景海报
三维上海城市天际线
深蓝色三维科技地球,全球化、国际化、科学技术概念抽象图形
三维界面科学技术,科幻场景矢量背景图。
红色喜庆风格的三维产品展台
三维渲染的老年医生
三维渲染的流动白色布料透明玻璃背景
黑暗房间内的金属方块展台,三维渲染
三维地形图,等高线。抽象的点线科技背景,类似云端数据连接、区块链、神经网络的概念。
三维假期旅行主题
三维金融创意股票基金金融模型
三维渲染的年轻女医生
灰色三角四面体、点线链接构成三维空间科技矢量背景
点线连接的科技矢量背景,三维抽象矢量星球,寓意全球化、国际化,球形世界地图
三维曲线空间背景
红色三维概念礼盒背景
三维渲染极简北欧风现代家居装饰场景
三维渲染炫彩背景
三维渲染红色礼盒
三维渲染抽象波浪流金风格背景
三维抽象矢量星球,寓意全球化、国际化,球形世界地图,点和线连接的矢量背景
扁平化抽象几何三维模型创意时尚海报
三维渲染极简空白室外背景
矢量抽象三维几何图形创意海报
三维户型剖面图
你可能喜欢
相关收藏夹
大家都在看
登录注册