曲线转骨骼 【MEL 小工具】

问题
一个朋友问:
我想先创建一条曲线,然后在创建几段骨骼并吸附到曲线上,并且可以自定义骨骼的数目,也就是按照曲线的弧长来平分骨骼之间的距离,想请问,用MEL怎么实现?
思路
我的想法是这样的:
根据NURBS曲线的U参数,获得曲线上的任意一点的坐标,就可以在此创建骨骼了。
不过一般NURBS曲线的U向参数并没有归一化,骨骼并不会根据弧长均匀分布。
所以如果想要骨骼均匀沿着曲线分布,最好把NURBS曲线Rebuild一下,就可以解决问题了。
具体代码如下,希望有点用。
核心命令有两个,pointOnCurve和joint
结果

////////////////////////////////////////////////////////////
//created by hmaya at May24 2008
//MEL Command: Curve2Joints(int $pSpan, string $CurveName)
//www.cg-discovery.com
//Usage:
//1在脚本编辑器中执行该代码
//2指定骨骼段数和NURBS曲线名称
//例如:输入Curve2Joints(6,"curve2")并运行
//注意:为了获得更好的效果,建议运行该MEL之前,把BURBS曲线Rebuild一下
//////////////////////////////////////////////////////////////////
proc Curve2Joints(int $pSpan, string $CurveName){
if($pSpan < 0){ error "Please reassign the number of joints, it should be positive!"; } float $u; if($pSpan <= 0) $u = 0; if($pSpan > 0)
$u = 1.0/$pSpan;
int $i;
for($i = 0; $i <= $pSpan; $i++){ float $parameter = $i*$u; float $pos[] = `pointOnCurve -top 1 -pr $parameter -p $CurveName`; joint -p $pos[0] $pos[1] $pos[2]; } }

看完不过瘾?点此向作者提问

请教一个问题:按照曲线创建骨骼

对MEL基本不懂,有想学的欲望
现在在工作当中遇到一些问题,想请教一下
就是我想先创建一条曲线,然后在创建几段骨骼并吸附到曲线上,并且可以自定义骨骼的数目,也就是按照曲线的弧长来平分骨骼之间的距离
想请问,用MEL怎么实现,大概的一个原理是什么,谢谢
第一次上这个网站发问题

看完不过瘾?点此向作者提问

可视化Ocean Shader

可视化Ocean Shader
在MAYA中,Ocean Shader内置了Displacement、波浪等效果。即使把Ocean Shader赋予一个纯平面,一样可以表现海洋的波澜起伏的效果。要在视图中直接预览Ocean Shader,MAYA提供了预览平面(Preview Plane)。这里的Preview Plane是使用高场节点(Height Field)生成的。但由于Height Field的局限性,这里的Preview Plane不是一般意义上的模型,无法与NURBS模型作相交运算。
我们可以使用ColorAtPoint命令把Ocean Shader可视化,得到波澜起伏的NURBS海洋表面。这个MEL的实用性很强,最经典的用途是NURBS海洋表面可以与海洋上漂浮、游动的NURBS模型求交,得到相交的轮廓线。例如海洋上轮船在疾驰,轮船四周要溅出浪花。如果得到NURBS海洋表面,则可以与轮船模型(NURBS模型)求交,得到轮廓线。这样再在轮廓线上建立离子发射器,发射离子,即可得到轮船四周浪花飞溅的效果。远镜头不用这么麻烦,但给轮船近镜头或者船身特写时,要制作浪花就用上这个MEL了。当然,在MAYA里,我们还可以把流体转换为多变形,不过这样的转换对静帧还可以,但对动画来说用途不大。但我们的这个MEL则适用于动画。
这个MEL的核心命令是ColorAtPoint。其原理是提取NURBS表面上点的X和Z坐标,然后使用ColorAtPoint命令将相应点的Ocean Shader的Alpha值提取出来,传递给NURBS表面,作为对应点的Y坐标。这样就使用NURBS表面表现出了海洋,如图9.24。

图9.24 NURBS海洋
该MEL代码如下
//////////////////////////////////////////////////////////////
//Create by hmaya
//Date: 2005.10
//第一步:新建场景
//第二步:在Hypershade中创建一个Oceanshader,默认名称为Oceanshader1,不要再改了.
//第三步:再创建一个NURBS平面,修改其名称为model,注意修改其大小和UV段数.
//第四步:在Script Editor中输入如下代码执行即可。
//第五步:要得到动态的NURBS海洋,可以在Hypershade中选择Oceanshader1,
//然后执行Window | Animation Editors | Expression Editor,
//为Oceanshader1添加下面的代码执行即可。
//////////////////////////////////////////////////////////////
for ($i=0;$i<169;$i++) //设NURBS平面的UV段数是10*10,则共有13*13=169个CV { float $pos[]=`xform -q -ws -t model.controlPoints[$i]`;//得到NURBS平面的坐标 float $pos_ocean[]=`colorAtPoint -o A -u $pos[0] -v $pos[2] oceanShader1`; //获取Oceanshader的Alpha值 string $YY="modelShape.controlPoints["+$i+"].yValue"; setAttr $YY $pos_ocean[0]; // 将Oceanshader的Alpha值传递为NURBS平面上对应点的Y坐标 } 添加MEL表达式后的Ocean Shader节点网络如图9.25。
图9.25 Ocean Shader的节点网络

看完不过瘾?点此向作者提问

Maya的卡通材质[Toon Shader]

渲染物体的轮廓线
前段时间,英国一个教授有个小问题让我帮忙解决,他有个关于八叉树的图例,需要把物体的轮廓线渲染出来,如图这样。

面对这样的问题,若在以前版本的MAYA中,也许还要费些周折,笔者甚至想过在BMRT中自己动手写物体轮廓Shader。但当时笔者手头上有MAYA7.0,而且MAYA7.0新增了Toon Shader,而Toon Shader带有边线功能,这样一来,完成图例便简单多了。
下面笔者介绍解决方法。
选择要添加轮廓线的物体,在Rendering模块下执行Toon | Assign Outline | Add New Toon Outline,如图。

如图,MAYA已经使用画笔特效的方式为物体添加了轮廓线。按Ctrl + a,打开轮廓线的属性窗,可以通过设定Line Width来调整轮廓线的粗细,可以通过设定Profile Color、Crease Color、Border Color等,来调整轮廓线的色彩。

渲染,如图,我们得到了物体的轮廓线。

卡通材质(Toon Shader)
前面我们尝试了Toon Shader的描绘边线功能。而卡通材质一般由两部分组成,描绘轮廓线和填充色。MAYA的Toon Shader中提供了这两部分的命令,如图,分别是Fill Shader和Outline。

如图,选择要赋予卡通材质的模型,在Rendering模块下执行Toon | Assign Fill Shader | Light Angle Two Tone,为模型添加一个与灯光相关的填充色Shader。当然大家也可以尝试其他的填充色Shader。

如图,在属性编辑器中编辑该填充色Shader的Color参数,可以改变明暗色调,也可以增加色彩过渡,大家可以自由编辑渐变色。

渲染当前的卡通材质效果,如图。

使用上面 “渲染物体的轮廓线”中介绍的方法,为模型添加边线(选择模型,执行Toon | Assign Outline | Add New Toon Outline),设定边线宽度和色彩,渲染,如图。

把头发也赋予卡通材质,最后得到的卡通材质效果如图。

看完不过瘾?点此向作者提问

Shading | Shader | Shading Group | Node

Shading | Shader | Shading Group | Node
大家可能经常看到Shading、Shader、Shading Group这三个词,它们有何联系有何区别呢?
下面笔者解释一下:
Shading,动词,有光影的意思,可以理解为着色。
Shader,转化为名词,可以理解为着色器,是一系列为了着色和光影而连接起来的材质节点组合。通俗理解为材质,不过Shader比材质的概念要大。
MAYA中还有个概念叫Shading Group,位于材质球的上游,而且与灯光和模型的Shape节点连接,可为最后的渲染输出提供信息,如图。

图 Shading Group
除此之外呢,大家在MAYA中最常见的名词就是节点(Node)了。下面笔者再详细介绍一下Node的概念。
从底层来说,MAYA中的节点(Node)主要是存储数据并对数据做某种方式的修改或处理。一般的节点含有输入(Input)属性、输出(Output)属性和一个计算函数。当前节点通过输入(Input)属性接收上游节点传递进来的数据,并通过计算函数处理数据,然后使用输出(Output)属性将数据输出给下游的节点,然后下游的节点同样再通过Input属性接收数据并处理,再通过Output属性输出,依次类推。这样一个一个的节点连接起来,就构成了MAYA的工作流程。如果大家对物理比较熟悉的话,不难想象,MAYA的节点就像电阻一样,接收电流(数据),经过一定消耗(计算)然后再输出电流。这样一个一个电阻就构成了电路(工作流程)。
从表面来看,MAYA的节点有:
构造节点——负责片面、曲线的创建,如放样(Loft)、旋转(Revolve)等。
Shape节点——形状节点,决定模型的形状是方块还是圆球,记录着一堆顶点坐标等数据。
Transform节点——变换节点,专门负责物体的旋转、缩放、移动等属性。
Shading节点——着色节点或者叫材质节点,好多类型的节点,负责物体的材质。
其他的诸如灯光、摄像机、骨骼等等大同小异,都可以看成节点,只不过这些节点的属性比较多。

看完不过瘾?点此向作者提问