希望西安疫情尽快过去,西安加油!
再过几天就全面进入考试周了,估计大半个月都不会碰blender了,所以是时候把这一周的实践所学好好总结一下,以供以后的自己和大家参考。
笔者用的blender版本是2.93.6,做IK骨骼绑定的目的是制作角色手持武器的动画,包括射击、换装弹匣等,作为Unity3D TPS Multiplayer游戏项目的骨骼动画素材,最终目标是实现人物重定向动画和武器切换功能(尽管现在还不是很清楚该怎么做)。因此也可以把本篇视为笔者TPS网络游戏开发日志中的一部分,之后笔者会陆续分享其余工作流的实践记录。
本次实践选用官方公开的原神可莉作为角色模型,它是面向MMD的,因此导入blender时需要通过CATS插件对模型作适当转换,具体操作见此链接的pmx转fbx小节;武器模型是在Unity3D的Asset Store中免费下载的,即Modern Weapons Pack;另外,武器的fbx文件导入时可能有编码问题,解决方法参考此链接。
IK骨骼绑定时最好找一个比较好的项目作为参考,观察人家怎么做的,并结合具体情况进行变通。
笔者由于要给Humanoid角色制作射击动画,于是参考FPS手臂的骨骼绑定 —— Leather Gloves,对自己之前绑定的IK手臂进行了修改。
下面将实践过程中学到的东西分享给大家,其中的很多问题已经有了很不错的解答,笔者也在相应地方以链接形式给出,就不赘述了。
给骨骼设置Custom Object主要是为了方便操纵手的IK骨,实现流程见Blender绑定模块:为骨骼设置自定义物体(Custom Object)。
设置Custom Object前、后的骨骼如下图所示:
|
|
由于顶点选择通常比较麻烦耗时,所以考虑能否把左(右)手的顶点组镜像给右(左)手。
关于这个我找了很久,首先是在Vertex Group面板那里做文章,但它的Mirror Vertex Group似乎不能正常工作,具体的错误有人也同样遇到过(见链接)),似乎没有好的解决办法。
然而,在不断的摸索中,我找到了解决方案,该方法正常工作的前提是确保源对象和镜像对象的Mesh是完全镜像的,具体操作如下:
选中角色的Mesh,进入EditMode,选择Properties面板下的绿色三角形(Object Data Properties),展开Vertex Groups,并找到要镜像的顶点组,点击Select选择对应的网格,如下图示:
找到3D ViewPort面板的左上角(有的可能是左下角)的Select按钮,点选Select Mirror,即可发现镜像位置的顶点被选中了
接着在Vertex Groups的中新增一个顶点组,重命名为镜像的名称(Left改为Right,L改为R等等),然后点击Assign即可把选择的顶点作为新顶点组。
其余的部分都可以按照上面的步骤进行,不过说明的是此方法不会将权重镜像,1.3节的方法能镜像骨骼权重,不过代价是可能不会获得对称的顶点组,各有优劣,视具体情况来选择方式,但通常1.3节对于不爱刷权重的小伙伴是更棒的选择。
最后再提醒一下:Remove是作顶点集合的差,因此要清空顶点组,Remove前顶点组的网格应该是当前所选网格的子集;Assign是作顶点集合的并,而不是替换,所以Assign新顶点集之前要用Remove清空顶点组。
1.2介绍了顶点组的镜像方法,但由此方法生成的权重是均一的,要实现权重的镜像,首先确保镜像源对象的权重是已经刷均匀(根据具体情况选择手动或自动分配权重)。
对称骨骼的命名规范见官方文档。
经笔者验证,要确保权重对称命令的正常执行,骨骼命名必须严格符合规范,以ForeTwist.001为例,合法的对称骨骼命名如下(部分):
注:left、right大小写敏感,可大写可小写,但对称骨骼必须保持大小写一致,三种合法情况分别为:全小写,全大写和首字母大写。
另外,笔者从github上找了个重命名插件——Simple Renaming Panel,安装该插件后,就可以根据骨骼名称的Pattern批量修改骨骼命名了。
以将_L后缀改为.L为例,使用流程如下:
按N打开边栏,切换至Rename
选项卡,展开Simple Renaming Panel,Target栏选择Bone
,即对骨骼操作,注意最好切换至Pose Mode,确保正常工作;
取消Only Selected以对所有骨骼进行修改,勾选Use Regex开启正则匹配;
Search栏键入_L
,Replace栏键入.L
,然后点击Search And Replace按钮即可重命名;
_R
→ \rightarrow → .R
同理。
面板参数和操作结果如下图所示:
有时不同的模型的骨骼命名规范不一样,这时候把Search栏的搜索串改为对应Pattern即可,举个例子,如果要把前缀L_
去掉,并在名称末尾加.L
,可以首先搜索所有前缀为L_
的骨骼,用插件的Add suffix功能在这些骨骼后面加上.L
,最后再将L_
替换为空串即可。
由于骨骼命名一般很短,不会有复杂的情况,因此简单的正则表达式即可满足需求。
操作前请确保完成了1.3.1节的骨骼命名规范化,这里以将骨骼Right arm的权重镜像至Left arm为例。
将Left arm的顶点组修改好,尽量不要和Right arm的顶点组有交集,且不要越过X=0,对称骨骼的顶点组和权重如图所示:
打开3D Viewport编辑板块,进入Weight Mode,找到右上角(或右下角)的镜像栏(如下图),点亮X(非常重要),这样才能保证对称和同步;
现在将Right arm的顶点组和权重复制到Left arm上,首先切换至绿色倒三角选项卡 → \rightarrow →Vertex Groups → \rightarrow →点选Left shoulder,然后点击右边的下箭头按钮,在弹出的菜单中点选Copy Vertex Group
,如下图所示:
接着点亮左上角的Vertex Selection
,依次Select
Left arm和Right arm的顶点组(选择顺序很重要,总之确保当前选择的是待镜像的权重),如下图所示:
点击Vertex Groups右边的下箭头,在弹出的菜单栏中点选Mirror Vertex Group
,即可发现权重翻转了,但顶点组也发生了变化,如下图所示:
之后删除顶点组Right arm,将Right arm_copy重命名为Right arm即可。
注:
操作的顶点组不要上锁;
对于不太对称的顶点组,骨骼的权重镜像时也不是完全对称,而且可能会修改顶点组,但一般来说影响不大,只要保证异常顶点的权重为0即可;
效果不太好时,选择1.2节的方法,保证顶点组完全对称,然后手动刷权重。
自动权重操作前最好保存一个副本,以供出现不可逆错误时可以回溯;
自动权重的顺序:先选择Mesh,然后是其骨骼;
自动权重时界面左下角会弹出Make Parent选项卡,注意不要勾选X Mirror,否则会将锁定的顶点组的网格和权重改变;
本次实践的对象是手臂骨骼,可以把手臂骨骼按左右手分为Left Hand和Right Hand两部分,方法和Vertex Group几乎一致,只不过Vertex Group是在网格对象(Mesh)的Edit Mode中进行Assign、Remove、Add、Delete等操作,而Bone Groups是在PoseMode中进行这些操作。
它可以帮助我们迅速选择对应的骨骼,并进行一些操作,还可以给不同骨骼组上不同的色,增加区分度。
Bone Groups详情见官方文档。
本次实践中,骨架层的作用在于将手臂相关的骨骼移动至另一个层中,这样可以避免操作手臂骨骼时对其余骨骼进行误操作,视图也会更干净,提高编辑效率。
笔者大致将骨骼划分至四个层中,分别为手臂骨骼层、武器骨骼层,前臂骨骼层(主要是一些不便于选中但又不太需要选择的骨骼,)和其余骨骼层(避免误操作,所以与手臂分开)。
注:给骨骼分层只是改变了视图的显示,并不会对骨骼的属性或父子关系产生影响。
有关骨架层的介绍,详见此链接
一般来说会给手腕的骨骼添加一个Copy Rotation Constraints,以复制手IK骨的旋转,但注意这里要用World Space → \rightarrow → World Space,因为我们不希望在移动武器主骨时,紧握的双手还会受到反向动力学的作用而发生旋转(在IK作用下,世界坐标系下的位移是可能影响局部坐标系下的旋转的)。
这里通过动图展示一下Local Space → \rightarrow → Local Space 和 World Space → \rightarrow → World Space的区别:
|
|
笔者不懂美术,之前也从未接触过3D模型动画制作,更不用说骨骼绑定了,学习过程中也在网上找了很多资料,甚至跟着教学视频一步步地照着操作,然而一系列意料之外的问题一次又一次地挫败了我的兴致和信心,尤其是绑定IK、FK骨时,我发现复杂的约束关系会让手的运动十分诡异,于是经历很多次的推倒重来。。。好在都坚持了下来,终于是对IK骨骼绑定有了些感觉,同时熟练了blender的基本操作。
从结果来看,我的7天实践中可能只有最后2天是有效的,然而这个无效过程正是笔者摸索的过程,有时是不可避免的。这一周中我最深刻的感悟如下:
学习新事物时,首先是了解它的基本原理和操作,在此基础上一定要找一些既有的实例去参考,思考其中的设计,并灵活地用在自己的项目中;这样之后才是拓展和创新。如果笔者能尽早参考一个绑好IK骨骼的手臂模型,可能就不至于浪费那么多时间了。
简单有时往往效果更好。笔者一开始是IK、FK骨一并采用,并且给很多骨骼都加了约束,以模拟真实情况,然而手臂的运动非常奇怪(就是1.3节介绍的问题)。当然主要原因是笔者当时不知道是什么原因导致的问题,因此折腾了半天。之后笔者把FK骨及很多不必要的约束去掉,才慢慢发现了问题所在。
做大动作前一定要备份一下,以供发生不可解决的问题时可以回溯。
必要时可以去外网的社区寻找答案(比如Blender Stack Exchange),往往能满足你的需求(国内对blender的讨论比较少,难以找到解决方案)。
修正一些不正常的顶点组和权值,至少现在发现蝴蝶结是分离的;
制作换弹、射击、走(跑)动等动画;
导入Unity3D,设计角色控制器。
官方可莉模型资源
Leather Gloves FPS手臂blender资源
Modern Weapons Pack
Blender add-ons - Simple Renaming Panel
【游戏开发实战】下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)
Blender fbx从ascii格式导入 | 经验摘录
How to rig fps arms and gun in blender 2.8 - YouTube
How to make FPS Animations in Blender 2.8+ - YouTube
Blender绑定模块:为骨骼设置自定义物体(Custom Object)
Blender官方文档-Bone Groups
Blender官方文档-骨骼命名规则
以上是我的实践总结,如有不对的地方,欢迎各位大佬批评指正,如果有更好的解决方案,也在评论区中分享~