可视化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的节点网络

作者: hmaya

developer!

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

《可视化Ocean Shader》有一个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注