显示标签为“MEL”的博文。显示所有博文
显示标签为“MEL”的博文。显示所有博文

2008年12月14日星期日

定制右键标记菜单

在dagMenuProc.mel的dagMenuProc过程定义了各种不同物体的右键标记菜单。
比如,在
if (($object == "CubeCompass"))
{
createViewCubeMenuItems($parent);
return;
}
的下面加入:
if(`attributeExists "extNode" $object`){
print ($object+" RMB menu proc calls!\n");
return;

}

重新加载dagMenuProc.mel,新建一个物体,增加一个属性:extNode,类别任意。
再这个物体上使用右键菜单时,就会输出OBJECT NAME RMB menu proc calls!
如果在$parent上加入菜单,就可以显示菜单了。

技术细节:
dagMenuProc并没有出现在文档中,更详细的信息也没法得到,从网上搜索到的信息表明rmb标记菜单是附加在dag属性上的。
Maya's dagMenuProc script controls Right-Mouse-Button clicking on objects in the model viewports.

2007年5月27日星期日

stretchy bone

也就是可以伸长和的骨骼系统,也叫toony rig。

j1-j2-j3
locator1点约束到j1,ik点约束到locator2
创建如下表达式:

vector $l1p,$l3p;
$l1p=<>;
$l3p=<>;
float $diff=(mag($l1p-$l3p)-18)/2;
if($diff>0.001){
joint2.translateX=10+$diff;
joint3.translateX=8+$diff;
}
else{
joint2.translateX=10;
joint3.translateX=8;
}

其中有几个常量,10是j2的tx,8是j3的tx,也就是每段骨骼的长度。

尝试用rotatepivot,结果发现得到的坐标是0,最后只能让locator保持没有父物体的状态用translate。

2007年5月26日星期六

MEL笔记 2007-05-26

joint/ik旋转轴向+/- 180度的限制

如果使用ik handle来控制joint的旋转,会有一个+/-180度限制的问题。一般来说,这不是什么问题,如果通过表达式用这个旋转的角度来控制其他的物体的时候,很可能就会在某个转角出现“跳动(flip)”。
比如j1-j2是一个joint层级,j1是父,用ikhandle(sc/pr均可)来控制j1的转向。有如下表达式:
locator1.rx=j1.rx/4;

拖动ikhandle,j1的旋转不会出现跳动,但是locator1在j1旋转过某些位置(j1.rx超过180或者小于-180)的时候,就会发生跳动。

如何绕过这个问题呢?

j1-j2同上,locator1是j1-j2要指向的位置,locator2-locator3是旋转的驱动。
将j1 aim约束到locator1上,只约束y和z,在j1.rx创建如下表达式,
j1.rx=locator2.rx+locator3.rx;
这样基本上就可以了。


05年的maya master classes,starwar3的note里,介绍了一个prop工具,可以非常方便的制作手持物体的动画,可惜在没有更多的说明,除了一段屏幕录像和pdf中的2页简述,几乎不涉及任何实现。根据一些猜测和试验,现在差不多已经清楚如何实现,这个joint的问题就是在prop之后,控制手的旋转时遇到的问题之一。

2007年5月24日星期四

MEL笔记 2007-05-24

joint & locator
joint的属性:
创建joint的时候,会有这么一句命令: joint -e -zso -oj xyz -sao yup joint13;
作用是将orient按照xyz的优先指向第一个子节点,会改变orientation的值,这句命令有一个条件,就是joint13的Rotate必须为0。channelbox中显示为0并不一定是0,可能是个很小的数。

orient也可以用直接用命令joint -e -orientation来修改,在设置新的值之后,joint会旋转,但是rotate的值却不会改变。

给locator添加joint子物体的时候,如果locator的scale不为1,那么joint的translate将保持原来的值。

2007年5月16日星期三

MEL笔记 3

maya master 2005中有starwar3的note中介绍了一个UNIQUE CHARACTER USER
INTERFACES,其中有个创建带分区位图界面的要求。我发现用formLayout可以满足这个要求。

拿mel的例子改一改,貌似位图要最后加载才能正常显示。


string $window = `window`;
string $form = `formLayout -numberOfDivisions 100`;
string $b1 = `button -label "b1"`;
string $b2 = `button -label "b2"`;
string $column = `columnLayout -adjustableColumn true`;
button; button; button;

setParent ..;
formLayout;
picture -image "MayaStartupImage.xpm";

formLayout -edit
-attachForm $b1 "top" 5
-attachForm $b1 "left" 5
-attachControl $b1 "bottom" 5 $b2
-attachPosition $b1 "right" 5 75

-attachNone $b2 "top"
-attachForm $b2 "left" 5
-attachForm $b2 "bottom" 5
-attachForm $b2 "right" 5

-attachForm $column "top" 5
-attachPosition $column "left" 0 75
-attachControl $column "bottom" 5 $b2
-attachForm $column "right" 5
$form;

showWindow $window;

2007年4月20日星期五

mel笔记 2

把一个locator约束到一个cv点上。
vector $cvpoint=`xform -query -worldSpace -translation curve1.cv[1]`;
locator1.translateX=$cvpoint.x;
locator1.translateY=$cvpoint.y;
locator1.translateZ=$cvpoint.z;
存在的问题:
只有在播放的时候表达式的值才会被更新。

2007年4月17日星期二

MEL笔记 1

source命令:
Maya的文档上说:“ It is important for advanced MEL users to understand that "source" is not a MEL command.”
在文档中举的几个例子似乎对此也有暗示。根据我的体会,source不接受变量做参数。比如source "mel_file.mel"是可以的,但是如果用这种形式:
string $mfile = "mel_file.mel";
source $mfile;
就会提示语法错误。使用eval似乎也不可以trick。

$gShelfTopLevel变量:
global string $gShelfTopLevel;
这个变量似乎是工具架的默认父级部件,createNewShelf等创建shelf的命令都会将新的shelf添加到这个变量所指的部件之下。

shelf文件:
SaveAllShelves之后,各个工具架上的button都会被保存到mel文件中,里面是一个函数,函数命即为工具架的名称。函数的内容就是一些shelfButton命令。
例如:
global proc Polys () {
global string $gBuffStr;
global string $gBuffStr0;
global string $gBuffStr1;


shelfButton
-enableCommandRepeat 1
-enable 1
-width 38
-height 38
-manage 1
-visible 1
-preventOverride 0
-align "center"
-label "Sphere"
-labelOffset 0
-font "tinyBoldLabelFont"
-image "polySphere.xpm"
-image1 "polySphere.xpm"
-style "iconOnly"
-marginWidth 1
-marginHeight 1
-command "polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1; objectMoveCommand;"
-sourceType "mel"
-actionIsSubstitute 0
;
}