整合自定义右键菜单实现FK/IK无缝切换
原创文章,转载请注明出处!!!
今天又拿Victor Vinyals的Rigging Demo 说事了,没办法,实在太经典了,有很多东西值得去挖,比如本文要介绍的自定义右键菜单实现FK/IK无缝切换,如果您还不知道如何实现无缝切换,请先学习《单骨骼FK/IK无缝切换技术》,至于整合Mel进.ma(.mb)文件,请参见《将Mel整合进.ma(.mb)文件》。此外,虽然无法下到Victor的源文件,但有个叫Nimo的免费Rigging也为我们的研究提供了很好的参考,本文将借鉴里面的代码来说说实现的方法。
如何改造右键菜单?
Maya自带的dagMenuProc.mel(在Autodesk\Maya<版本号>\scripts\others目录可找到)提供了一系列Maya右键菜单的实现方法,我们不必深究每行代码的意思,只需知道如何改造dagMenuProc(string $parent, string $object)这个函数里的内容即可,因为它才是关键!我们还需要另外定义一个函数来存储自定义右键菜单,再用dagMenuProc来调用它,这是一种较科学的方法,因为当我们需要为自己的右键菜单定义新功能或修改的时候,不必去翻dagMenuProc里的一大堆代码,我们尽可能保留它的原样,存储在一个脚本节点里,只需修改自定义右键菜单函数里的内容即可。
本文将借用Seith的源文件(已绑定好)来做范例,推荐下载来学习本教程:custom_right_click_button_for_fkik_seamless_switch_init.ma
步骤:
1、打开这个文件(custom_right_click_button_for_fkik_seamless_switch_init.ma)。进入表达式编辑器(Expression Editor),在Select Filter菜单里选中By Script Node Name。
2、在表达式编辑器的Script Node Name里填入FKIK_switch_Node,我们将创建这个脚本节点来存储FK/IK无缝切换的代码,将ikfk_switch_002.zip里的代码粘贴进脚本(Script)框,点击“创建”,并把执行条件(Execute On)改为Open/Close。
3、同上方法,创建一个叫customMenu_Node的脚本节点来存储以下代码:
global proc customMenu (string $shortName)
{
if($shortName==”L_wrist_JNT” || $shortName==”L_elbow_JNT” || $shortName==”L_shoulder_JNT”)
{
menuItem -label “FK|IK Switch” -command “IkFk_switch( \”\”, \”L_\”, \”arm\” );” -enable 1 -radialPosition “N” -enableCommandRepeat 1;
}
}这就是我们要定义的自定义右键菜单函数,其实很容易理解,if语句用来判断了当鼠标指在哪个物体上时,创建什么样的菜单,这里我定义了在L_wrist_JNT、L_elbow_JNT、L_shoulder_JNT这几个骨骼上弹出指定的菜单,“||”符号表示或者。
menuItem命令是用来创建菜单的,-label标签用来记录菜单名;-command标签用来记录要执行的Mel命令,记住,命令里标点符号前要加“\”;-radialPosition用来记录菜单的方位:
N——北、S——南、W——西、E——东、SW——西南、SE——东南、NW——西北、NE——东北
其它标签不做详细介绍,懂得照着用就行。
4、现在我们要改动下dagMenuProc.mel文件,记得复制一份出来修改,而不是修改默认目录里的那个。找到dagMenuProc(string $parent, string $object)这个函数,在string $shortName = `substitute “.*|” $object “”`;一句下面加入这段:
if($shortName==”L_wrist_JNT” || $shortName==”L_elbow_JNT” || $shortName==”L_shoulder_JNT”)
{
customMenu $shortName;
}该判断将调用customMenu函数在指定的位置生成自定义菜单,此时还得把后面一大段(即代码最后“} else {……}”前)用else {……}括起来,即在其他位置依然弹出Maya默认菜单。把修改后的dagMenuProc代码,全部添加进表达式编辑器,创建一个叫dagMenuProc_Node的节点来保存即可(方法还是同上)。可以下载我修改的文件来参考下:dagmenuproc_mod.mel
5、最后这步相当重要,再新建一个脚本节点executeOnFileLoad,里面填入一句scriptNode -eb dagMenuProc_Node;,执行条件(Execute On)依然为Open/Close,因为在后来的测试中发现需要打开两次这个文件才能使右键菜单正确出现,不知道是否所有人都遇到和我一样的问题,但这句命令确实会在打开文件时强制加载我们修改过的dagMenuProc,推荐大家使用!
大家可以下我做好的文件参考下:custom_right_click_button_for_fkik_seamless_switch_final.ma
本文涉及到不少编程上的知识,希望有兴趣研究的朋友先掌握C语言基础,这样更能帮助理解。




太高深了!看不懂
不错 加油~
又来看你了!加油哦!
值得学习啊!哈哈
过来学习了。
感谢XRacZ:)
看到回复了:)正在学习中:)
祝一切顺利!
我找不到你说的第4条的 else { 在哪括回 “}”这个写在哪 呵呵见笑了
对不起上面那帖发错了,,,你的教学不错,,对做中
您可以下载我的源文件看看,对比一下是如何写的,建议找个能对比文本的软件来看
很深奥啊,看不懂啊,能不能白话一点啊
来看望博主,一起学习
博主要更新了
一直想不通这段命令是什么意思 IkFk_switch( \”\”, \”L_\”, \”arm\” );
能解答一下吗~??
兄弟 挣扎吧
坚持每天写博文的习惯
嘿嘿·老大··你写的文章不错··有空我会常看看·你写的文章!支持下!
谢谢支持