【Unity3D】 Blender2.9+二足角色FPS(TPS)手臂的IK骨骼绑定经验总结

希望西安疫情尽快过去,西安加油!


再过几天就全面进入考试周了,估计大半个月都不会碰blender了,所以是时候把这一周的实践所学好好总结一下,以供以后的自己和大家参考。

笔者用的blender版本是2.93.6,做IK骨骼绑定的目的是制作角色手持武器的动画,包括射击、换装弹匣等,作为Unity3D TPS Multiplayer游戏项目的骨骼动画素材,最终目标是实现人物重定向动画和武器切换功能(尽管现在还不是很清楚该怎么做)。因此也可以把本篇视为笔者TPS网络游戏开发日志中的一部分,之后笔者会陆续分享其余工作流的实践记录。

本次实践选用官方公开的原神可莉作为角色模型,它是面向MMD的,因此导入blender时需要通过CATS插件对模型作适当转换,具体操作见此链接的pmx转fbx小节;武器模型是在Unity3D的Asset Store中免费下载的,即Modern Weapons Pack;另外,武器的fbx文件导入时可能有编码问题,解决方法参考此链接

1. IK骨骼绑定

IK骨骼绑定时最好找一个比较好的项目作为参考,观察人家怎么做的,并结合具体情况进行变通。

笔者由于要给Humanoid角色制作射击动画,于是参考FPS手臂的骨骼绑定 —— Leather Gloves,对自己之前绑定的IK手臂进行了修改。

下面将实践过程中学到的东西分享给大家,其中的很多问题已经有了很不错的解答,笔者也在相应地方以链接形式给出,就不赘述了。

1.1 如何给骨骼设置Custom Object

给骨骼设置Custom Object主要是为了方便操纵手的IK骨,实现流程见Blender绑定模块:为骨骼设置自定义物体(Custom Object)

设置Custom Object前、后的骨骼如下图所示:

(a) 使用Custom Object前的骨骼显示
(b) 使用Custom Object前的骨骼显示

1.2 如何将左手的Vertex Group镜像给右手(在不改变mesh的情况下)

由于顶点选择通常比较麻烦耗时,所以考虑能否把左(右)手的顶点组镜像给右(左)手。

关于这个我找了很久,首先是在Vertex Group面板那里做文章,但它的Mirror Vertex Group似乎不能正常工作,具体的错误有人也同样遇到过(见链接)),似乎没有好的解决办法。

然而,在不断的摸索中,我找到了解决方案,该方法正常工作的前提是确保源对象和镜像对象的Mesh是完全镜像的,具体操作如下:

  1. 选中角色的Mesh,进入EditMode,选择Properties面板下的绿色三角形(Object Data Properties),展开Vertex Groups,并找到要镜像的顶点组,点击Select选择对应的网格,如下图示:
    在这里插入图片描述

  2. 找到3D ViewPort面板的左上角(有的可能是左下角)的Select按钮,点选Select Mirror,即可发现镜像位置的顶点被选中了

    在这里插入图片描述

  3. 接着在Vertex Groups的中新增一个顶点组,重命名为镜像的名称(Left改为Right,L改为R等等),然后点击Assign即可把选择的顶点作为新顶点组。

    在这里插入图片描述

其余的部分都可以按照上面的步骤进行,不过说明的是此方法不会将权重镜像,1.3节的方法能镜像骨骼权重,不过代价是可能不会获得对称的顶点组,各有优劣,视具体情况来选择方式,但通常1.3节对于不爱刷权重的小伙伴是更棒的选择。

最后再提醒一下:Remove是作顶点集合的差,因此要清空顶点组,Remove前顶点组的网格应该是当前所选网格的子集;Assign是作顶点集合的并,而不是替换,所以Assign新顶点集之前要用Remove清空顶点组。

1.3 骨骼权重镜像的方法

1.2介绍了顶点组的镜像方法,但由此方法生成的权重是均一的,要实现权重的镜像,首先确保镜像源对象的权重是已经刷均匀(根据具体情况选择手动或自动分配权重)。

1.3.1 骨骼命名规范

对称骨骼的命名规范见官方文档

经笔者验证,要确保权重对称命令的正常执行,骨骼命名必须严格符合规范,以ForeTwist.001为例,合法的对称骨骼命名如下(部分):

  1. 后缀:ForeTwist.L.001 ↔ \leftrightarrow ForeTwist.R.001 o r or or ForeTwist.001.L ↔ \leftrightarrow ForeTwist.001.R
  2. 前缀:L_ForeTwist.001 ↔ \leftrightarrow R_ForeTwist.001
  3. 前/后缀:LEFT ForeTwist.001 ↔ \leftrightarrow RIGHT ForeTwist.001

注:left、right大小写敏感,可大写可小写,但对称骨骼必须保持大小写一致,三种合法情况分别为:全小写,全大写和首字母大写。

另外,笔者从github上找了个重命名插件——Simple Renaming Panel,安装该插件后,就可以根据骨骼名称的Pattern批量修改骨骼命名了。

以将_L后缀改为.L为例,使用流程如下:

  1. 按N打开边栏,切换至Rename选项卡,展开Simple Renaming Panel,Target栏选择Bone,即对骨骼操作,注意最好切换至Pose Mode,确保正常工作

  2. 取消Only Selected以对所有骨骼进行修改,勾选Use Regex开启正则匹配;

  3. Search栏键入_L,Replace栏键入.L,然后点击Search And Replace按钮即可重命名;

  4. _R → \rightarrow .R同理。

面板参数和操作结果如下图所示:

在这里插入图片描述

有时不同的模型的骨骼命名规范不一样,这时候把Search栏的搜索串改为对应Pattern即可,举个例子,如果要把前缀L_去掉,并在名称末尾加.L,可以首先搜索所有前缀为L_的骨骼,用插件的Add suffix功能在这些骨骼后面加上.L,最后再将L_替换为空串即可。

由于骨骼命名一般很短,不会有复杂的情况,因此简单的正则表达式即可满足需求。

1.3.2 骨骼权重镜像流程

操作前请确保完成了1.3.1节的骨骼命名规范化,这里以将骨骼Right arm的权重镜像至Left arm为例。

  1. 将Left arm的顶点组修改好,尽量不要和Right arm的顶点组有交集,且不要越过X=0,对称骨骼的顶点组和权重如图所示:

    在这里插入图片描述

  2. 打开3D Viewport编辑板块,进入Weight Mode,找到右上角(或右下角)的镜像栏(如下图),点亮X(非常重要),这样才能保证对称和同步;

    在这里插入图片描述

  3. 现在将Right arm的顶点组和权重复制到Left arm上,首先切换至绿色倒三角选项卡 → \rightarrow Vertex Groups → \rightarrow 点选Left shoulder,然后点击右边的下箭头按钮,在弹出的菜单中点选Copy Vertex Group,如下图所示:

  1. 接着点亮左上角的Vertex Selection,依次Select Left arm和Right arm的顶点组(选择顺序很重要,总之确保当前选择的是待镜像的权重),如下图所示:
    在这里插入图片描述

  2. 点击Vertex Groups右边的下箭头,在弹出的菜单栏中点选Mirror Vertex Group,即可发现权重翻转了,但顶点组也发生了变化,如下图所示:
    在这里插入图片描述

  3. 之后删除顶点组Right arm,将Right arm_copy重命名为Right arm即可。

注:

  • 操作的顶点组不要上锁;

  • 对于不太对称的顶点组,骨骼的权重镜像时也不是完全对称,而且可能会修改顶点组,但一般来说影响不大,只要保证异常顶点的权重为0即可;

  • 效果不太好时,选择1.2节的方法,保证顶点组完全对称,然后手动刷权重。

1.4 关于自动权重(Auto Weights)的注意事项

  1. 自动权重操作前最好保存一个副本,以供出现不可逆错误时可以回溯;

  2. 自动权重的顺序:先选择Mesh,然后是其骨骼;

  3. 自动权重时界面左下角会弹出Make Parent选项卡,注意不要勾选X Mirror,否则会将锁定的顶点组的网格和权重改变;
    在这里插入图片描述

1.5 使用Bone Groups更高效地管理骨骼

本次实践的对象是手臂骨骼,可以把手臂骨骼按左右手分为Left Hand和Right Hand两部分,方法和Vertex Group几乎一致,只不过Vertex Group是在网格对象(Mesh)的Edit Mode中进行Assign、Remove、Add、Delete等操作,而Bone Groups是在PoseMode中进行这些操作。

它可以帮助我们迅速选择对应的骨骼,并进行一些操作,还可以给不同骨骼组上不同的色,增加区分度。

Bone Groups详情见官方文档

1.6 如何用Armature Layers(骨架层)将骨骼在视图中分开

本次实践中,骨架层的作用在于将手臂相关的骨骼移动至另一个层中,这样可以避免操作手臂骨骼时对其余骨骼进行误操作,视图也会更干净,提高编辑效率。

笔者大致将骨骼划分至四个层中,分别为手臂骨骼层、武器骨骼层,前臂骨骼层(主要是一些不便于选中但又不太需要选择的骨骼,)和其余骨骼层(避免误操作,所以与手臂分开)。

注:给骨骼分层只是改变了视图的显示,并不会对骨骼的属性或父子关系产生影响。

有关骨架层的介绍,详见此链接

1.7 如何避免拖动武器时,双手紧握枪而不发生除位移之外的其他变化

一般来说会给手腕的骨骼添加一个Copy Rotation Constraints,以复制手IK骨的旋转,但注意这里要用World Space → \rightarrow World Space,因为我们不希望在移动武器主骨时,紧握的双手还会受到反向动力学的作用而发生旋转(在IK作用下,世界坐标系下的位移是可能影响局部坐标系下的旋转的)。

这里通过动图展示一下Local Space → \rightarrow Local Space 和 World Space → \rightarrow World Space的区别:

(a) Local Space to Local Space,此时手掌有旋转,运动不正常
(b) World Space to World Space,此时手掌只有位移,运动正常

2. 感想

笔者不懂美术,之前也从未接触过3D模型动画制作,更不用说骨骼绑定了,学习过程中也在网上找了很多资料,甚至跟着教学视频一步步地照着操作,然而一系列意料之外的问题一次又一次地挫败了我的兴致和信心,尤其是绑定IK、FK骨时,我发现复杂的约束关系会让手的运动十分诡异,于是经历很多次的推倒重来。。。好在都坚持了下来,终于是对IK骨骼绑定有了些感觉,同时熟练了blender的基本操作。

从结果来看,我的7天实践中可能只有最后2天是有效的,然而这个无效过程正是笔者摸索的过程,有时是不可避免的。这一周中我最深刻的感悟如下:

  • 学习新事物时,首先是了解它的基本原理和操作,在此基础上一定要找一些既有的实例去参考,思考其中的设计,并灵活地用在自己的项目中;这样之后才是拓展和创新。如果笔者能尽早参考一个绑好IK骨骼的手臂模型,可能就不至于浪费那么多时间了。

  • 简单有时往往效果更好。笔者一开始是IK、FK骨一并采用,并且给很多骨骼都加了约束,以模拟真实情况,然而手臂的运动非常奇怪(就是1.3节介绍的问题)。当然主要原因是笔者当时不知道是什么原因导致的问题,因此折腾了半天。之后笔者把FK骨及很多不必要的约束去掉,才慢慢发现了问题所在。

  • 做大动作前一定要备份一下,以供发生不可解决的问题时可以回溯。

  • 必要时可以去外网的社区寻找答案(比如Blender Stack Exchange),往往能满足你的需求(国内对blender的讨论比较少,难以找到解决方案)。

3. Next Step

  1. 修正一些不正常的顶点组和权值,至少现在发现蝴蝶结是分离的;

  2. 制作换弹、射击、走(跑)动等动画;

  3. 导入Unity3D,设计角色控制器。

资源 & 参考文献

  1. 【游戏开发实战】下载原神模型,PMX转FBX,导入到Unity中,卡通渲染,绑定人形动画(附Demo工程)

  2. Blender fbx从ascii格式导入 | 经验摘录

  3. How to rig fps arms and gun in blender 2.8 - YouTube

  4. How to make FPS Animations in Blender 2.8+ - YouTube

  5. Blender绑定模块:为骨骼设置自定义物体(Custom Object)

  6. Blender官方文档-Bone Groups

  7. Blender官方文档-骨骼命名规则

以上是我的实践总结,如有不对的地方,欢迎各位大佬批评指正,如果有更好的解决方案,也在评论区中分享~

猜你喜欢

转载自blog.csdn.net/weixin_42430021/article/details/122303398
今日推荐