当前位置: 主页 > 平面设计 > Maya mel语初解之二-多边型建模

Maya mel语初解之二-多边型建模

  • 2022-02-05
  • 来源/作者: PS.ONEGREEN.ORG    / 佚名    
  • 8 次浏览

  现在继续mel的教程,如果你对mel还一无所知的话,请看mel语初解之一-基础和界面篇:

  众所周知,maya的多边形建模能力是不如人意的,因此这时mel会派上很大的用场。相信很多人都用过一些辅助性的建模工具,例如MJPolyTools、BPT、icePolyTools、CPS、drawSplit、rockGen...我在教程中会对这些程序的关键功能的编写方法作出详细说明,希望大家能在掌握这些功能的基础之上编写出自己称心如意的Poly工具。

  mel作为脚本语言使用非常方便,在工作中会很容易地把你的一些简单想法付诸实践。

  在讲Poly建模之前,需要复习一下以前的知识。

  首先要复习一下数组(Array):一群变量放到了一起,这群变量就成了一个数组变量。不过这些变量不是随便放的,每个变量都有一个房间,每个房间都有顺次的门牌号,我们就是根据门牌号来访问任何一个数组成员的。请看这个字符串数组的例子:

  选择几个场景中的物体。

  Maya mel语初解之二-多边型建模

// 获取场景中的每一个物体,分别放入数组$objects的每个房间中
string $objects[] = `ls -sl`;

  这时数组的状态如图所示。$objects可以看作是公寓的名称,[]里的红色数字为房间的门牌号,也叫作索引号(index)。数组的索引号总是从0开始的。也就是说$objects[0]为数组的第一个成员,它的值为"pSphere1";而$objects[1]为数组的第二个成员,他的值为"pCube1";以此类推。

  我们可以从数组中取值,例如:

  string $obj = $objects[0];

  // 此时变量$obj的值为"pSphere1"

[NextPage]

  也可以给数组的成员赋值,例如:

  $objects[1] = "pBox1";

  // 此时数组$objects的值为{"pSphere1", "pBox1", "pCone1"}

  Maya mel语初解之二-多边型建模

  要想遍历数组中的每个成员,可以用for语句,有两种方法。

  // 方法一
  string $objects[] = `ls -sl`;
  for ($i = 0; $i < size($objects); $i++)
  {
  string $obj = $objects[$i];
  /
/ do something ...
  }
  // 方法二
  string $objects[] = `ls -sl`;
  for ($obj in $objects)
  {
  // do something ...
  }

  [注] mel的for...in语句和JavaScript有所不同,$obj是字符串,指的是

  当前的数组成员,等同于"string $obj = $objects[$i];"

  再复习一下函数(Function):

  如果你编写比较复杂的程序,就会发现有很多经常用到的语句,这些语句经常以相同的组合出现。这样的语句编写起来有些麻烦,看起来也不太直观。为了提高工作效率,增加可读性,我们可以使用函数把它们封装起来。下面举例说明。

  还记得前面讲过的filterExpand获取多边形面的方法吧?

  string $faces[] = `filterExpand -ex 1 -sm

34`;

  对初学者来说,看到"-sm 34"后,总是很难联想到多边形的面。当然你可以用maya的全局变量$gSelectMeshFaces来替代34,不过这样做有些麻烦。我们编一个新的函数来做与上面代码同样的事情。

  proc string[] getSelFaces()
  {
  return `filterExpand -ex true -sm 34`;
  }
  // [注] Sel为Selected的缩写

  有了这个函数,我们以后再获取多边形的面时,就可以这样写:string $faces[] = `getSelFaces`;

[NextPage]

  也可以这样写:string $faces[] = getSelFaces();

  return为返回的意思,proc后面的字代表返回值的类型,return后面的字(变量或表达式)代表返回值,也就是函数的输出

值。

  对初学者来说,看到"-sm 34"后,总是很难联想到多边形的面。当然你可以用maya的全局变量$gSelectMeshFaces来替代34,不过这样做有些麻烦。我们编一个新的函数来做与上面代码同样的事情。

  proc string[] getSelFaces()
  {
  return `filterExpand -ex true -sm 34`;
  }
  // [注] Sel为Selected的缩写

  有了这个函数,我们以后再获取多边形的面时,就可以这样写:string $faces[] = `getSelFaces`;

  也可以这样写:string $faces[] = getSelFaces();

  return为返回的意思,proc后面的字代表返回值的类型,return后面的字(变量或表达式)代表返回值,也就是函数的输出值。

  再看一个例子:

  proc string[] getPolySel(string $type)
  {
  if ($type == "vert")
  return `filterExpand -ex true -sm 31`;
  if ($type == "edge")
  return `filterExpand -ex true -sm 32`;
  if ($type == "face")
  return `filterExpand -ex true -sm 34`;
  // 假如输入参数是非预期的,就返回一个空数组
  string $null[];
  return $null;
  }

  想要获取多边形的面时,可以这样写: string $faces[] = getSelFaces("face");

  或: string $faces[] = `getPolySel "face"`;

  这回用到了函数的输入参数(string $type),根据输入参数的不同,产成不同的返回值。

[NextPage]

  Maya mel语初解之二-多边型建模

  一个函数可以既没有输入参数也没有返回值,也可以只有其一。参数可以是多个,返回值只能是一个。

  return语句执行之后,后面的语句将不再执行。例如:

proc myProc()
{
 // 获取选择的物体
 string $objects[] = `ls -sl`;
 // 如果什么都没选择,就返回(什么也不做)。
 if (!size($objects))
  return;
 // do something
...
}
proc myProc()
{
 // 获取选择的物体
 string $objects[] = `ls -sl`;
 // 如果什么都没选择,就返回(什么也不做)。
 if (!size($objects))
  return;
 // do something ...
}

  或: string $faces[] = `getPolySel "face"`;

  这回用到了函数的输入参数(string $type),根据输入参数的不同,产成不同的返回值。

  Maya mel语初解之二-多边型建模

  一个函数可以既没有输入参数也没有返回值,也可以只有其一。参数可以是多个,返回值只能是一个。

>

  return语句执行之后,后面的语句将不再执行。例如:

proc myProc()
{
 // 获取选择的物体
 string $objects[] = `ls -sl`;
 // 如果什么都没选择,就返回(什么也不做)。
 if (!size($objects))
  return;
 // do something ...
}
proc myProc()
{
 // 获取选择的物体
 string $objects[] = `ls -sl`;
 // 如果什么都没选择,就返回(什么也不做)。
 if (!size($objects))
  return;
 // do something ...
}

  global proc和proc的区别

[NextPage]

  proc是

局部函数,局部函数只能在编写这个函数的mel文件中使用,不能在其他mel文件中使用,不能作为菜单和按钮命令,不占用内存空间。

  global proc是全局函数,没有proc那些局限。使用全局函数应注意,函数名不能与Maya中已有的全局函数或mel命令相同,否则会把原来的覆盖掉,可以通过使用函数名前缀来避免重复命名。关于全局函数的使用,最好了解一些Maya的运行方式。Maya启动时一般只把指定scripts路径中的*.mel文件名(*)载入内存,这样Maya运行时就可以调用这个文件中的同名函数,而当调用这个同名函数时,这个mel文件中的所有全局函数将被载入内存,直到Maya退出。

  如果还不明白,那就统统使用global proc好了,没什么大不了的。

  下面提供几个多边形建模常用到的函数,因为后面经常用到,所以应该熟练掌握,至少对于每个函数做什么事要很清楚。

  // 获取选择的多边形顶点
  proc string[] getSelVerts()
  {
  return `filterExp

 << 上一页  [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]  ... 下一页  >>