<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ALA's HOME &#187; 绑定</title>
	<atom:link href="http://vlookr.com/tag/rigging/feed" rel="self" type="application/rss+xml" />
	<link>http://vlookr.com</link>
	<description>Ain't No High Mountain</description>
	<lastBuildDate>Sun, 09 May 2010 09:08:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>六种方法将物体吸附在模型上</title>
		<link>http://vlookr.com/2010/05/6-ways-to-attach-objects-on-mesh.html</link>
		<comments>http://vlookr.com/2010/05/6-ways-to-attach-objects-on-mesh.html#comments</comments>
		<pubDate>Sun, 09 May 2010 09:06:26 +0000</pubDate>
		<dc:creator>XRacZ</dc:creator>
				<category><![CDATA[绑定]]></category>
		<category><![CDATA[djRivet]]></category>
		<category><![CDATA[hyperRealMeshParent]]></category>
		<category><![CDATA[Maya]]></category>
		<category><![CDATA[rivet]]></category>
		<category><![CDATA[rivet EX]]></category>
		<category><![CDATA[setup]]></category>
		<category><![CDATA[Surface Attach]]></category>
		<category><![CDATA[粒子发射器]]></category>

		<guid isPermaLink="false">http://vlookr.com/?p=438</guid>
		<description><![CDATA[好久没写教程分享经验了，因为出来工作后一直没有电脑（都腐败到摄影器材去了，==！），也很忙就一直没时间整理。今天和大家分享下这段时间积累的一些关于将物体吸附在模型表面上的方法。以下多数方法我都在实际项目中测试和使用过。
1、rivet
rivet脚本可以说是实现面吸附的最经典做法，并且在此基础上发展出了其它更成熟的插件。主要由curveFromMeshEdge、loft、pointOnSurfaceInfo几个节点来实现。
用法：选polygon上任意两边，执行rivet，在两边之间会创建一个locator，用此locator去约束任意你想吸附的物体。
缺点：1、只能用在polygon上。
             2、经常出现模型变形时会翻转的情况，解决起来需要用到复杂的方法。
             3、模型smooth后会飞掉，因为smooth后模型上原有边的ID号变了，curveFromMeshEdge节点里记录的值就失效了。
2、rivet EX
rivet的增强版，可实现单边创建吸附，还可以在nurbs面上选Isoparm线、在nurbs线上选点来吸附。
用法：选模型一条或两条边，或者nurbs线上的点，执行rivet即可。创建出来的locator还有属性可调节位置，原理是通过改变UV值的方式。
缺点：除了可以用在polygon之外的物体上以外，其它缺点和rivet一样。
3、hyperRealMeshParent
来自当年Alias超写实绑定系列里的插件，含金量相当高，核心上还是rivet，它利用closestPointOnMesh节点（现已经改为nearestPointOnMesh）来计算被吸附物离模型的最近距离位置，实现同时对多个物体做吸附。此外还有算法来查找最佳对边来杜绝模型变形时发生翻转的情况。真不愧是大师写的插件。
用法：先在插件管理器里开启decomposeMatrix和nearestPointOnMesh两个插件，选择吸附物，往后选择的全部是被吸附物，执行hyperRealMeshParent；
缺点：1、依然不能smooth模型。
             2、会在模型上产生太多节点，影响性能。
P.S：提供我修改过的hyperRealMeshParent下载，原先版本仅适用与Maya 7或更早版本，hyperRealMeshParent.zip
4、djRivet
应该说是hyperRealMeshParent的改良版，但核心技术上用的是hair里的毛囊节点，此法彻底解决了模型smooth后飞掉和变形翻转的问题，此外还可同时对多个物体做吸附。
用法：选择一个或多个被吸附物体，最后选吸附体，执行djRivet即可。操作和hyperRealMeshParent相反。
缺点：毛囊法和UV有关，UV变了毛囊也发生位移了，在模型未分好UV前别用！
5、粒子发射器
此法跟毛囊法类似，就是选面在面上创建粒子发射器，发生率打零即可。此法缺点也是相当明显的，首先还是smooth的问题，然后就是创建出的发射器不会随着面的形变有角度上的改变，若用发射器对被吸附体做父子约束，模型发生形变时对被吸附的影响仅是位移上的，旋转始终为零。当然可以在模型中心或什么地方放一个locator对发射器做目标约束修正这个问题，但显然太麻烦了，我从来没有在项目中使用此法。
6、Surface Attach
来自肌肉系统里的Surface Attach可以说是最成熟的技术，算是提取了hyperRealMeshParent和rivet EX的精华改良而来，针对模型smooth和变形翻转它都提供了解决方案，被整合进Maya当之无愧！这是我目前在项目中稳定使用的技术，还利用它写了一个批量将骨骼钉在选定模型面上的插件。
用法：选择polygon的两边或面，或者选择nurbs进入surface point模式，在面上选一个位置，执行Muscle &#8211;&#62; Bonus Rigging &#8211;&#62; Surface Attach。创建出来的cMuscleSurfAttach吸附物有一个Fix Poly Flip属性，默认为off，若在模型变形时出现翻转的情况，打为on即可。模型smooth后飞掉，选择所有cMuscleSurfAttach物体，执行Bonus Rigging菜单里的Fix Surface Attach to allow for Poly Smooth即可还原正确位置。
以上是我目前所知道的所有方法，此外我还看到一些商业插件可实现吸附（没搞到手），但原理上应该离不开以上这些，尤其是经典的rivet。
]]></description>
		<wfw:commentRss>http://vlookr.com/2010/05/6-ways-to-attach-objects-on-mesh.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>整合自定义右键菜单实现FK/IK无缝切换</title>
		<link>http://vlookr.com/2009/03/maya-dagmenuproc-script-controls-right-mouse-button-for-fkik-seamless-switch.html</link>
		<comments>http://vlookr.com/2009/03/maya-dagmenuproc-script-controls-right-mouse-button-for-fkik-seamless-switch.html#comments</comments>
		<pubDate>Mon, 09 Mar 2009 12:44:07 +0000</pubDate>
		<dc:creator>XRacZ</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[绑定]]></category>
		<category><![CDATA[dagMenuProc]]></category>
		<category><![CDATA[FK/IK Seamless]]></category>
		<category><![CDATA[Maya]]></category>
		<category><![CDATA[Mel编程]]></category>
		<category><![CDATA[Rigging Demo]]></category>
		<category><![CDATA[Victor Vinyals]]></category>
		<category><![CDATA[右键菜单]]></category>
		<category><![CDATA[无缝切换]]></category>

		<guid isPermaLink="false">http://vlookr.com/?p=241</guid>
		<description><![CDATA[原创文章，转载请注明出处！！！
今天又拿Victor Vinyals的Rigging Demo 说事了，没办法，实在太经典了，有很多东西值得去挖，比如本文要介绍的自定义右键菜单实现FK/IK无缝切换，如果您还不知道如何实现无缝切换，请先学习《单骨骼FK/IK无缝切换技术》，至于整合Mel进.ma（.mb）文件，请参见《将Mel整合进.ma（.mb）文件》。此外，虽然无法下到Victor的源文件，但有个叫Nimo的免费Rigging也为我们的研究提供了很好的参考，本文将借鉴里面的代码来说说实现的方法。

如何改造右键菜单？
Maya自带的dagMenuProc.mel（在Autodesk\Maya&#60;版本号&#62;\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==&#8221;L_wrist_JNT&#8221; &#124;&#124; $shortName==&#8221;L_elbow_JNT&#8221; &#124;&#124; $shortName==&#8221;L_shoulder_JNT&#8221;)
{
menuItem   -label &#8220;FK&#124;IK Switch&#8221;    -command &#8220;IkFk_switch( \&#8221;\&#8221;, \&#8221;L_\&#8221;, \&#8221;arm\&#8221; );&#8221;    -enable 1   -radialPosition &#8220;N&#8221;    -enableCommandRepeat 1;
}
}
这就是我们要定义的自定义右键菜单函数，其实很容易理解，if语句用来判断了当鼠标指在哪个物体上时，创建什么样的菜单，这里我定义了在L_wrist_JNT、L_elbow_JNT、L_shoulder_JNT这几个骨骼上弹出指定的菜单，“&#124;&#124;”符号表示或者。
menuItem命令是用来创建菜单的，-label标签用来记录菜单名；-command标签用来记录要执行的Mel命令，记住，命令里标点符号前要加&#8220;\&#8221;；-radialPosition用来记录菜单的方位：
N——北、S——南、W——西、E——东、SW——西南、SE——东南、NW——西北、NE——东北
其它标签不做详细介绍，懂得照着用就行。
4、现在我们要改动下dagMenuProc.mel文件，记得复制一份出来修改，而不是修改默认目录里的那个。找到dagMenuProc(string $parent, string $object)这个函数，在string $shortName = `substitute &#8220;.*&#124;&#8221; $object &#8220;&#8221;`;一句下面加入这段:
if($shortName==&#8221;L_wrist_JNT&#8221; &#124;&#124; $shortName==&#8221;L_elbow_JNT&#8221; &#124;&#124; $shortName==&#8221;L_shoulder_JNT&#8221;)
{
customMenu $shortName;
}
该判断将调用customMenu函数在指定的位置生成自定义菜单，此时还得把后面一大段（即代码最后“} else {……}”前）用else {……}括起来，即在其他位置依然弹出Maya默认菜单。把修改后的dagMenuProc代码，全部添加进表达式编辑器，创建一个叫dagMenuProc_Node的节点来保存即可（方法还是同上）。可以下载我修改的文件来参考下：dagmenuproc_mod.mel
5、最后这步相当重要，再新建一个脚本节点executeOnFileLoad，里面填入一句scriptNode [...]]]></description>
		<wfw:commentRss>http://vlookr.com/2009/03/maya-dagmenuproc-script-controls-right-mouse-button-for-fkik-seamless-switch.html/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>将Mel整合进.ma(.mb)文件</title>
		<link>http://vlookr.com/2009/03/maya-mel-and-ma-file-integrate-tutorial.html</link>
		<comments>http://vlookr.com/2009/03/maya-mel-and-ma-file-integrate-tutorial.html#comments</comments>
		<pubDate>Sat, 07 Mar 2009 08:39:16 +0000</pubDate>
		<dc:creator>XRacZ</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[绑定]]></category>
		<category><![CDATA[.ma]]></category>
		<category><![CDATA[createNode script]]></category>
		<category><![CDATA[Maya API]]></category>
		<category><![CDATA[Mel编程]]></category>
		<category><![CDATA[nimo]]></category>
		<category><![CDATA[Script Node]]></category>
		<category><![CDATA[整合]]></category>

		<guid isPermaLink="false">http://vlookr.com/?p=226</guid>
		<description><![CDATA[原创文章，转载请注明出处!!!
其实非常简单，但是发现这方面的资料就是少得可怜啊，是不是高手们都不屑于写这样的教程啊，这不利于大家的共同进步啊！近日我因困扰于这个问题，狂扒nimo rigging里的代码，还在论坛上发贴求助，虽然没有得到什么完整的答案，但是几个朋友的提示还是给了我莫大的启发。迫不及待写这份教程来和大家分享。
两种方法，大家按喜好取舍。
先分析下吧，比如我们要将这段代码（灰色斜体字为自己定义的函数和变量名）整合进.ma文件：
global proc string mel_integrate_test1()
{
if (`window -exists showUI`) delete showUI;
window showUI;
rowColumnLayout -numberOfColumns 1 -columnWidth 1 60;
text -label &#8220;Hello!World!&#8221;;
showWindow showUI;
return 1;
};
我们只要创建一个脚本节点（Script Node）来存储这段代码即可，看步骤，方法一：
1、打开Maya，新建场景（废话），什么都不用往里面加，我们只是做测试，给大家介绍方法。
2、在命令栏或者脚本编辑器运行   createNode script -n &#8220;mel_integrate_test1&#8220;;   命令，创建一个叫mel_integrate_test1的脚本节点。
3、打开大纲（Outliner）窗口，在Display里面取消DAG Objects Only的选项，会看到一堆隐藏节点，其中就有我们刚创建的mel_integrate_test1节点，选中。
4、进入表达式编辑器（Expression Editor），注意，一定要选中mel_integrate_test1节点，然后把上面那段代码粘贴进表达式（Expression）输入框，单击创建，如果代码没错，创建会成功的。在命令栏或者脚本编辑器执行mel_integrate_test1，看看是不是有个窗口弹出来了，哈哈，大功告成！
方法二，更简单：
1、同上
2、进入表达式编辑器（Expression Editor），在Select Filter菜单里选中By Script Node Name，在Script Node Name处填入mel_integrate_test1，把文中示例代码填入脚本（Script）框，点击创建，创建完毕后把Execute On（执行条件）改为Open/Close，再点击编辑即可。完成！
两种方法有什么区别？其实原理上是一致的，都是需要一个脚本节点来存储代码，只是第一种还需要借助表达式节点来帮助存储，而第二种直接存储在脚本节点中。个人推荐第二种，简单而且标准。
P.S：文中示例文件下载：mel_integrate_test1.ma
]]></description>
		<wfw:commentRss>http://vlookr.com/2009/03/maya-mel-and-ma-file-integrate-tutorial.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
