2.6 MEL
Mel中的语句——vector和计算机科学中对向量的定义紧密相关:一个由标量组成的一维数组。因此对于向量的操作并没有太多的限制。
一个向量的基础是由x,y和z组成的,一个向量可以与另一个向量相加,相减,相乘,由此生成新的向量。这些操作都是以分量形式进行处理的。
因为向量只有3个坐标值,所以他可以用在笛卡尔坐标系中,而缺乏第四个坐标值,使之无法使用在齐次坐标系中。一个顶点用下面的方式表示:
vector $p ; //赋值为(0,0,0)
vector $p = 3; //赋值为(3,3,3)
vector $p = <<4.5,3.8,3.2>> //赋值为(4.5,3.8,3.2)
尽管vector数据类型对于向量的操作是很方便的,但是有很多maya的mel代码不使用vector数据类型,举个例子,下面的代码用于获取顶点的坐标:
getAttr transform1.translate;
它将返回一个由三个浮点类型变量组成的数组:
// Result : 0 0 0 //
从maya6.0开始,允许像下面一样直接将这个由三个浮点类型变量组成的数组赋予一个vector类型:
vector $t = ‘getAttr transform1.translate’;
在早期的maya版本里这将会报错,无论在那个版本里,都不能把直接把一个向量赋值给属性。
vector $t = <<1,2,3>>;
setAttr transform1.translate $t; //错误
一个向量必须作为一个分量才能给属性赋值:
setAttr transform1.translate($t.x) ($t.y) ($t.z);//ok
2.7 C++ API
C++用于处理顶点的类为MPoint。这个类用于处理拥有x,y,z,w四个坐标值的齐次坐标系。每个坐标之间都能相互转化。也有用于处理浮点的类,MFloatPoint。可以用下面的方法来定义一个坐标:
MPoint pt; //x=y=z=0,w=1
你也可以使用homogenize函数来转化笛卡尔坐标为齐次坐标:
MPoint pt;
pt.homogenize(); //pt = (w*x, w*y ,w*z, w)
这个函数会把每一个坐标值和w相乘。注意,如果w为0,那么会返回一个0向量(0,0,0,0)。如果想要把齐次坐标转化为笛卡尔坐标,可以使用cartesianize函数
MPoint pt;
pt. cartesianize (); //pt = (x/w,y/w,z/w,1)
这个函数是homogenize的逆运算,它用每个坐标值除以w。还有最后一个转化函数——rationalize,它和cartesianize类似,不过其中w = 1,而且会在最后舍去。
MPoint pt;
pt. rationalize (); // pt = (x/w,y/w,z/w,w)
要注意的是,maya并没有为顶点分配内存。开发者只有在确定在这些函数会被用到的情况下才分配内存。如果rationalize函数被调用了两次,那么会得到一个错误的顶点。对于预先内置的转化函数,可以获取原点:
MPoint::origin //原点位于(0,0,0)
你可以用通常的实例一样使用它,就像下面这样:
MPoint p0;
If (p0 == MPoint::origin)
MGlobal::displayInfo(“pointis the origin”);
2.8定位器
Maya中并没有独立顶点的形状,尽管可以用定位器来达到这种目的,定位器会在操作视图中显示,但并不会被渲染,用下面这种方法来为一个顶点创建定位器:
SpaceLocator -p 1 3 6;
因为定位器并没有transform节点,所以它不能想别的图形一样被缩放,旋转或者移动。电位器的顶点可以用下面这种方法来改变世界坐标或者局部坐标:
xform -query -objectSpace -translation;
xform -query -worldSpace -translation;