Maya骨骼绑定IKFK无缝切换-双向约束法
更新时间:2023-12-02 23:16:01 阅读量: 教育文库 文档下载
- maya人物骨骼绑定推荐度:
- 相关推荐
活了这么多年,在学东西的时候搜过无数教程,什么使用教程,破解教程等
等等等,从没自己写过教程,但是今天忍不住也要写一篇了,给广大网友分享下我的Maya学习经验。因为接触时间不长,难免有理解错误或疏漏的地方,还请不要拍砖。
首先,为什么要进行IK和FK的无缝切换?ikHandle1里不是有ikBlend参数么,直接把参数值从1改成0,不就可以实现IK切换到FK了么?嗯嗯,开始我也是这么想的,老师讲IK和FK绑定的时候还觉得好简单,不过等你实际做动画的时候,问题就出现了。你使用IK绑定费老大劲完成了一个动作,结果切换到FK绑定的时候,天哪,骨骼又跑到初始位置去了,于是各种定位各种对齐,然而这不是一件容易的事,因为你不仅要对齐骨骼的位移还有旋转呐!疯了都!
也有网友会说,Maya2013中的HumanIK功能非常强大,干嘛还要自己绑定,不过HumanIK主要是面向两足角色对于四足或多足角色就不适用了。当然也有很多绑定插件可以快速完成。
但是如果自己可以手动绑定,那理解其他插件中的绑定技巧也是很有帮助的。
好,废话说了一堆,现在开始讲如何无缝切换IK到FK,或者FK到IK,即切换的时候,要保证骨骼的位移和旋转参数都保持当前不变,也就是无缝(前提是你已经了解了什么是IK,什么是FK,我这就不细说了。)
目前处理无缝切换的方法有三种:
方法一:通过maya自带的set ikfk key这个命令来转换。(太麻烦!) 方法二:三套骨架,一套是ik控制,一套是fk控制,一套用于蒙皮,然后通过属性控制决定约束到ik骨架还是fk骨架。(同样麻烦,而且工作量巨大,不过我也试过,最终可以做出来,提供教程的朋友给了思路也给了代码,但是需要你彻底了解物体的世界坐标系和对象坐标系,否则无论如何你获取的骨骼在世界坐标系中的位移和旋转参数,都无法正确的赋给FK控制器。我试了一天才明白过来,累死!)
方法三:使用单骨骼进行IKFK的切换。(没试过,因为目前还不了解角色功能到底是干嘛使用的。有兴趣的朋友可以点击这里查看http://blog.sina.com.cn/s/blog_54b08bdb010007x4.html。)
方法四:已有双向约束。需要和动画曲线相结合。http://blog.sina.com.cn/s/blog_71fcab930100qpqw.html
下面是我的IKFK无缝切换思路,简单来说是使用双向约束来定位控制器和骨骼,这样在切换的时候可以保证控制器和骨骼的位移以及旋转始终保持一致。
以手臂骨骼IKFK绑定来说:
1、当FK控制手臂骨骼系统时,即FK方向约束手臂骨骼时,让IK的极向量控制器受定位器的点约束,把定位器P给手臂的肘关节,并让IK控制器受FK手腕控制器的点约束,这样当FK控制器方向发生变化时,可以始终保持IK控制器和IK极向量控制器的位移信息和骨骼一致。
2、当IK控制手臂骨骼系统时,让手臂骨骼控制FK控制器,这样就可以保证FK控制器的方向始终和骨骼保持一致。同时解除FK手腕控制器对IK控制器的点约束,以及定位器对IK极向量控制器的约束。
怎么样是不是很简单?只需要一套骨骼就可以了!
这里所说的双向约束,其实就是指FK约束骨骼的方向,同时让骨骼也约束FK的方向。并且设定,当FK约束骨骼时,骨骼对FK的约束权重为0,即骨骼对FK的约束不起作用;当骨骼约束FK时,FK对骨骼的约束权重为0,即FK对骨骼的约束不起作用。这样就不会产生冲突了!
现在有一个问题,当FK切换到IK时,骨骼受FK约束所产生的方向变化会重置为初始方向,这样就又回到了我一开始说到的问题,没有做到无缝切换!
那有没有解决办法呢?其实很简单,在动画模块,约束菜单下,有一个“设置静止位置”的功能。(我的Maya版本是2013,其他版本有没有这个功能不是很清楚。)这个功能的作用就是为了防止约束权重变为0时,骨骼又回到初始状态。
这样一来,我们就可以利用此功能,当FK切换到IK时,把骨骼当前的旋转信息定位下来,然后再取消FK对骨骼的方向约束,同时让骨骼对FK的方向约束开始起作用,同样使用该功能,可以把IK控制器和IK极向量控制器的当前位移信息定位下来,然后让IK控制器开始起作用。
IK切换到FK的解决办法也一样,定位所有FK控制器的当前旋转方向,并让IK控制器不起左右,FK控制器起作用就OK了。 看起来很容易实现对不对?可是我却琢磨了半天。
下面我们就开始具体实现吧,因为该教程主要面向初学者,所以我会将的比较细碎,大牛们如果会看得话就忍忍吧,呵呵~ 步骤一:
创建手臂的四个骨骼,同时分别绑定FK控制器和IK控制器。需要注意的地方是: 1、手臂骨骼的枢轴方向要保持一致,否则会有错误。
2、FK控制器和IK控制器一定要打组,然后冻结控制器的位移和旋转属性,切记,不能冻结组的属性!否则世界坐标系会变成对象坐标系,后续问题会很多。 3、先让各骨骼对各控制器的组进行父子约束,目的是为了使控制器的位移和方向与各骨骼保持一致,然后再删除父子约束节点。
4、如果约束后的控制器不容易操作,可以在组件模式下,修改各控制器的旋转轴,千万不要修改了枢轴方向!! 以肩膀控制器FK1的定位为例:
创建曲线圆环控制器,修改控制器名称为FK1,进行打组,组名为FK1_G。 选择骨骼joint1,再选择FK1_G,进行父子约束,FK1控制器就定位到joint1的位置,删除FK1控制器下的约束节点。目前FK1的方向和骨骼水平,不好选择,在组件模式下,选择FK1的所有控制点进行旋转,千万不要选中枢轴。
如果旋转的角度不能确定,查看MEL编辑器中的历史,会看到刚才操作的MEL命令,复制下来,取消刚才的操作,然后在MEL编辑器的输入区黏贴刚才的
代码,把旋转的角度数改为整数,如-90,取消组件模式回到对象模式下。现在FK1控制器就完成了,删除历史,冻结变换。其他FK2、FK3控制器的定位一样不再赘述。 步骤二:
刚才已经完成了手臂正常的FK和IK绑定,现在需要进行骨骼对FK的约束。先让FK对骨骼的约束节点权重为0,即把每个骨骼下的约束节点值修改为0,以FK1下的为例,把joint1_orientConstraint1里的FK1W0的参数设置为0。其他骨骼也一样处理,这样的好处是,当你再让骨骼方向约束FK时,系统不会弹出警告。
完成以上操作后,如下图所示: FK绑定示意图:
IK绑定示意图:
IK控制器是把圆环的控制节点修改了下,变形为上图右侧所示(比较奇怪的一个形状,你可以自己做成其他的,这里只是示意) IK极向量控制器是一个定位器。你需要再做一个定位器使位移和它保持一致,并P给手肘的骨骼,同时让他点约束IK极向量控制器。 完成之后的大纲视图如下:
FK控制器的层级关系如上图右侧所示,可以看到各FK控制器已经受到了骨骼的约束。 由于每次修改FK的约束权重或骨骼的约束权重太麻烦,因此我们新创建个控制物体(FKCTR)
来进行总体的属性控制,这里我用了各立方体,你可以创建其他的物体或曲线都可以。如上图左侧高亮显示的物体。
我们要给这个控制物体添加一些其他的属性,比如:FKPOWER,用来总体控制各FK对骨骼的约束权重,设置它的最小值为0,最大值为1,默认值为1。
打开窗口菜单,选择常规编辑器下的连接编辑器,左侧载入FKCTR,右侧分别载入各骨骼下面的FK约束节点,joint1_orientConstraint1、joint2_orientConstraint1、joint3_orientConstraint1,把FKCTR属性中的FKPOWER与以上几个约束节点中的FK1W0、FK2W0、FK3W0相关联。这样就可以通过修改FKPOWER的值来直接修改FK1W0、FK2W0、FK3W0的值了。锁定并隐藏FKPOWER中除可视性和FKPOWER以外的所有属性。 另外我们可以给它在增加其他属性,如下图所示:
其中JOPOWER属性和FK各控制器下的FK1_orientConstraint1、FK2_orientConstraint1、FK3_orientConstraint1的joint1w0、joint2w0、joint3w0相关联; FKVISIB与FK1_G的可见性相关联;
IKVISIB分别与ikcon和polecon的可见性相关联;
POPOWER与polecon下的polecon_pointConstraint1下的polelocW0属性相关联;
IKPOWER与ikcon下的ikcon_pointConstraint1下的FK3W0属性相关联;
polecon和ikcon之前已被poleloc和FK3分别进行了点约束,还记得吧,所以才会产生以上的点约束节点。
之所以要给FKCTR增加这么多属性,是为了在做动画K帧的时候不用来回找各个散落的属性。
以上这些设置基本上OK了,绑定了IK和FK,你可以手动的调整参数试试切换,没有问题,但是如果每次都手动去修改参数会很麻烦,因此我们还是需要做个MEL。不用怕新手们,很简单。
你已经注意到FKCTR里还有个属性SWITCH对不对,SWITCH的值就是为了控制切换的。
当值为0时,默认为FK控制,IK控制器不可见。 当值为1时,IK控制,FK控制器不可见。就这么简单。
代码如下:
$ikfkswitch = getAttr(\if($ikfkswitch == 1) //change fk to ik {
$joint1_ro = getAttr(\
setAttr joint1_orientConstraint1.restRotate $joint1_ro[0] $joint1_ro[1] $joint1_ro[2]; //以上获取骨骼1的旋转信息并定位 $joint2_ro = getAttr(\
setAttr joint2_orientConstraint1.restRotate $joint2_ro[0] $joint2_ro[1] $joint2_ro[2]; //以上获取骨骼2的旋转信息并定位 $joint3_ro = getAttr(\
setAttr joint3_orientConstraint1.restRotate $joint3_ro[0] $joint3_ro[1] $joint3_ro[2]; //以上获取骨骼3的旋转信息并定位 $ikcon_t = getAttr(\
setAttr ikcon_pointConstraint1.restTranslate $ikcon_t[0] $ikcon_t[1] $ikcon_t[2]; //以上获取IK控制器的位移信息并定位 $polecon_t = getAttr(\
setAttr polecon_pointConstraint1.restTranslate $polecon_t[0] $polecon_t[1] $polecon_t[2]; //以上获取IK极向量控制器的位移信息并定位
setAttr FKCTR.IKPOWER 0; //FK3对IK控制器的点约束取消
setAttr FKCTR.POPOWER 0; //定位器对IK极向量控制器的点约束取消 setAttr FKCTR.FKPOWER 0; //FK控制器对骨骼的约束取消 setAttr FKCTR.JOPOWER 1; //骨骼反过来开始对FK进行约束 setAttr FKCTR.IKBLEND 1; //IK控制器开始起作用 setAttr FKCTR.FKVISIB 0; //FK控制器设为不可见 setAttr FKCTR.IKVISIB 1; //IK控制器设为可见 }
else if($ikfkswitch == 0) //change ik to fk {
$fk1_ro = getAttr(\
setAttr FK1_orientConstraint1.restRotate $fk1_ro[0] $fk1_ro[1] $fk1_ro[2]; //以上获取FK1控制器的位移信息并定位 $fk2_ro = getAttr(\
setAttr FK2_orientConstraint1.restRotate $fk2_ro[0] $fk2_ro[1] $fk2_ro[2]; //以上获取FK2控制器的位移信息并定位 $fk3_ro = getAttr(\
setAttr FK3_orientConstraint1.restRotate $fk3_ro[0] $fk3_ro[1] $fk3_ro[2]; //以上获取FK3控制器的位移信息并定位
setAttr FKCTR.JOPOWER 0; //骨骼对FK的约束取消 setAttr FKCTR.FKPOWER 1; //FK开始反过来约束骨骼 setAttr FKCTR.IKBLEND 0; //IK控制器不再起作用
setAttr FKCTR.IKPOWER 1; //FK3控制器开始点约束IK控制器 setAttr FKCTR.POPOWER 1; //定位器开始约束IK极向量控制器 setAttr FKCTR.FKVISIB 1; //FK控制器的可见性打开 setAttr FKCTR.IKVISIB 0; //IK控制器的可见性关闭 };
OK,以上就是全部教程了,感兴趣的朋友可以在此基础上再优化下,比如可以做成表达式什么的。这里需要修改FKCTR里的SWITCH属性并执行以上MEL代码。 K帧动画完全没有问题。
比如在SWITCH属性为0的情况下,我们进行FK手臂动作调整。在第一帧选择所有FK控制器加选FKCTR里的所有属性进行关键帧设置,在第10帧修改FK控制器的参数,设置关键帧,不要忘了FKCTR里的所有属性在这一帧也要设置关键帧哦,然后从第11帧开始,修改FKCTR里的SWITCH属性为1,执行MEL命令,切换到了IK控制,在第11帧选择IK控制器的相关属性和FKCTR里的所有属性进行关键帧设置。然后在第20帧修改IK控制器的相关属性并K帧,依然不要忘了FKCTR里的所有属性进行关键帧设置哦。 这样我们就完成了前10帧FK控制骨骼动画,从第11帧到20帧开始IK控制骨骼动画,完全无缝。
欢迎有问题的朋友点击以下我的微博地址来进行交流探讨。谢谢! http://weibo.com/1567885501/profile?topnav=1&wvr=5 如有转载也请注明出处,呵呵,毕竟是我的第一篇分享教程^0^~
正在阅读:
奇妙的发现作文800字06-16
那天我很快乐作文800字06-19
小学三年纪日记10-29
根据张宇高数视频总结的考研数学知识点06-08
2015-2020年中国绝缘电线、电缆市场研究报告07-25
开题报告-施工组织设计(吴赟)07-06
五经是什么02-19
护士岗位职责【通用7篇】04-02
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 骨骼
- 绑定
- 无缝
- 双向
- 约束
- 切换
- Maya
- IKFK
- 数据结构经典习题--每章都有
- 县2017年上半年蔬菜工作总结
- 浅析大学生消费行为及消费心理
- 东财《货币银行学》练习题
- 对药品不良反应监测工作的调研-精选模板
- 安全文明施工实施细则(新版) - 图文
- 汽修制图
- 高一化学必修1物质的量相关计算
- 推荐下载 工商局二五年整顿和规范市场经济秩序工作总结-最新
- 心得体会-青年教师拓展训练心得体会(两篇) 精品
- 第二章习题
- 《建筑力学》第5章计算题
- 关于消防系统设计的总结
- 2019年最新5月学习部个人工作小结工作总结文档
- 部编版《只有一个地球》教案6
- 2013新版七年级上册语法知识复习资料
- 体育教学中自主学习的研究
- 区教育部工作计划精编
- 河南省三门峡市陕州中学2019年高二上学期入学生物试卷 Word版含解析
- 数字化视野下的小学教辅图书出版