Maya的Switch Ulilities(开关效用工具)

Switch Utilities(开关效用工具):如图



Switch Ulilities(开关效用工具)主要是处理同一个材质球(BlinnLambert等)赋予多个物体的情况,可以令不同的物体可以有不同的纹理,质感。 Switch Ulilities的使用方法很简单, 根据具体的通道创建Switch Ulilities节点并连接到相应的材质球或者2d Placement3d Placement节点等属性上。然后再将对应的纹理或者2d3d Placement节点连接到Switch Ulilities节点上并对应相应的模型表面,以控制不同物体的纹理。

下面一一介绍开关效用节点:

Double Switch,双通道开关节点,可以接受双通道属性的输入。 inShape栏可以列出材质球所赋予的模型表面,inDouble栏可以列出或者连接对应的双通道属性,如2d PlacementRepeat UVTranslate Frame等属性,以控制同一个材质球下的不同的纹理。

Quad Switch,四通道开关节点, 可以接受四通道属性的输入,主要是针对MentalrayRGBA四通道的色彩模式。 inShape栏可以列出材质球所赋予的模型表面,inQuad栏可以列出或者连接对应的四通道属性,如纹理,材质的色彩(RGBA模式)。

Single Switch,单通道开关节点,可以接受单通道属性的输入。inShape栏可以列出材质球所赋予的模型表面,inSingle栏可以列出或者连接对应的单通道属性,如2d PlacementRotate UV,材质的Bump纹理,Diffuse纹理,Glow Intensity等属性,以控制同一个材质球下的不同的纹理。

Triple Switch,三通道开关节点,可以接受三通道属性的输入。inShape栏可以列出材质球所赋予的模型表面,inTriple栏可以列出或者连接对应的三通道属性,如纹理的outColorColor Offset Color Gain属性,以控制同一个材质球下的不同的纹理。

 

 

 

Particle Utilities(离子效用工具)

Particle Sampler,离子取样节点,可以输出离子的UV CoordUv坐标),每离子(per-particle)属性,如rgbPP(每离子色彩),opacityPP(每离子不透明度)等,离子相关的5个标量和5个矢量,离子的birthPositionworldBirthPosition等。使用Particle Sampler节点,可以更好的控制离子,如果把Particle SamplerrgbPPopacityPP等属性连接到相应的离子材质上(如Particle Cloud),就可以使用Maya Software渲染出rgbPPopacityPP等效果,而不使用Particle Sampler节点,就只能硬件渲染了。

 

 

 

Image Planes(图板)

Image Plane,图板节点,可以引入摄像机图板,在图板上赋予相应的贴图或纹理,可以在建模或动画时作为参考,或者作为动画时的环境。图板与相应的摄像机作连接,无论摄像机怎么旋转,图板都会始终正对着摄像机。一般来说,创建Image Plane的简单方法是在相应的摄像机视图中,在面板菜单上选择View | Image Plane | Import Image,这样MAYA会自动在相应的摄像机上创建Image Plane并作连接。

 

 

 

Glow Utilities(发光效用工具)

Optical FX,光学特效节点,与灯光配合,用来制作光学特效,如射线光,辉光,镜头光晕等。使用Optical FX的简单方法是在灯光的属性编辑器中的Light Effects(灯光特效)标签下单击Light Glow(灯光发射)后面棋盘格图标,即可快速创建Optical FX节点,并与灯光自动连接。

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

Maya的Color Utilities(色彩效用工具)

Maya的Color Utilities(色彩效用工具)



下面一一介绍色彩效用工具节点:

Blend Color,混合色彩节点,可以将Color1Color2混合输出,Blender参数可以控制混合权重,而Color1Color2也可以接受其他纹理的输入。我们常常使用Blend Color节点来混合两种纹理或者色彩。

Clamp,剪裁节点,可以根据设定的Min(最小)和Max(最大)参数,来对Input作裁剪缩放,然后输出。Clamp节点与Set Range节点类似,但少了Old Max / Old Min参数。我们常常使用Clamp节点限定输出值的范围,例如把由纹理的输入值限定到Color所能接受的数值范围内。使用程序表达Clamp节点的含义如下:

ifInput>Min&&Input<Max Output=Input;

ifInput<Min Output=Min;

ifInput>Max Output=Max;

Contrast,对比节点,可以增加或降低纹理的对比度,也可以单独控制RGB通道的对比度,并输出。Value属性可以接受其他纹理的输入,Contrast参数可以调整RGB通道的对比度,Bias可以调整对比度的偏差。

Gamma Correct,伽玛校正节点, Value属性可以接受其他纹理的输入,Gamma参数可以单独校正RGB通道的色彩,并将校正结果输出。我们常常使用Gamma Correct节点来校正或调整纹理的色彩。使用数学表达式表示即:

Output=powerValue1/Gamma=Value^1/Gamma ,(求Value1/Gamma次方)。

Hsv to RgbHSV转换为RGB节点,可以将输入的HSV色彩空间转换为RGB色彩空间, In Hsv属性可以 接受其他纹理的输入,得到HSV值,Out Rgb属性为输出的RGB值。

Luminance,亮度节点,可以将纹理的RGB三色通道转换为一个单通道的灰度值,作为亮度通道(Luminance)输出。 具体的数学公式是:

Luminance = 0.3* Red + 0.59* Green + 0.11* Blue .

Remap Color,重贴色彩,Color(色彩)属性可以接受其他纹理的输入,Red(红), Green(绿), Blue(兰)属性则可以单独控制三色通道,还可以在Input and Output Range(输入和输出范围)下设定色彩输入输出的最大最小值。我们可以使用Remap Color节点调整纹理的色彩,得到丰富的色彩效果;当然,Remap Color节点不仅仅适用于色彩调整,因为是三色通道,所以还可以对物体的TranslateXYZRotateXYZ等属性有效。所以我们还可以使用Remap Color节点制作物体的动画。

 

Remap Hsv,重贴HSVColor(色彩)属性可以接受其他纹理的输入,Hue(色相), Saturation(饱和度), Value(明度)属性则可以单独控制色相,饱和度,明度,还可以在Input and Output Range(输入和输出范围)下设定色彩输入输出的最大最小值。我们可以使用Remap Hsv节点调整纹理的色彩,得到丰富的色彩效果,如果设定Saturation(饱和度)全为0 可以得到黑白的灰度纹理;如果设定 Value(明度)的左侧为1,右侧为0,则可以得到反相的效果。 Remap Hsv节点与Remap Color节点很类似,但Remap Color节点可以单独控制色彩的RGB通道,而Remap Hsv节点可以单独控制色彩的Hue(色相), Saturation(饱和度), Value(明度)。

Remap Value,重贴色值节点,Input Value可以接受其他单通道数值的输入(如AlphafacingRatio等),然后可以自由设定Value(色值)和Color(色彩),还可以在Input and Output Range(输入和输出范围)下设定色值输入输出的最大最小值。值得说明的是Remap Value节点不仅仅局限于色彩色值方面的应用,其他任意单通道的值(如反射强度,凹凸值等等),都可以输入Remap Value,进行调整和动画。

Rgb to HsvRGB转换为HSV节点,可以将输入的RGB色彩空间转换为HSV色彩空间, In Rgb属性可以 接受其他纹理的输入,得到RGB值,Out Hsv属性为输出的HSV值。

Surf. Luminance 表面亮度节点,可返回物体表面的光照信息。使用Surf. Luminance节点,我们可以表现某些与光照相关的特效,例如把Surf. Luminance的输出连接到Bump Depth(凹凸深度)上,则光照强的部分凹凸强烈,光照弱的部分凹凸减弱。

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

Maya的General Utilities(一般效用工具)

General Utilities(一般效用工具):如图12

下面一一介绍一般效用工具节点:

Array Mapper 阵列映射节点,一般用于离子。例如为离子添加Per Particle Attribute(每离子属性)时,如rgbPP,可以为离子着色。如果使用纹理贴图或者Ramp节点为离子着色时,MAYA通过Array Mapper节点将Ramp或贴图的色彩映射到每个离子上,因为离子不像多边形含有UV信息,故必须使用Array Mapper节点来完成纹理空间到离子的映射。

Bump 2d 2d凹凸节点,可以表现凹凸效果。通过Bump 2d节点,可以不通过建模而改变模型表面的法线,从而实现凹凸效果。一般来说,我们不需要单独创建Bump 2d节点,常用的凹凸纹理使用方法是直接将2d纹理用中键拖动到材质球的bump map属性上,MAYA会自动在材质球与纹理之间插入Bump 2d节点。

Bump 3d 3d凹凸节点,与Bump 2d节点类似,同样可以表现凹凸效果。但Bump 3d是连接3d纹理与材质球的,而Bump 2d是连接2d纹理与材质球的。

Clear Coat,光亮涂层节点,可以模拟汽车烤漆等质感。 Clear Coat节点是个插件,需要在Plug-in Manager中勾选clearcoat.mll,才可以加载这个节点。把Clear CoatOut Value连接到材质球的Color属性上可以预览Clear Coat节点的效果,一般最后我们把Clear CoatOut Value连接到材质球的Reflectivity(反射度)属性上。

Condition,条件节点,可以作判断,相当于编程语言中的if-else语句。Condition节点可以完成很多工作,典型的用法是使用Condition节点制作双面材质。 Condition节点中含有两个输入条件: First Term(条件1), Second Term(条件2), 而判断标准是Operation(运算),含有Equal(等于), Not Equal(不等), Greater Than(大于), Greater or Equal(大于或等于), Less Than(小于), Less or Equal(小于或等于);

输出结果是Color If Ture(真值时的色彩)和Color If False(假值时的色彩)。

如果使用程序语言写出来就是:

if "First Term" operation "Second Term"

      {

       Outcolor = Color If Ture;

      }

else

      {

      Outcolor = Color If False;

      }

 

Distence Between,间距节点,可以计算两点间的距离。 Distence Between节点的Point1Point2可以接受其他输入,如Locater(定位器),灯光, Camera中心等,输入二者的距离。故我们可以使用Distence Between节点测量灯光与物体,或者物体与摄像机间的距离,并输出距离值。而Distence Between节点的工作原理和Measure Tool(测量工具)类似,如果Point1坐标是(x1y1z1),Point2坐标是(x2y2z2),则它们的距离为Sqrt[x1-x2*x1-x2 + y1-y2*y1-y2 + z1-z2*z1-z2]

Height Field,高场节点,使用Height Field节点,MAYA会自动创建一个平面,以快速预览Displacement(置换)效果,而且可以交互调整预览面的Resolution(分辨率), Color(色彩),Height Scale(高度缩放),从而改善置换效果。Height Field节点的用法是将其他纹理贴图用中键拖动到Height Field节点的Displacement属性上即可。 MAYA中的海洋预览面(Preview Plane)就是使用Height Field节点生成的。使用Height Field节点预览Displacement(置换)很快而且方便,有了Height Field节点,我们不需要将Displacement(置换)转换为多边形来预览置换效果了。值得说明的是,Height Field节点生成的置换表面无法被Maya Software渲染出来,只能用来预览或参考。

Light Info,灯光信息,与Sampler Info(取样信息)节点类似,可以输出灯光在世界坐标空间中的位置,灯光照射的方向,灯光到照射点的距离。使用Light Info节点可以制作一些跟灯光位置,光照方向等相关的质感特效。

Multiply Divide,乘除节点,可以对Input1Iput2作乘除,乘方运算,并输出运算结果。Operation(运算)方式有No operation(无运算), Multiply(乘), Divide(除), Power(乘方)。用数学公式表示,如下:

设定Input1为(x1y1z1),Input2为(x2y2z2;

Operation(运算)方式为No operation(无运算)时,Output=Input1;即:

output_X=x1;

output_Y=y1;

output_Z=z1;

 

Operation运算方式为Multiply Output=Input1*Input2;

output_X=x1*x2;

output_Y=y1*y2;

output_Z=z1*z2;

 

Operation运算方式为Divide Output=Input1/Input2;

output_X=x1/x2;

output_Y=y1/y2;

output_Z=z1/z2;

 

Operation运算方式为Power乘方 Output = powerInput1 Input2;

 

output_X=powerx1 x2;

output_Y=powery1 y2;

output_Z=powerz1 z2;

如:

power30.5=3^0.5,(对3开方)。

power3 2=3*3

power34=3*3*3*3

 

2d Placement2d纹理放置节点,可以控制纹理在模型表面的位置,方向,重复等。其参数有Interactive Placement(交互放置), Coverage(覆盖范围), Translate Frame(变换帧), Rotate Frame(旋转帧), Mirror UU向镜像), Mirror VV向镜像), Wrap UU向重叠),Wrap VV向重叠),Stagger(交错),Repeat UVUV重复), OffsetUV偏移), Rotate UV(旋转UV), Noise UVUV随机)等。 一般来说我们不需要单独创建2d Placement节点,在创建2D纹理时,如CheckerCoth等,MAYA都会自动创建2d Placement节点并于2D纹理作相应的连接。

3d Placement3d纹理放置节点,与2d Placement节点类似,但用于3D纹理的放置。参数也略有不同,有Translate(变换), Rotate(旋转), Scale(缩放), Shear(切变), Interactive Placement(交互放置)等,但没有Repeat UVUV重复)等参数。一般来说我们不需要单独创建3d Placement节点,在创建3D纹理时,如LeatherMarble等,MAYA都会自动创建3d Placement节点并于3D纹理作相应的连接。

 

+/- Average,加减平均节点,可以接受其他纹理或节点的输入,然后输出运算结果。Operation(运算)方式有No operation(无运算), Sum(求和), Subtract(求差), Average(平均值)。使用+/- Average节点,我们可以简单的混合两个以上的纹理的效果。用数学公式表示,如下:

如果输入的参数为3d的(含三个变量,如色彩的三个rgb分量),则MAYA显示Input3D[n];如果输入的参数为1d的(如Ahpha),则MAYA显示Input1D[n];下面以Input3D[n]为例:

 

Operation(运算)方式为No operation(无运算)时,

Output=Input3D[1];

 

Operation(运算)方式为Sum(求和)时,

Output=Input3D[1] + Input3D[2] + Input3D[3] + … + Input3D[n] ;

 

Operation(运算)方式为Subtract(求差)时,

Output=Input3D[1] – Input3D[2] – Input3D[3] – … – Input3D[n]  ;

 

Operation(运算)方式为Average(平均值)时,

Output=Input3D[1] + Input3D[2] + Input3D[3] + … + Input3D[n] / n;

 

Projection,投影节点,可以控制2D纹理到模型的投影方式。 Proj Type(投影方式)有Planar(平面), Spherical(球形),Cylindrical(柱形),Ball(球形),Cubic(立方体的), Triplanar(三角的), Concentric(同心的), Perspective(透视的)。其他参数有Interactive Placement(交互放置), Fit To BBox(与包围盒匹配) Image(图像), U AngleU角度),V AngleV角度)等。其中Image(图像)属性可以接受其他纹理节点的输入。 一般来说,Projection(投影)节点常常用于NURBS类型的模型,使用Projection(投影)节点可以在NURBS表面上定位贴图的位置,因为对于NURBS曲面来说,没有UV点,不像多边形那样可以自由分配和编辑UV 而大多时候我么也不需要手动创建Projection(投影)节点,只需要选择2D纹理为As Projection(投影)模式即可,在创建纹理节点的时候,MAYA会自动创建Projection(投影)节点,并与纹理作相应的连接。

Reverse,反相节点,反转输入的值(有时为相反数),并输出。例如输入为白色,Reverse节点输出黑色;输入为红色,Reverse节点输出绿色;输入为1,输出为-1。故我们常常使用Reverse节点实现反相功能。

Sampler Info,取样信息节点,可以获取模型表面上取样点的位置,方向,切线,相对于摄像机的位置等信息,其参数有Point World(取样点世界坐标), Point Obj(取样点局部坐标), Point Camera(取样点摄像机空间坐标),Normal Camera(摄像机法线), Uv CoordUV坐标), Ray Direction(视线方向), Tangent UCamera(摄像机U向切线), Tangent VCamera(摄像机V向切线), Pixel Center(像素中心), Facing Ratio(朝向率), Flipped Normal(反转法线)。Sampler Info节点使用很频繁,例如我们制作双面材质时,需要使用Flipped Normal(反转法线)属性; 制作X光材质,水墨效果时,需要使用Facing Ratio(朝向率)属性等。

Set Range,设置范围节点,可以将输入值进行一定比例的缩放,然后输出。其参数有Value Min/Max Old Max / Old Min。其中Value可以接受其他纹理的输入,Old Max / Old Min为原来的最大最小值,Min/Max为缩放后的最大最小值。用数学公式表示,如下:

Output=Min + Value-Old_Min*Max – Min/Old_Max – Old_Min)。

 

Stencil,标签节点,可以混合纹理边缘,扣除部分色彩等,Image(图像)可以接受其他纹理节点的输入, Edge Blend(边缘混合)和Mask(遮罩)可以调整纹理混合情况,当然Mask(遮罩)属性也可以接受其他纹理的输入。而HSV Color keyHSV色键)属性下可以设定要去除的色彩。一般来说我们也不需要单独创建Stencil节点,只需要选择2D纹理为As Stencil(标签)模式即可,在创建纹理节点的时候,MAYA会自动创建Stencil(标签)节点,并与纹理作相应的连接。

Uv ChooserUV选择器,对于多重UV坐标,即一个模型含有多个UV组的时候,MAYA会自总创建Uv Chooser节点,以在渲染时进行UV选择。所以一般情况下我们不需要单独创建Uv Chooser节点。需要单独创建Stencil节点。

 

Vector Product,向量乘积节点,可以对向量(三维数组)作点乘,叉乘运算,也可对矩阵作乘积运算,并输出运算结果。Operation(运算)方式有No operation(无运算),Dot Product(点乘), Cross Product(叉乘),Vector Matrix Product(向量矩阵相乘), Point Matrix Product(点矩阵相乘)。最后还可以Normalize Output(规格化输出),即变换向量长度为1。由于纹理的色彩有rgb三个分量,可以把他们看成矩阵,用Vector Product节点对其作乘运算。 对于物体的位置,速度等向量,可以对其作点乘,叉乘运算。用数学公式表示如下:

设定Input1x1y1z1),Input2x2y2z2),则:

点乘: 

Input1 . Input2=|Input1|*|Input2|*cosθ= x1*x2 + y1*y2 + z1*z2 ;

叉乘: 

   Input1 ^ Input2 =  = y1*z2 – y2*z1 x2*z1 – x1*z2 x1*y2 – x2*y1;


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

画框边界的魔力

画框边界的魔力
在制作静帧或动画时,常常要考虑构图。如果灵活运用画框,可以得到出其不意的效果。从心理和一般视觉常识来讲,画面的边框会给人一种暗示,画框一方面意味着画面延伸的结束,一方面还意味着画面的起始。
而何伯特•泽特尔(Herbert Zettl)先生把这个归结为画框的磁力,他认为画框有一种自然的磁力,可以吸引画面中的物体;我们可以借鉴他的这种说法,如果有效的将画框的这种磁力利用到构图中去,可以极大的增加画面的张力和美感。如图,对画框磁力的巧妙利用,极大的增加了画面的效果,强化了要表达的主题。

图 画框磁力
如下图,我们也可以认为画框的顶边有极大的磁力,来吸引着画面上的物体,从而使图中的建筑物显得愈发高大雄伟!

图 画框磁力
相反,如果不利用画框顶边的这种磁力,则效果大减,如图,大家可以对比一下。
由此可见,对画框的合理利用,可以凸显画面中物体的特征,增强画面的感染力。

图 对比画框的作用

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

光照对比度与造型需要

光照对比度与造型需要
在照明中,使用高反差,明暗对比强烈的光照,有助于强调和突出物体表面的纹理,增强立体感。例如,要表现男人或者老人面部的皱纹、胡须等,塑造刚毅硬朗、沧桑艰辛的感觉时,可以使用高反差的光照,即将灯光从侧面照亮面部,使得亮部和暗部有着明显的对比,如图,看罗中立先生这幅著名的《父亲》,体会高反差、强对比的光照在该图中的作用。

图 高反差、强对比的光照
相反,使用低反差、明暗对比柔和的光照,可以弱化物体表面的纹理,使其看起来光滑柔和。在拍摄女人的面部时,我们通常希望表现女性平滑柔美的肌肤,使用低反差、明暗对比柔和的光照,可以更好的表现这种感觉。要降低反差、削弱明暗对比,可以使用多盏低亮的灯,从不同的方向照射物体。著名的模拟全局光的插件——GI_Joe,可以完美的用在这里。如图,看下面这幅女模特的面部,体会低反差、弱对比的光照在该图中的作用。

图 低反差、弱对比的光照

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

【Q/A】有问有答

有问有答。
大家有什么Maya开发或者制作方面的问题,可以在该文的评论中发表,笔者也将评论中回答。
欢迎大家互动参与,共同回答[face03]
是会员的,可以在Q&A标签下单独开启新问题,也“CG知道”一把~

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

renderman 的 NPR(非照片级)渲染(BMRT)

Renderman 的 NPR(非照片级)渲染 (BMRT)          by hmaya, Zhu Qin

近来,人们除了对照片级真实渲染的不断追求之外,还在3D渲染器中追求非照片级真实渲染(Non Photo-realistically Rendering),简称NPR,例如卡通渲染、水彩、铅笔等笔触的模拟。

Render Man对渲染的控制可谓自由、开放之极,尤其在完成最后的项目之后,我们更是不得不赞叹Render Man的三头六臂,样样都可以应付。

2002年第一次使用MAYA时,那时还是MAYA4.0。但是至今为止,我最喜欢的MAYA开机界面,还是MAYA4.0的,如图。

MAYA4.0的开机界面 这样我就一直在想,这幅画面是如何生成的。我的注意力放在了画面的条纹上。我在Photoshop里做过尝试,可以做一个单独的条纹的图层,然后图层混合模式设为叠加,可以大致得到类似的效果,如图果,如图。

 

Photoshop中叠加条纹  

   但是,问题来了,这样的效果虽然近似,但也很死板,例如,如果在原来画面的非常亮的部分,不想叠加条纹;或者反过来,我们想在暗部显示条纹,亮部不显示条纹,在Photoshop中就比较难实现了。

总结一下,问题就是,能否只让某一段亮度范围的图像与条纹叠加,而该亮度以外的图像不与条纹叠加?我们在Render Man中尝试了这个问题,并且很好的解决了,从而可以自由控制叠加条纹的亮度范围了。实现思路是这样的,首先在Render Man中制作重复的条纹。这个问题比较简单,把P切换到屏幕空间,然后使用mod()函数制作重复条纹,使用mix()函数叠加条纹。代码如下:

point Pscreen = transform("screen", P);/*将P转换到屏幕空间*/ 
float ss=xcomp(Pscreen);      
float tt=ycomp(Pscreen);
ss=mod(ss*frequency,1);/*重复后的每个单元的s*/ 
tt=mod(tt*frequency,1);/*重复后的每个单元的t*/ 
Ci=mix(Ci,linecolor,weight);

条纹制作好之后,就要解决如何控制混合范围的问题了。Mix()函数中有个混合权重,可以把混合权重与图像的亮度建立联系,即达到用亮度控制条纹的目的了。 

   获取图像亮度的一种快捷方法,是直接对RGB操作,将RGB三色通道转换为一个单通道的灰度值,作为亮度通道(Luminance)输出。具体的数学公式是:
Luminance = 0.3* Red + 0.59* Green + 0.11* Blue ;

最后结合Luminance范围修正混合权重即可。解决方案如下:

     float RR=comp(Ci,0);/*提取R分量*/ 
    float GG=comp(Ci,1);/*提取G分量*/ 
    float BB=comp(Ci,2);/*提取B分量*/ 
    float Luminance = 0.3* RR + 0.59* GG + 0.11* BB ; 
   float alpha=smoothstep(0,Luminance_min,Luminance) 
        
-smoothstep(Luminance_max,1,Luminance);/*控制叠加的亮度范围*/
   weight=alpha*weight;/*亮度与混合权重建立连接*/
  
Ci=mix(Ci,linecolor,weight);/* 混合条纹与图像*/ 

Render Man的测试结果如下:不控制叠加的亮度范围,条纹简单的叠加如图:

 

条纹简单的叠加  

控制叠加的亮度范围之后,叠加条纹的效果如图:

 控制叠加的亮度范围之后,叠加条纹 

当然,叠加和制作条纹时,我们使用了smoothstep()函数,来反锯齿,或者进行渐变过渡的叠加。对三维物体的渲染测如图:

 

 下面给出原代码line.sl


surface
line(
 float Ka        =  1;
        float Kd        = .5;
        float Ks        = .5;
        float fuzz      = 0.1;/*控制线框的模糊宽度*/
        float frequency = 80; /*控制线框的重复次数*/
        float width     = .1; /*控制线框宽度*/
        color linecolor =color (0.3,0.4,0.7);/*控制线的颜色*/
        float roughness = .1;
        float Luminance_max =0.8;/*亮度混合的最大阀值,0.8以上的值不混合*/
        float Luminance_min =0.4;/*亮度混合的最小阀值,0.4以下的值不混合*/
        string mapname = "green.tiff";
        color specularcolor =(1,1,1))
{
    normal Nf = faceforward (normalize(N),I);
    vector V = -normalize(I);
    color Ct;
  
    point Pscreen = transform("screen", P);/*将P转换到屏幕空间*/
   
/*setzcomp(Pscreen, 0);
    Pscreen = normalize(Pscreen);*/
   
     float ss=xcomp(Pscreen);
     float tt=ycomp(Pscreen);
     ss=mod(ss*frequency,1);/*重复后的每个单元的s*/
     tt=mod(tt*frequency,1);/*重复后的每个单元的t*/
   
    float weight; /*混合的权重*/
    if(tt<(0.5-fuzz-width)||tt>(0.5+fuzz+width))
       weight=0;
    else
   {
    float smooth(float e0,e1,e2,e3,x) {
                    return  smoothstep(e0,e1,x)-smoothstep(e2,e3,x);
                      }  /*e0到e1之间平滑过渡,e1到e2之间为1,e2到e3间平滑过渡 */
   
       weight=smooth(0.5-fuzz-width,0.5-width,0.5+width,0.5+width+fuzz,tt);
       weight=clamp(weight,0,1);
   };
 
if( mapname != "" )
  Ct = color texture(mapname,s/2,t/2);
              /* Use s and t texture( mapname,s,t)*/
 else
  Ct = Cs;

    Oi = Os;

    Ci = Oi * ( Ct * (Ka*ambient() + Kd*diffuse(Nf)) +
  specularcolor * Ks*specular(Nf,V,roughness));

    float RR=comp(Ci,0);/*提取R分量*/
    float GG=comp(Ci,1);/*提取G分量*/
    float BB=comp(Ci,2);/*提取B分量*/
   
    float Luminance = 0.3* RR + 0.59* GG + 0.11* BB ;
  
float alpha=smoothstep(0,Luminance_min,Luminance)-smoothstep(Luminance_max,1,Luminance);

weight=alpha*weight;
Ci=mix(Ci,linecolor,weight);

   /*——修改亮度的另外一种快捷方法,直接对RGB操作.—–*/
  /* 将RGB三色通道转换为一个单通道的灰度值,
   作为亮度通道(Luminance)输出。具体的数学公式是:
   Luminance = 0.3* Red + 0.59* Green + 0.11* Blue ;
    RR=0.30*a*RR;//a为亮度比例因子
    GG=0.59*a*GG;
    BB=0.11*a*BB;
  */
}

 

 

 

 

 

 

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

用MAYA绘画函数图像

用MAYA绘画函数图像

笔者遇到这样一个问题,笔者一个数学系的同学有一个混沌函数的图像画不出来,问我能不能帮忙用计算机画画。笔者没有MatlabMapple的使用经验,于是考虑使用MAYAMEL来绘制。实验发现,MAYA完全可以用来绘画数学函数图像。

这里笔者给出一个简单的函数如下:

x=(60-t)*sin(t);

y=(60-t)*cos(t);

z=3-3t;

0 <= t <= 16PI

我们使用MEL来绘制出该函数的图像,如图,可以看到是个逐渐收缩的螺旋线。

MEL来绘制出函数的图像

绘制函数图像的MEL代码如下,修改函数定义,该MEL还可以绘制其他函数的图像。

 

/////////////////////////////////////////////////////////

//created by hmaya at 2006.8

//绘画函数的图像

//x=(60-t)*sin(t);

//y=(60-t)*cos(t);

//z=3-3t;

//t->[0,16PI]

//参数说明:

//proc drawFn(float $v_min,float $v_max,float $step,string $curveName)

//————-x最小值——x最大值——–步长——-曲线名称——

/////////////////////////////////////////////////////////

proc drawFn(float $v_min,float $v_max,float $step,string $curveName){

int $count_point = ($v_max – $v_min)/$step;

 

//==================画线======================//

curve -d 1 -p -2 1 0 -p 0 2 0 -p 1 1 0 -k 0 -k 1 -k 2 -n curve_temp;

rebuildCurve -ch 1 -rpo 1 -rt 0 -end 1 -kr 2 -kcp 0 -kep 0 -kt 0 -s ($count_point-1) -d 1 -tol 0.01 "curve_temp";

 

 

//===============定义数学函数=====================//

float $t;

int $n=0;

for($t=$v_min;$t<=$v_max;$t=$t+$step)

{       

float $value_x[];

float $value_y[];

float $value_z[];

      $value_x[$n]=(60-$t)*sin($t); 

      $value_z[$n]=(60-$t)*cos($t);

      $value_y[$n]= 3-3*$t;

move -a $value_x[$n] $value_y[$n] $value_z[$n] curve_temp.ep[$n];

 

$n++;

 

}//end for $t

 

rename curve_temp $curveName;

}//end proc

 

//Run Proc

drawFn(0,50,0.1,"FnCurve");

 

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

在MEL中应用Proc

在MEL中应用Proc
在MEL中,我们可以定义自己的proc,相当于自定义函数。定义proc的好处是可以模块化代码,增加代码的可复用性。
还以前面的创建自己的包围盒为例,换个物体,名称不叫trees,我们即必须重新修改MEL,修改物体的名称,再次执行这段MEL。但是大家不难看出,大部分MEL代码都没有改变,我们只需要改变MEL中物体的名称。
如果我们定义一个proc,并把物体的名称作为proc的参数传进去,则可以非常方便的为指定物体创建包围盒。为了今后可以为多个物体创建包围盒,我们把包围盒的名称也作为参数传进proc。
定义创建包围盒的proc如下:
/////////////////////////////////////////////////
//created by hmaya at 2006.7
//function: create bounding box for object
/////////////////////////////////////////////////
proc createMyBB(string $object_name, string $BB_name)
{
//创建一个多边形盒子,并命名为temp
polyCube -n temp;
//查询物体的包围盒大小,并将结果存储在$Volume数组中
float $Volume[]=`xform -q -ws -bb $object_name`;
//根据查询到的物体的包围盒的坐标,移动刚才新建的多边形盒子的八个点
//从而使这个盒子的顶点与物体的包围盒重合
move -a $Volume[0] $Volume[1] $Volume[5] temp.vtx[0];
move -a $Volume[3] $Volume[1] $Volume[5] temp.vtx[1];
move -a $Volume[0] $Volume[4] $Volume[5] temp.vtx[2];
move -a $Volume[3] $Volume[4] $Volume[5] temp.vtx[3];
move -a $Volume[0] $Volume[4] $Volume[2] temp.vtx[4];
move -a $Volume[3] $Volume[4] $Volume[2] temp.vtx[5];
move -a $Volume[0] $Volume[1] $Volume[2] temp.vtx[6];
move -a $Volume[3] $Volume[1] $Volume[2] temp.vtx[7];
//将包围盒重命名为$BB_name
rename temp $BB_name;
//选择自建的包围盒
select -cl;
select -r $BB_name;
}
将以上MEL输入脚本编辑器并执行,然后在脚本编辑器中输入以下MEL,即可自由创建包围盒了,如图。
注意这里的trees,oakWhiteMedium1Main2,oakWhiteMedium1Leaf2都是场景中的物体名,而qqm,bb_main,bb_leaf都是自建的包围盒的名称,大家在使用自己的场景测试MEL时,可以根据情况和喜好更改这些名称。
//实例化createMyBB (proc)
createMyBB("trees","qq");
createMyBB("oakWhiteMedium1Main2","bb_main");
createMyBB("oakWhiteMedium1Leaf2","bb_leaf");

图 执行MEL
使用以上MEL得到的包围盒如图。对于场景中的任何物体,只要想为其创建包围盒,只需在命令行输入createMyBB(“XXX”, “XXX”);即可像使用MEL命令一样,迅速为指定物体创建包围盒。

图 执行以上MEL得到的包围盒

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

Maya MEL中 “的用法

Maya MEL中 “的用法
“,Tab键上方的符号键,在MEL中表示:执行“之间的命令,并返回该段命令运行的结果。
使用前面查询物体包围盒大小的MEL命令,笔者来说明“的用法。
在脚本编辑其中输入如下MEL代码,
float $BB[]=`xform -q -bb -ws trees`;
print $BB;
上面MEL的意思是,将查询Bounding Box命令的执行结果存储在一个数组中,并将该数组打印出来,如图,我们看到MAYA打印出了6个浮点数。
所以“有两个功能:
1、 执行“之间的MEL命令;
2、 返回该段命令的运行结果;

图 执行MEL
上面的数组含6个值,分别为XYZ的最大最小值,看起来不是很方便。为了更好的查看物体的大小范围,对数组作简单的运算,即可得到物体在XYZ三个方向的绝对大小,即物体的包围盒的长宽高。所有的MEL代码如下:
float $BB[]=`xform -q -bb -ws trees`;
float $X = $BB[3]-$BB[0];
float $Y = $BB[4]-$BB[1];
float $Z = $BB[5]-$BB[2];
print ( "\n");
print ("X范围: " + $X + "\n");
print ("y范围: " + $Y + "\n");
print ("z范围: " + $Z + "\n");
将上面的MEL输入脚本编辑器,运行结果如图,我们得到了物体包围盒的长宽高。

图 运行结果

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