列出maya中maya硬表面布线类型的种类有哪些

1444人阅读
图形图像(50)
最简单的OGRE(31)
int $num[] = {70,};
int $n = `size($num)`;
for ($i = 0; $i & $n; $i++)
float $p[] = `pointPosition
face_noSeam.vtx[ $num[$i] ]`;
joint -p $p[0] $p[1] $p[2];
这样在Maya中就会显示离散的几个骨骼点,然后先选择所有的单骨骼,再选中模型,执行Skin→Bind Skin→Smooth Bind即可完成骨骼的绑定。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:927009次
积分:9337
积分:9337
排名:第1937名
原创:151篇
转载:165篇
评论:165条
微信公众号中搜索:AR百科,并添加关注。
(1)(1)(5)(1)(7)(5)(1)(1)(3)(3)(1)(3)(1)(1)(1)(3)(1)(3)(1)(1)(4)(1)(2)(7)(1)(1)(8)(9)(4)(10)(15)(8)(6)(9)(9)(25)(16)(64)(14)(9)(30)(16)(3)(1)(1)(1)Ticket01 Contours For Maya|线类制作插件Ticket01
08:48:11&&&由
modxz上传 &&&评论: 点击:
中文名称:线类制作插件Ticket01 Contours
外文名称:Ticket01 Contours For Maya
文件类型:MAYA插件
文件大小:22M
浏览次数: (今日:,本周:,本月:)
最新更新: 17:56:48
相关热词搜索:
下载地址:(网盘能用的只有百度网盘可以使用,其它网盘不能下载的请留言,我们会把数据转回本地地址。如果是本地地址,均可下载。请勿使用迅雷下载)
Ticket01 Contours For Maya 2009 - 2012 x32 / x64|线类制作插件Ticket01 Contours
Ticket01 Contours是渲染线框(平滑)多边形的工具
Ticket01 Contours安装方法:
1. 安装插件(Contours.exe)
2.&从CRACK文件夹拷贝 Contours.mll 到安装文件夹替换&& (例如: C:\Program Files\ticket01\Contours\2012x64\plug-ins)3. 完成
MAYA插件月排行
MAYA插件总排行
爆笑囧图如此...
2014日本AV女...
本周邪恶内涵...
本周内涵囧图欣赏
周末动态趣图...
动态神图带你...
日本女优最怕...
内涵图不断,...
2016年日本AV...
内涵爆笑图吐...
欢迎大家到本站下载喜欢的三维模型,有问题可联系3D模型下载网管理员: 请把#换成@
3D模型下载网所有内容均来自会员上传,使用网站内容时请遵循相关法律法规。如果版权拥有者发现自己作品被侵权,请及时向3D模型下载网提出书面权利通知。3D模型下载网将会依法尽快移除相关涉嫌侵权的内容。MAYA(玛雅)
网&&&&址:
电&&&&话:
800-830-3533
  MAYA(玛雅)是一个来自韩国的专业液晶品牌,在玛雅品牌的背后,蕴含着神秘的文化。玛雅品牌标志中有三根的羽毛,分别是红色、蓝色和绿色。其寓意深刻,红色:象征热情奔放,寓意为对完美的不懈追求;绿色:象征和平与生命,寓意为对环境与健康的爱惜;蓝色:象征希望与梦想,寓意为对科技的不断探索与创新。玛雅经营理念源自四大古代文明之一的玛雅文明,玛雅专注于高性能...
屏幕尺寸:31.5英寸 面板类型:VA 动态对比度:5000万:1 最佳分辨率: 背光类型:LED背光 屏幕比例:16:9(宽屏)
价格:¥1700&&
屏幕尺寸:21.5英寸 面板类型:VA 动态对比度:5000万:1 最佳分辨率: 背光类型:LED背光 屏幕比例:16:9(宽屏)
价格:¥630&&
屏幕尺寸:21.5英寸 面板类型:ADS 动态对比度:5000万:1 最佳分辨率: 背光类型:LED背光 屏幕比例:16:9(宽屏)
价格:¥700&&
屏幕尺寸:21.5英寸 面板类型:VA 动态对比度:5000万:1 最佳分辨率: 背光类型:LED背光 屏幕比例:16:9(宽屏)
价格:¥660&&
屏幕尺寸:23英寸 面板类型:AH-IPS 动态对比度:8000万:1 最佳分辨率: 背光类型:LED背光 屏幕比例:16:9(宽屏)
价格:¥760&&
产品类型:动圈耳机 佩戴方式:入耳式 频响范围:18-22000Hz 产品阻抗:16欧姆 灵敏度:97dB 耳机插头:3.5mm插头
价格:¥99&&
产品类型:耳机 佩戴方式:入耳式 频响范围:18-22000Hz 产品阻抗:16欧姆 灵敏度:92±4dB 耳机插头:3.5mm插头
价格:¥99&&
不知道年底显示器除了什么问题,建议你将文字描述详细些
显示器没坏,液晶刷新率调到60就行了,高了没用,而且很多不支持,如果调到60还不行,检查下你的数据线有没有连接好不行,你加我QQ详细说:
显卡DVI与屏幕兼容性问题,你换个线试试
建议更新bios
美国的牌子,国产货!质量还行吧!效果呢你自己用眼睛看了最清楚了!从数据看,一般
液晶显示器:&&& 耳机:&&&Maya的SurfaceMaterials(表面;Anisotropic:不规则的高光,常用来表现;Blinn:最常用的材质类型,可以模拟金属、陶瓷;HairTubeShader:模拟头发的质感;Lambert:无高光,模拟水泥、砖块、纸张等无;LayeredShader:层材质,可以把其他类;OceanShader:海洋材质,模拟海洋、河水;图4Surfa
Maya的Surface Materials(表面材质)如图4所示。
Anisotropic:不规则的高光,常用来表现光盘、头发、玻璃、丝绸等物体的质感。其高光参数有Angle(角度)、 Spread X/Y(X/Y扩散)、Roughness(粗糙度)、 Fresnel Index(菲涅耳指数)。
Blinn:最常用的材质类型,可以模拟金属、陶瓷等质感。其高光参数有Eccentricity(离心率)、Specular Roll Off(高光溢出)。
Hair Tube Shader:模拟头发的质感。Color Scale(色彩缩放)属性内置了Ramp节点。Hair Tube Shader的高光参数比较多,有Specular Power(高光强度)、Specular Shift(高光偏移)、Scatter(扩散)、Scatter Power(扩散强度)。
Lambert:无高光,模拟水泥、砖块、纸张等无高光、表面粗糙的物体的质感。
Layered Shader:层材质,可以把其他类型的材质球的效果叠加起来,联合表现物体的质感,效果很好,但渲染速度较慢。
Ocean Shader:海洋材质,模拟海洋、河水的材质。Ocean Shader内置了凹凸、波浪、置换等效果,即使是把Ocean Shader赋予一个平面,一样可以很好地表现海水效果。Ocean Shader 在Wave Height(波浪高度)、Wave Turbulence(波浪动荡)、Wave Peaking(波浪起伏)、Environment(环境)属性上内置了Ramp节点。其高光参数有Specularity(高光)、Eccentricity(离心率)。
图4 Surface Materials
Phong:常用来表现塑料等质感。其高光参数为Cosine Power(cos函数的幂)。
PhongE:常用来表现塑料、玻璃等质感,参数比Blinn和Phong更丰富,便于控制,但是PhongE 是Phong材质的简化版,容易引起高光闪烁,不推荐大家频繁使用该材质。其高光参数有Roughness(粗糙度)、Highlight Size(高光点大小)、Whiteness(亮色)。
Ramp Shader:渐变材质,在颜色(Color)、高光色(Specular Color)、反射强度
(Reflectivity)、自发光(Incandescence)、透明(Transparency)、高光溢出(Specular Roll Off)、环境(Environment)等属性上内置了Ramp节点,可以得到极其丰富的效果,SSS、X光等特殊效果的模拟都不在话下。其高光参数有Specularity(高光)、Eccentricity(离心率)。
Shading Map:本身不提供颜色、透明等属性,而接受其他类型的材质,如Blinn、Lambert的属性输入。
Surface Shader:面材质,该材质不能直接表现光影,可以用于输出Alpha通道,或者接受其他材质、纹理节点的输入而表现特殊质感。
Use Backgroud:不提供颜色、高光等属性,常用来单独表现阴影等。
2.1.2 公共属性
这里的表面材质有一些公共的参数。下面简要的介绍一下。
Common Material Attributes(通用材质属性):各类型的材质的通用属性,如图5所示。 图5 材质的通用属性
Color(颜色):可设定材质的颜色,又叫漫反射颜色。
Transparency(透明):设定材质透明属性,Maya的Transparency是通过颜色来设定的。
Ambient Color(环境色):设定材质的环境颜色。使用Ambient Color,可以模拟光能传递效果,而不使用光能传递的渲染器。
Incandescence(自发光):设定材质的自发光属性,Maya的Incandescence是通过颜色来设定的。
Bump Mapping(凹凸贴图):指定凹凸纹理贴图。
Diffuse(漫反射度):设定材质的漫反射度,对于玻璃、金属等物体,我们一般使用较低的Diffuse,而对于木材、水泥等物体,我们一般使用较高的Diffuse。
Translucence(半透明度):设定材质的半透明度,常用于玻璃、水晶等透明材质的表现。
Translucence Depth(半透明深度):设定材质的半透明深度。
Translucence Focus(半透明焦聚):设定材质的半透明焦聚程度。
Specular Shading(高光着色):这里以Blinn材质类型为例,其参数设置如图6所示,来介绍高光的参数,其他类型的材质的高光控制大同小异。
图6 Specular Shading(高光着色)
Eccentricity(离心率):设定高光区域的大小。
Specular Roll Off(高光扩散):设定高光区域的扩散和凝聚。
Specular Color(高光色):设定高光区域的颜色。
Reflectivity(反射率):设定反射率,该参数越大,材质反射能力越强。
Reflectivity Color(反射色):设定反射颜色,Reflectivity Color对于金属、玻璃等材质的表现至关重要,我们常常在Reflectivity Color属性上指定纹理贴图来模拟反射环境。
Special Effects(特效):Maya的Special Effects(特效)是控制物体的辉光效果的,其参数设置如图7所示。
图7 Special Effects(特效)
Hide Source(隐藏源):勾选该项,可平均发射辉光,看不到辉光的源。
Glow Intensity(辉光强度):设定辉光的强度。
Matte Opacity(遮罩不透明度):Matte Opacity的参数设置如图8所示。
图8 Matte Opacity
Matte Opacity Mode(遮罩不透明模式):有Black Hole(黑洞)、Solid Matte(实体遮罩)以及Opacity Gain(不透明放缩)三个选项,其中Black Hole(黑洞)不渲染该材质的物体,并在Alpha通道中留出该物体的洞,且与Matte Opacity参数值无关。在下面笔者给出它们的示意图。
Matte Opacity(遮罩不透明度):设定遮罩的不透明度。该参数值为1时,完全不透明,Alpha通道中不会出现物体的Matte;该参数值为0时,完全透明,Alpha通道中出现物体的Matte。
示例:如图9所示,笔者给出Matte Opacity的各种示意图。
图9 各种Matte Opacity的示意
Raytrace Options(光线追踪选项):使用光线追踪可以根据物理规律计算光线的反射、折射,得到较真实的效果。光线追踪的参数设置如图10所示。
图10 光线追踪的参数设置
Refractions(折射):勾选该项,可打开该材质的折射。但最后我们还要在Render Globals中打开Raytracing(光线追踪),才可以真正得到折射效果。
Refraction Index(折射率):设定材质的折射率,下面给出常见物体的折射率,如图11所示。
图11 常见物体的折射率
Refraction Limit(折射限制):设定折射的次数。
Light Absorbance(光线吸收率):设定光线穿过透明材质后被吸收的量。光线每经过一次折射,都会有一定衰减,衰减的部分可以看成被吸收的部分。
Surface Thickness(表面厚度):模拟表面的厚度,可影响折射效果。
Shadow Attenuation(阴影衰减):表现玻璃等透明物体时,可以设定阴影的衰减,以表现阴影的明暗、焦散等现象。
Chromatic Aberration(色差):打开该项,在光线追踪时,在透明物体间可以通过折射得到丰富的彩色效果。
Reflection Limit(反射限制):设定反射的次数。
Reflection Specularity(镜面反射强度):设定镜面反射的强度,该参数越大,反射效果越强烈。
2.2 Volumetric Materials(体积材质)
Maya的Volumetric Materials(体积材质)如图12所示。
图12 Volumetric Materials
Env Fog:环境雾,可模拟大气效果,为场景添加雾,进行深度暗示,远处的物体模糊,近处的清晰。雾的类型有Simple Fog(简单雾)、Physical Fog(物理雾),其中物理雾下还分为Fog(雾)、Air(空气)、Water(水)、Sun(太阳)四个类型。
Fluid Shape:流体形状,针对流体部分的一个材质,可设定流体的密度、速度、温度、燃料、纹理、着色等。
Light Fog:灯光雾,可以制作灯光雾效,如灯光穿过大气(胶体)形成的通路(如光柱、光线等)。
Particle Cloud:粒子云,当离子的渲染类型选择Cloud(云)时,可以为粒子赋予Particle Cloud材质,可以模拟天空上的云、爆炸时的烟雾等。
Volume Fog:体积雾,主要适用于体积模型,执行菜单命令Create | Volume Primitives | Cube / Sphere / Cone时,Maya会自动为体积模型创建Volume Fog材质。而对于一般模型,赋予Volume Fog是无效的。
Volume Shader:体积着色器,可以接受其他体积材质(如Env Fog、Light Fog、Particle Cloud)的输入,有色彩和透明两个属性。
2.3 Displacement Material(置换材质)
Maya中的Displacement Material(置换材质)如图13所示。
图13 Displacement Material
Displacement:置换,利用纹理贴图来修改模型,改变模型表面的法线,修改模型上控制点的位置,增加模型表面细节。Displacement的效果和Bump(凹凸)的效果有时比较类似,但又有所区别。Bump效果只是模拟凹凸效果,修改模型表面的法线,但不修改模型上顶点的位置。区别Displacement(置换)和Bump(凹凸)的不同,主要是查看模型的边缘是否发生变化。
Displacement的使用方法是直接把纹理贴图用鼠标中键拖曳到相应的Shading Group的Displacement Mat之上,Maya会自动创建Displacement节点。还有一种方法是手动创建Displacement节点,然后把纹理的Out Alpha属性连接到Displacement节点的Displacement属性上,然后再把Displacement节点用鼠标中键拖曳到相应的Shading Group上,或者用鼠标中键拖曳到相应的Surface Material上(如Blinn、Lambert等),在弹出的菜单中选择Displacement Map命令,Maya同样会自动将Displacement节点连接到相应的Shading Group上。
3.Textures(With New Texture Placement)(含有纹理放置的纹理)
Maya的纹理部分含2D Textures(2D纹理)、3D Textures(3D纹理)、Env Textures(环境纹理)、Layered Textures(层纹理)。而如果从另一个角度来看待这些纹理,笔者认为主要就是两大类,贴图纹理(Map Texture)和程序纹理(Procedural Texture)。所谓贴图纹理就是调用硬盘上的位图,如果是多边形,需要配合UV来定位贴图在模型表面的位置。而程序纹理,则是根据模型表面参数空间的UV编写的一些程序,这些纹理是Maya内置的函数,代码实现,不需要额外的贴图等,如常见Marble(大理石)、Checker(棋盘格)等,都是很经典的
程序纹理,读者有兴趣想要了解这些程序纹理实现的算法和源代码,可以参考相应的图形学书籍,一个简单的办法是看看Render Man中是如何实现的,在《Renderman Companion》一书中给出了常见的程序纹理的算法和代码。当然,读者有计算机背景的话,还可以根据工作需要,自己编写自己的程序纹理,这样就可以拓展Maya的渲染功能,而不仅仅局限于Maya现有的渲染节点。
3.1 2D Textures(2D纹理)
如图14所示,2D纹理有三种方式,分别为Normal(普通)、As Projection(投影)、As Stencil(标签)。
图14 2D Textures
其中大多数时候我们都用Normal(普通)模式,尤其是对于已经分配好UV的多边形,要使用Normal(普通)模式。
而As Projection(投影)模式常常用于NURBS类型的模型,使用As Projection(投影)可以在NURBS表面上定位贴图的位置,因为对于NURBS曲面来说,没有UV点,不像多边形那样可以自由分配和编辑UV。
As Stencil(标签)模式,顾名思义,常常用来制作标签之类的纹理,就是需要只在表面的一部分应用某纹理时,可以使用As Stencil(标签)模式。而默认的Normal(普通)模式,会将纹理自动填充整个表面。
3.1.1 2D纹理节点
下面一一介绍2D纹理节点。
Bulge:凸出,可以通过U Width和V Width来控制黑白间隙,Bulge常常用来做凹凸(Bump)纹理。
Checker:棋盘格,黑白方格交错排布,可以通过Color1、Color2调整两种方格的颜色,而Contrast(对比度)可以调整两种颜色的对比度。我们常常使用Checker纹理来检查多边形的UV分布,也可以根据工作的需要,将其他纹理连接到Color1、Color2属性上。
Cloth:布料,三种颜色交错分布,可模拟编织物、布料等纹理,Gap Color、U Color、V Color分别控制色彩,U Width、V Width控制布料纤维的疏密和间隙,U Wave和 V Wave控制布料纤维的扭曲,Randomness控制布料纹理的随机度,Width Spread控制纤维宽度的扩散,Bright Spread控制色彩明度的扩散。
File:文件,可以读取硬盘中的图片文件,作为贴图使用到模型上。选择合适的Filter Type(过滤类型),可以消除使用图片时的锯齿,Maya的Filter Type(过滤类型)有Off、Mipmap、Box、Quadratic、Quartic、Gaussian,配合Pre Filter(预过滤)和Pre Filter Radius
(预过滤半径)可以获得较好的反锯齿效果。如果要使用序列图像,可以勾选Use Image Sequence(使用序列图片)。
Fluid Texture 2D:2D流体纹理,可模拟2D流体的纹理,设定2D流体的密度、速度、温度、燃料、纹理、着色等。
Fractal:分形,黑白相间的不规则纹理,可以模拟岩石表面、墙壁、地面等随机纹理,也可以用来做凹凸纹理。 可以通过Amplitude(振幅)、Threshold(阀值)、Ratio(比率)、 Frequency Ratio(频率比)、Level(级别)等控制分形纹理,而勾选Animated(动画)还可以动画纹理,使其随时间的不同而变化。
Grid:网格,可以使用Grid纹理模拟格子状纹理,如纱窗、砖墙等等,使用Line Color(线颜色)和Filler Color(填充颜色)可以控制网格的颜色,而使用U Width和V Width可以控制网格的宽度,使用Contrast(对比度)可以调整网格色彩的对比度。Maya默认Line Color(线颜色)为白色,Filler Color(填充颜色)为黑色,如果设定Line Color(线颜色)为黑色,Filler Color(填充颜色)为白色,并把Grid纹理作为透明纹理连接到材质球上,则可以
很轻松的渲染得到物体的线框。
Mountain:山脉,可以模拟山峰表面的纹理,Mountain纹理含有两种色彩,分别是Snow Color(雪色)和 Rock Color(岩石色),可以模拟山峰上带有积雪的效果,但改变Snow Color(雪色)和 Rock Color(岩石色),并配合Amplitude(振幅)、Snow Roughness(雪的粗糙度)、Rock Roughness(岩石的粗糙度)、Boundary(边界)、Snow Altitude(雪的海拔)、Snow Dropoff(雪的衰减)、Snow Slope(雪的倾斜)、Depth Max(最大深度),可以得到丰富的随机纹理。
Movie:电影,Movie节点可以将磁盘上的视频文件导入Maya中,作为纹理或背景使用。与File(文件)节点类似,我们使用File(文件)节点也可以导入一系列连续的序列图作为纹理,效果和Movie节点类似,但Movie节点可以接受视频格式的文件,如MPEG,而不仅仅局限于图片格式。
Noise:噪波,使用Noise函数生成的程序纹理,Noise与Fractal节点类似,也是黑白相间的不规则纹理,但随机的方式有所不同。可通过Threshold(阀值)、Amplitude(振幅)、Ratio(比率)、Frequency Ratio(频率比)、Depth Max(最大深度)、Inflection(变形)、Time(时间)、Frequency(频率)、Implode(爆炸)、Implode Center(爆炸中心)等参数来控制Noise纹理的效果, Noise type(类型)有Perlin Noise、Billow、Wave、Wispy、Space Time。
Ocean:海洋,与Ocean Shader类似,可表现海水的纹理,并在Wave Height(波浪高度)、Wave Turbulence(波浪动荡)、Wave Peaking(波浪起伏)属性上内置了Ramp节点。而对于海水的一般属性可以调整Scale(缩放)、Time(时间)、Wind UV(风 U/V)、Observer Speed(观测速度)、Num Frequencies(频率数目)、Wave Dir Spread(波浪方向扩散)、Wave Length Min(最小波长)、Wave Length Max(最大波长)。值得说明的是Ocean纹理不同于Ocean Shader,Ocean Shader是一个光照模型,包含高光、环境、折射、反射等,而这里的Ocean节点仅仅是作为纹理出现。
PSD File:PSD文件, Photoshop格式的文件,可以很好地利用Photoshop的图层和Maya进行交互。其参数属性和File节点很类似。
Ramp:渐变,Ramp纹理的Type(类型)有V Ramp(V向渐变)、U Ramp(U向渐变)、Diagonal Ramp(对角渐变)、Radial Ramp(辐射渐变)、Circular Ramp(环形渐变)、Box Ramp(方盒渐变)、UV Ramp(UV渐变)、Four Corner Ramp(四角渐变)、Tartan Ramp(格子渐变),Interpolation(插值)方式有 None(无)、Linear(线形)、Exponential Up(指数上升)、Exponential Down(指数下降)、Smooth(光滑)、Bump(凹凸)、Spike
(带式)。使用Selected Color(所选颜色)和Selected Position(所选位置)可以编辑渐变色彩和位置,而U Wave(U向波纹)、V Wave(V向波纹)、Noise(澡波)、Noise Freq(澡波频率)可以随机化渐变纹理。而HSV Color Noise(HSV色彩澡波)可以控制渐变色彩的随机,其参数有Hue Noise(色相澡波)、Sat Noise(饱和度澡波)、Val Noise(明度澡波)、Hue Noise Freq(色相澡波频率)、Sat Noise Freq(饱和度澡波频率)、Val Noise Freq(明度澡波频率)。
Water:水波,可以表现水波等纹理,使用Number Of Waves(波纹数目)、Wave Time(波纹时间)、Wave Velocity(波纹速度)、Wave Amplitude(波纹振幅)、Wave Frequency(波纹频率)、Sub Wave Frequency(次波纹频率)、Smoothness(光滑度)、Wind UV(风向 UV)来控制波纹纹理, 而Concentric Ripple Attributes(同心波纹属性)可以控制同心波纹的属性。
3.1.2 公共属性
2D Textures(2D纹理)都有如下的公共属性。
Color Balance(色彩平衡):可以整体调整纹理的色彩,如果是贴图,则不会改变贴图本
三亿文库包含各类专业文献、外语学习资料、专业论文、文学作品欣赏、行业资料、应用写作文书、幼儿教育、小学教育、生活休闲娱乐、中学教育、35MAYA表面材质等内容。 
 maya材质和贴图_IT/计算机_专业资料。maya材质和贴图介绍 材质和贴图 第一节 ...在 Materials 选项中, 有 3 种类型的材质:Surface Materials(表面材质) 、...  Maya 材质与纹理的区别 首先,大家要了解材质,材质是指某个表面的最基础的材料,如木质、塑料、金属或者玻璃 等 纹理其实就是附着在材质之上,比如,生锈的钢板,满...  教程再作分析,以下是有关 Maya 包含材质的说明: Surface(表面材质) Anisotropic(各向异性) 用于具有微细凹槽的表面的模型, 镜面高亮与凹槽的方向接近于垂直的表面...  Maya材质球及属性详解_IT/计算机_专业资料。Maya教程 Maya 材质球及属性详解中...Common Material Attributes(公共材质属性) Color(色彩):物体表面的基本颜色,即固有...  以下是有关 Maya 包含材质的说明: 教程再作分析 Surface(表面材质) Surface(表面材质) Anisotropic(各向异性) Anisotropic(各向异性) 用于具有微细凹槽的表面的模型...  以灯光为基准与哪些物体链接 以物体为基准与哪些灯光链接 节点是 maya 最小单位...Bump Mapping 凹凸贴图(物体表面粗糙程度) Diffuse 漫反射(材质亮度的大小)黑色...  教程再作分析,以下是有关 Maya 包含材质的说明: Surface(表面材质) Anisotropic(各向异性) 用于具有微细凹槽的表面的模型, 镜面高亮与凹槽的方向接近于垂直的表面...  图 2 Maya 中的渲染节点 2.Materials(With Shading Group)(含有着色组的材质) Shading Group 含三种类型的材质:Surface Material(表面材质),Volume Material(体 ...  MAYA 教你制作 x 光显微镜下的材质 01 通过一个电子显微镜得到的照片物体在面对摄像时趋向有一个黑色的外观,, 并且与摄像 机垂直的表面有一发光的部分 下载 (8...Maya中Python普及教程
大家好,这是一个简易的MAYA PYTHON学习教程。简易教程的目的是可以让更多的人快速掌握这些知识,而不是拘泥于理论的研究。最好的学习方式无疑是实践,我会提供简单实用的代码来帮助学习者了解脚本的实际运用。如果你是初学MAYA
PYTHON,特别是非程序员的初学者,不妨先看一下下面的内容,以帮助你对MAYA PYTHON有一个大致的了解。为什么要学习简易教程?简易教程的特点就是尽可能做到简单,容易理解。我的文档会涉及到尽可能多的内容,但不会说的很深。因为很多复杂的应用往往是许多简单部分的组合,学会如何组合是更重要的事情:)另外,任何学习都需要一个很好的getting
started,好的入门,往往决定今后深入学习的质量。万事开头难,但是一个好的开始,就是成功的一半。希望我的简易教程可以带大家进入MAYA
PYTHON的大门。这个文档的适用人群是哪些?
·具有一定MAYA操作经验,但无编写脚本经验的用户
·具有一定MEL基础的用户
·始终徘徊在MAYA脚本门口,但找不到切入点的初级用户什么是MAYA
PYTHON?简单来说,MAYA PYTHON就是用PYTHON语言包裹起来的MEL命令。什么是PYTHON?
PYTHON是一门简单易学,但功能又非常强大的编程语言。(我会在下一篇中提供简单实用的PYTHON入门教程)
为什么要学习MAYA PYTHON?大幅度地提高工作效率挖掘MAYA隐藏功能,更全面地掌握MAYA快速开发脚本插件如何学习MAYA PYTHON?最好的方法是学习别人写的源代码。而最好的代码资源其实就在你的电脑里:你的MAYA帮助文档。如果你有良好的英语阅读能力,这样你可以充分理解帮助文档里所说的内容。但是如果英语能力不是很理想的朋友也千万不要着急,我的文档会帮助你学习MAYA
PYTHON。另外,MAYA的帮助文档中的脚本部分对每条命令的参数以及每个节点的属性解释的都非常详细,个人认为,学会使用MAYA的帮助文档是学习PYTHON脚本的制胜法宝。
---第一篇完---
- PYTHON&(点击标题阅读全文)如果你是PYTHON高手,可以跳过这篇:)因为节下来我要讲述PYTHON的基本应用。由于我的PYTHON教程主要是针对MAYA的应用,所以PYTHON基本应用的介绍主要会涵盖MAYA环境中经常会使用到的PYTHON功能。学习过程中,尽量运用已学到的知识自己也试着编写一些代码,发挥主观能动性。这样学习,效果会十分显著。该篇主要含盖以下内容:
2.1 脚本编辑器(Script Editor)
2.2 PYTHON常用数据类型和操作符
2.3 流程语句
2.4 定义函数
2.5 常用模块
2.1 脚本编辑器(Script Editor)
MAYA界面中有2处地方可以编辑PYTHON脚本,一处是左下角的快速命令行,这个命令行可以在PYTHON和MEL间快速切换,如下图:
一处是右下角的Script Editor按钮,点开窗口如下:
我们的PYTHON代码就是写在PYTHON选项卡中,如果PYTHON脚本在MEL选项卡中执行将会出错,vice versa。我们在MAYA中执行的操作会通过MEL语言打印在上面灰色区域,也就是输出区域。这些MEL语言都可以非常快地转化成PYTHON代码。这个数据输出区域同时也会打印PYTOHN脚本的执行结果以及出错信息。现在我们来执行一条简单的PYTHON语句,来一个初体验:PYTHON页面中输入print "hello maya",然后按数字键盘上的小回车(注意:小回车是执行代码,大回车是换行)。我们看到输出区域的打印结果如下:
print "hello! My name is Hu
hello! My name is Hu Yongbin第一行是告诉用户,你执行了print "hello! My name is Hu
Yongbin"这条命令,第二行hello! My name is Hu
Yongbin是执行这条命令的结果,这里的执行结果就是:hello! My name is Hu
Yongbin被打印出来了。命令执行成功。但是我们发觉PYTHON页面里的代码也消失了。如果需要反复执行代码,可以选中需要执行的代码,然后按小回车,这样,我们可以在执行代码的同时保留页面里的代码。(建议使用第二种方法执行代码)
接下来,再举个简单的例子来说明输出窗口中的报错信息。随意在命令行中输入一些字母HuYongbin,然后执行,出现如下信息:
# Error: NameEror: name 'HuYongbin' is not defined #这是个简单的报错信息,说明HuYongbin没有被定义,电脑无法识辨。这条命令是无效的。最后就是#符号,#后的所有的代码(换行前)都被看作注释,不参与运算。例如:
# print "hellomaya" : )虽然也是print命令,但是前面有#,所以无视。现在我们终于知道如何在PYTHON中执行代码,以及辨别代码是否有效。在下面的教程中,我将会用一些简单的实例来展示PYTHON的常用功能!
2.2 PYTHON常用数据类型和操作符数据类型就是数据的类型- -U,就是不同类型的数据,数据类型包括:整型,浮点,字符,列表,元组,字典。
整型(INT)就是整数,比如:1,3,21,1000……浮点(FLOAT)就是带小数点的数字,比如:1.12,4.5……字符(STRING)就是文字,需要用单或双引号,比如:"HuYongbin","12","3.1415","#_%)"列表(LIST)就是一系列数据的组合,用中括号,比如:[2,3],["tom","jerry"],["marry",14]元组(TUPLE)用小括号,和列表的区别是他是不可变的:(2,3),("tom","jerry"),("marry",14)操作符,形象的说就是用来操作数据的工具,包括数学操作符,比较操作符,逻辑操作符。
数学操作符:+(加) -(减) *(乘) /(除)%(取除法余数)**(乘方)比较操作符:&&/span&(小于)&=(小于等于)&(大于)&=(大于等于)==(等于)!=(不等于)逻辑操作符:and or not下面来做一些热身,在实际运用中体会不同数据类型之间的配合!
2.2.1 整数
a=1 # 定义变量a, 把整数1赋予给a
b=3 # 定义变量b, 把整数3赋予给b
a+b运行结果为3,其他整数小数的加减乘除这里就不熬述了~
2.2.2 字符
name1="tom" # 定义变量name1,把字符tom赋予给name1,注意双引号
name2='jerry' # 定义变量name2,把字符jerry赋予给name2,注意这里是单引号,都可以表示
name1+name2运行结果为"tomjerry",这里说明字符之间可以相加。但是不同数据类型之间不可以相加,变量a和变量name1就不可以相加,因为一个是整数,一个是字符。字符单引号和双引号的不同用法我会再之后的实例中写出。
2.2.3 列表
list1=[1,2,3]
# 定义列表list1,包含3个整型数字
list2=["cube","sphere","plane"] #定义列表list2,包含3个字符
list=list1+list2 # 把list1和list2的相加结果赋予新的变量list
print list运行结果为[1,2,3,"cube","sphere","plane"],可见,包含不同数据类型的列表之间可以相加
我们可以对列表中的数据进行访问操作。执行以下命令:
list[0]+list[2]运行结果为4,因为list[0]指的是list列表中的第一项,list[2]指的是list列表中的第3项。(注意,PYTHON数数是用0开始的),依次类推,list[4]指的就是"sphere"。
list[3]*list[1]运行结果为"cubecube",其效果等同于"cube"*2,可见,字符和整数间,可以做乘法运算。同样,如果"c"*5的运算结果就是"ccccc"。
user1=["tom","cat"]
user2=["jerry","mouse"]
userInfo=[user1,user2] # 定义列表userInfo,该列表内又嵌套了2个列表
print userInfo # 打印userInfo运行结果为[
["tom","cat"],["jerry","mouse"] ],我们看到大列表中包含了2个小列表我们同样可以访问嵌套列表:
userInfo[0]表示userInfo中的第一个列表user1,userInfo[0][1]表示user1中的第2个值"cat"。同样,如果要访问"jerry",你可以通过userInfo[1][0]来访问。我们还可以对列表里的内容进行添加或移除:
userInfo.append(["jack","male"])这样我们再次打印userInfo的时候,得到的结果应该为[ ["tom","cat"],["jerry","mouse"],["jack","male"] ]
userInfo.remove(["tom","cat"])
这样我们再次打印userInfo的时候,得到的结果应该为[ ["jerry","mouse"],["jack","male"] ]列表和字符还可以访问其区间的数据:
a=[1,2,3,4,5,6,7,8] #
b="abcdefg" # 定义字符b
a[3:5] # 返回的值是[4,5,6],是列表a的第4位到第6位
b[1:4] # 返回的值是"bcde"
a[3:] # 返回的值[4,5,6,7,8],从第4位一直到结尾
b[:-4] # 返回的值是"abc",从第1位到倒数第4位
2.2.4 常用工具接下来,我给大家介绍一些不同数据类型中的常用工具!
2.2.4.1 +=操作符号
a+=1 # 等同于a=a+1运行结果为2,因为a=1,a+1等于2,然后把2这个数字赋予给原来的a,这样,2就替换掉原来的1了,a就等于2
2.2.4.2 pow()乘方命令
x=pow(4,3) # 就是4的3次方
y=pow(4,-2) # 也就开根号
2.2.4.3 len()获取长度命令
len()命令能够返回字符和列表的长度,如下:
len("tommy") # 返回结果是5
len([1,2,6]) # 返回结果是3
len([[1,2,7],["lock","jack"],["bach","davinci","vivaldi"]])
# 返回结果为3,因为里面包含3个列表
2.2.4.4 int()str()数据类型转换命令
int()的str()是字符和整数转换的命令,非常实用:
b=int("256") # 把字符"256"转换成整数256
a-b # 运行结果为0
d=str(2011) # 把整数2011转换成字符"2011"
c+d # 运行结果是"maya2011"
2.2.4.5 max()min()最大值最小值命令
max()和min()可以用来比较数字的大小:
max(1,7) # 结果为7,两个取大的值
min(3,6) # 结果为3,两个取小的值
2.3 流程语句
2.3.1 if语句
if就是如果的意思,是条件判断语句的关键词,一般可以和elif或else语句结合使用。接下来我会用一些简单实用的例子来说明if语句的用法:
age=17 # 定义age等于17
if age&18: # 假设第一种情况,注意要用冒号
print "you are not adult" #
注意代码缩进
else: # 假设第二种情况,注意冒号
print "you are
这里的运行结果是"you are nod adult",因为假设第一种情况是成立的。这里提一提代码缩进,缩进就相当于写作文时每小节开头要空2字;代码缩进,就是指被缩进的代码是上一行代码的子代码。
name="tom" # 定义name变量
if name=="tom": # 注意这里是"==",不是"="
"Hello,tom"
运行结果是打印"Hello,tom"。"=="和"="的区别是:"="相当于是个动词,把"tom"这个字符值传递给变量name;"=="表示一种状态。if name=="tom"这句话翻译成人类的语言就是:假设name的值等于"tom"这个状态是成立的。(一旦成立就执行后面的语句……)
if a&1: # 假设1
elif a==1: # 这里出现了假设2
else: # 如果两种假设都不成立的话……就执行下面的语句
运行结果是"a&1"。很显然,a不小于1,也不等于1,那就只有执行else后面的语句了。
2.3.2 for循环语句
for语句的操作对象一般是一个序列,对序列中的每一个成员进行操作,举例:
seq=[1,2,3] # 定义一个列表
for i in seq: # for即将对列表seq中的每个成员进行操作,成员我们用i来代替(这里成员变量可以自定义)
print i+1 # 操作的内容:给每个成员+1
执行结果如下:
4我们给每个成员都+1了说到for循环语句,我们不得不提一下range()内置函数。range()可以针对数字提供一个序列范围:
range(10)运行结果就是:[0,1,2,3,4,5,6,7,8,9]
range(5,10)运行结果就是:[5,6,7,8,9]
range(0,10,2)运行结果就是:[0,2,4,6,8]结合for语句,我们可以尝试执行以下代码:
x=["a","b","c","d","e","f","g","h"]
for i in range(0,10,2): # 操作范围:[0,2,4,6,8]
print x[i] # i 将会被[0,2,4,6,8]中的每一项依次替代,替代后再执行print语句。
运行结果:
2.4 定义函数在PYTHON中,我们可以自己定义一个函数,定义函数的命令是def,如下:
MyFirstFunction():
print "this is
my first function"
这里我们用def命令定义了一个函数名字叫MyFirstFunction,后面括号里面是用来填写参数的,如果没参数,就留空。定义函数内的代码需要缩进。如果要执行函数,操作如下:
MyFirstFunction() #
这样输入,就可以执行函数,函数内的所有命令都会被执行执行后,结果会打印"this is my first
function",说明定义函数内的代码被正确执行了。函数还有一种定义方式,就是在括号里加上一些参数:
def MySecondFunc(a, b): #
该函数包含了a和b两个参数
然后我们来执行这个函数:
MySecondFunc(2, 5) #
把2和5分别代入a和b,然后执行,函数内的print命令会被执行。运行结果为7
MySecondFunc("first","second")
运行结果为"firstsecond",两个字符串被相加了。函数还可以签套函数,如下:
定义好func1和func2后,执行func2(),结果为:
1因为func2先执行打印b,在执行func1,func1会打印a
2.5 常用模块简单说,模块就是一个打包的命令集合,以文件的形式存在。模块的使用方法是"导入"。我们直接针对MAYA
PYTHON的模块来具个简单的例子吧。
2.5.1 maya模块
import maya.cmds #
导入maya模块中的cmds命令集这样,我们就在MAYA中导入了cmds命令集,里面包含了所有可以在PYTHON环境中使用的MAYA命令。现在我们来初试这个cmds命令集
import maya.cmds #
maya.cmds.polyCube() # 调用模块中的polyCube()命令。发觉场景里生成了一个方块,命令执行成功。但是这样打命令太长了,我们在导入maya.cmds时加上:
import maya.cmds as mc这样maya.cmds就作为mc导入了,我们就不用再打长长的maya.cmds了。我们再创建一个Cube:
mc.polyCube()短很多了吧。接下来介绍几个常用的模块:
import maya.mel #
导入这个,可以调用所有的mel命令
2.5.2 os模块
import os&
os模块也是用的比较多的。我经常会使用os.system(),括号中间可以写一些DOS命令:
os.system("md
c:\\MyFolder")&这样就可以用PYTHON来调用DOS命令了。
os.listdir("C:\\")
listdir可以以列表的形式列出路径中的所有的文件和文件夹(注意:是列表的形式,像这样:['a.py',
'AUTOEXEC.BAT', 'boot.ini'])。接下来再介绍一个re模块,我经常用它来做字符的切割工具:
2.5.3 re模块
a="Hello_World"
re.split("_",a) # split就是切割工具,有2个参数 ,"_"就是切割的根据,a是我们定义的变量返回结果是一个列表,["Hello","World"],还有个是替换命令re.sub():
a="my4name4is4HuYongbin"
re.sub("4","_",a) # 就是说把4替换成"_"输出结果:"my_name_is_HuYongbin"
2.5.4 time模块
import time # 时间模块
time.ctime()执行结果:# Result : Fri
Jun 11 22:52:16 2010 # 。也就是当前的时间。
OK,PYTHON简易教程就写到这里,简易教程的内容肯定不是很完整,这里只是罗列出一些实战中比较常用的功能。(也是我比较常用的)初学者可以抛弃理论,先玩起来再说。实践太重要了。在下一篇中,我们将正式进入MAYA
PYTHON实际应用。
---第二篇完---
- 实战演习&(点击标题阅读全文)在上一篇中,我主要介绍PYTHON的一些基础知识以及常用语法。在这一篇中,我们要结合MAYA中的命令来编写一些基本PYTHON脚本。其实在上一篇接近尾声的时候,我已经举例了如何导入模块的方法,这是真正使用PYTHON在MAYA中编写脚本的第一步。
import maya.cmds as mc #
这里应该不用解释了吧,有疑问可以看第二篇的结尾"模块"部分。:)这里顺便提一提,as mc可以用任何名词来代替,as cc也可以。这样,如果要调用polyCube()命令的话,就必须有cc.polyCube()作为前缀。基于笔者的个人习惯,我们这里还是用mc
3.1 MEL命令和PYTHON命令之间的转化我们导入MAYA的模块,现在要运用模块中的命令编写一些东西了。但是大家可能会很疑惑,写什么呢?我们总不见得整天在MAYA里做小学数学题吧-
-现在我们需要学习一些MAYA的实用命令(比如上一篇提到的polyCube()创建一个立方体),学习实用命令的最好的途径是通过执行手动操作命令来获取MEL命令语句,然后把MEL命令转换成PYTHON命令。比如我们在MAYA3D视图中用传统的方法建立一个polygon的立方体,我会在脚本编辑器的输出部分得到以下输出信息:
polyCube -ch on -o on -w 9.9 -h 7.1 -d 10
-cuv 4; //注意大小写这是一句MEL命令,描述了如何创建一个Polycube。MEL命令的结构十分简单,开头的polyCube就是这句MEL命令的主命令,后面的部分全部是参数。其中,带"-"的,是参数名称;没有"-"的,是该参数的值。一般都是一个带"-"号的参数名称,后面再跟一个不带"-"的值。有时后面会不跟值,这说明这个参数不需要值,它只是一个开关,带这个参数,说明这个开关开着,不带说明关着。现在,我们就把这句MEL命令转换成PYTHON可以执行的命令(我们暂时不去理会具体参数的作用,只是学习一个转换过程):
mc.polyCube(ch=1, o=1, w=9.9, h=7.1,
d=10, cuv=4)执行代码后同样得到了一个立方体。我们对比一下,可以发现PYTHON可以完全把MEL的命令转化过来,只是格式不一样。格式不同体现在一下几点:
·有mc前缀(MEL没有前缀)
·所有的参数信息需要放在主命令后的括号中(MEL没有括号)
·参数名和它的值之间用等号隔开(MEL是用空格)
·每个参数之间用逗号隔开(MEL用空格)
·有些参数的值是1,而ME是on关于最后一条,其实MEL的on也可以写成1,原因是,在PYTHON(包括其他程序语言),1这个值往往表示True,on等肯定意义的值,而0则表示False, off等否定意义的值。这样的值叫做布尔值(boolean),这种数据类型只有2种答案要么1,要么0;要么真,要么假;要么ON,要么OFF。例子中的1就是on,说明这个参数是可用的。关于布尔值(其实你在MAYA中也可以把它理解成一个开关),以后还会讲到它的用法。节下来我们举一反三,熟练掌握MAYA命令转换的方法。
拖一个球出来,得到以下命令:
polySphere -ch on -o on -r 3;转成PYTHON代码,就是:
mc.polySphere(ch=1, o=1, r=3)还有一中转化形式:我们如果在场景中选择了pCube1这个物体,会得到以下MEL命令:
select -r pCube1;这里我们就不能写成mc.select(r=pCube1)了,因为现在这个命令基本上属于一个动作,一个动词,既然是动词,就必须有一个动作施与的对象,这里这个对象就是pCube1,而r这个参数其实replace的简写。注意这个r不是布尔值,它没有任何数据类型,只是一个开关而已。在MEL中,这个开关是不需要值的,但在PYTHON中,需要像布尔值那样给一个1的值,表示这个开关开启:
mc.select("pCube1", r=1) #
注意:PYTHON中,选择对象放在最前面。
# 注意名字的数据类型是字符,所以必须有双引号如果要同时选择pCube1和pSphere1的话,需要用到列表,如下:
mc.select(["pCube1","pSphere"])
# 注意如果是选择集合的话,要用列表来表示
# r参数在这里我就不加了,但是不影响执行,体会下"可选"的作用
3.2 读取场景中信息的常用命令:刚才我们知道了一些如何创建物体,以及如何选择物体的PYTHON命令。下面咱们要学习如何准确获取场景中你想要得到的信息,对于即将要编写的代码而言是十分重要的。比如,你要用命令对"所选的顶点"进行操作,那你就必须先要得到这些顶点信息,比如,这些点的ID号是那些?同样,如果要对"所选的MESH"进行操作,那你至少得让MAYA知道是哪些MESH。
3.2.1 得到所选物体的名字列表那我们先来得到所选择的物体信息吧,这里用到一个新的命令ls(我这里提到命令绝对是常用的):
mc.select(["pCube1","pSphere"])
# 选择场景中的两个物体
mc.ls(sl=1) # ls就是list的简写,我们要list一些信息
# sl=1表示,我们要列出sl(select)的信息,"=1"就是一个开关,我们打开了它。执行后,我们会从输出框中得到一个列表:["pCube1","pSphere"]。假如我们把第2行命令的结果赋予一个变量,那这个变量将继承这个命令执行的结果,如下:
sel=mc.ls(sl=1)
print sel我们同样会得到["pCube1","pSphere"]这个结果,并且我们保存了这个列表结果到sel变量中去。假如你选择了N个物体,那你执行这句命令后会得到N个物体的列表。
3.2.1 得到和设置物体的属性getAttr()和setAttr()下面再介绍2个非常有用的命令,getAttr()和setAttr()。前面那个是得到节点属性,后面那个是设置节点属性。我们同样可以借助MEL命令来获取一些命令信息。
3.2.1.1 setAttr()我们选中刚才创建的pCube1,然后Ctrl+A打开属性窗口,找到pCube1节点中的Transform Attributes栏,我们把Translate行中的第一个值打成0,回车。现在我们在输出窗口中得到了一条MEL命令:
setAttr "pCube1.translateX"
"pCube1.translateX"就是表示这个节点的TranslateX参数,后面的0表示它的值。这样我们也就可以把它转成PYTHON可以用的命令:
mc.setAttr("pCube1.translateX", 4)
# 现学现用,我们把这个值再改成4在PYTHON面板中执行后,发觉Translate行中的第一个值神奇地变成了4。同样,视图中的立方体也沿X轴平移了4个单位。同理,我们可以通过改变其他参数来获取其动作的MEL命令,然后把它转换成PYTHON可以用的命令。
3.2.1.2 getAttr()下面,我给出如果获取属性值的命令:
mc.getAttr("pCube1.translateX")
# 获取,pCube1的translateX参数的值。执行后,我们得到4,也就是前面我们所设的那个数。同样,我们可以把这个值赋给一个变量:
a = mc.getAttr("pCube1.translateX")
print a打印a的结果就是mc.getAttr("pCube1.translateX")的结果。
3.2.1.3 询问开关q还有一种查寻其属性的方式,就是利用询问参数q。这里我们以xform命令来举例,如下:
mc.select("pCube1")
mc.xform(q=1, translation=1)&执行结果,返回一个包含了pCube1的XYZ位置信息的列表。我们看到xform命令的参数表中有2个参数,一个是q,一个是translation。其中,q=1表示当前这个命令已经进入询问状态,改命令不会对所选的物体进行任何操作,只会询问;translation=1,表示我们要询问的参数是translation,"=1"相当于一个开关,说明我们要询问这个"=1"的参数值。假如,我们的命令是mc.xform(q=1,
translation=1, rotation=1),这样会出错,因为询问状态下,只返回一个参数的值。相反,如果
mc.xform(q=1, translation=1,
rotation=0),也就是把rotation改成0,返回结果仍然会正确。
3.3 帮助文档的使用(灰常重要!)
有的人可能回问:我如何才可以知道,一个操作命令有多少个参数可以使用?一个节点到底有多少个属性可以设置?接下来我会给大家介绍下MAYA帮助文档的使用方式。
按F1打开MAYA帮助文档。在Content中找到Technical Documentation(技术文档),在这个技术文档中,我们需要用到的,就是CommandsPython和Nodes。CommandsPython中包含了所有MAYA中的PYTHON命令以及其参数的使用方法;Nodes列出了MAYA中所有的节点以及其属性的用法。现在我们列举一个xform命令来了解如何结合帮助文档来完成你的操作
3.3.1 Python命令点CommandsPython进入页面,在By substring中输入xform命令,在下面出现的SubString列表中选择xform,我们就可以进入xform命令页面。我们把该页面往下拖,跳过Notes,Related的内容,在Flags下有个长长表格,表格由3列组成:Long name(short name)长名(缩写),
Argument types(数据类型),
Properties(属性)。长名(缩写)的意思就是:比如mc.xform(q=1, translation=1)
这条语句中translation是一个参数,我们可以在Flags下的列表中找到这个参数,我们观察它的长名(缩写)一列,translation后有一个(t),这个(t)就是他的缩写,我们可以用缩写来替代长名,如:mc.xform(q=1, t=1),效果完全一样。数据类型就是这个参数所支持的数据类型,如果它的数据类型是Int的话,说明它只能支持整数,你只能把整数作为它的参数,或者在询问时只能得到整数的输出。同样如果是个boolean值的话,它只能支持0或1。
属性指的是这个参数的性能。这里的性能有4种,在MAYA帮助文档中用这4个字母表示:&&&。其中C表示这个参数可以在该命令执行操作的时候使用;Q表示这个参数可以在询问状态下使用;E表示这个参数可以在编辑状态下使用;M表示这个参数可以拥有多种数据类型。一般情况下,C
Q E用得最多。比如:mc.xform(q=1, t=1)这句命令就是典型的询问状态Q,询问内容是t,也就是translation。
3.3.2 Nodes信息现在我们进入Nodes页面来了解下如何使用MAYA节点中的属性。
Nodes页面中所罗列出来的其实是MAYA中的所有节点类型。MAYA中充满着节点,我们任意选种场景中的某个节点,它都是属于某个Nodes页面中所罗列出来的类型。比如,我们选择之前在场景里创建的pCube1,它是属于什么类型的节点?是pCube节点吗?不是,我们无法在Nodes页面中搜索到。我们可以通过以下命令来询问节点的类型:
mc.objectType("pCube1") #
objectType命令可以得到节点类型,实用推荐!执行后,得到结果:transform。说明pCube1这个节点是transform节点。同样,我们询问:
mc.objectType("pSphere")执行后,同样得到结果:transform。所以,虽然pCube1和pSphere节点名称不同,但是他们都是属于transform节点,千万不要认为他们是pCube类型或pSphere节点类型。得到节点类型后,我们到Nodes页面,输入transform。找到transform,点入。找到Attributes下的长长列表。我们可以看到transform中有的参数。这些参数都可以通过getAttr()和setAttr()来获取和设置。我们来做下测试吧:)
mc.getAttr("pSphere.rz") #
rz就是rotationZ的缩写返回0.0,我们就得到了他的信息了。关于文档使用的小结:其实我平时用的比较多的还是CommandsPython命令查询页面,因为在场景中很难找到命令及其参数的完整信息(当然,我们可以通过输出窗口中的MEL记录,但这些信息远远不够……)。关于Nodes,当我们需要知道某个节点的类型时,可以用到objectType来查询;或者当我们需要得到节点中某些属性的时候,也会用的到这个页面。
3.4 一个简单的脚本实例这一节中,我要结合前三篇所讲的一些知识来作一个综合的小范例,并加上适当的注解,以便学习。
import maya.cmds as mc #
导入MAYA模块
def height(h): # 定义函数height,h为这个函数的一个参数
sel=mc.ls(sl=1) # 定义变量sel,把当前所选的内容赋予这个变量
for i in range(0,len(sel)): # 在sel这个选集范围里,对其中的每一个对象进行操作
mc.setAttr(sel[i]+".ty", h*i) #
所做的操作是:把每个对象的Y轴移动一个量。
# 这个量是这个函数的h参数乘以这个for循环的成员变量i先执行以上这写代码。现在我们在场景中创建一个立方体,然后按Ctrl+D水平复制出若干个成一直线,全部选中这些立方体。如下图:
然后执行:
执行height函数后,发现这些立方体的高度会发生一些变化,形成一斜线。并且,height的斜率会根据h的值的不同而不同。
代码的简单分析:代码的结构不是很复杂,只有5行,前面3行应该不用作过多的解释,应该是很好理解的。我主要分析下最后的2行for循环语句。(看下面的文字时请注意对照源代码)第一行for:假设我的场景里有5个pCube,分别叫pCube1, pCube2, pCube3, pCube4,
pCube5,如果我选择的他们的话,那么sel变量会是这样一个列表:["pCube1", "pCube2", "pCube3", "pCube4",
"pCube5"];len(sel)的值就是5;range(0,len(sel)) 就等于range(0,5),也就是[0,1,2,3,4]这样一个列表。所以说成员变量i的取值范围就在这个列表中,i将逐个被列表中的每一个成员替代。第二行for:由于i有5个值可以取,所以setAttr会执行5次,每次执行时,就会把range范围列表中的值代入i。比如,当i=0的时候,sel[0]就是指范围列表中的第一个值,也就是"pCube1",sel[i]+".ty"指的就是"pCUbe1.ty",也就是pCube1的Y轴的移动值;h*i指的就是这个移动值的具体数字,其中i是在这里就是0,h的值取决于你在调用函数时在参数中所输入的数字,把整句话连接起来就是:当i=0时,并且h=2时(h值在我们调用函数时得到),执行mc.setAttr("pCube1.ty",
2*0),pCube1的Y的位移值等于0;以次类推,当i=4时,并且h=2时,执行mc.setAttr("pCube5.ty",
2*5),pCube5的Y的位移值等于10。如果你有一定编程经验,相信这些代码理解起来不会很困难。如果你是初学着,建议多练习for循环语句的使用,多尝试自己写一些代码,得以巩固。在下一篇中,我们会有更多的代码演示及其分析,进入实战。
---第三篇完---
- 实战篇&(点击标题阅读全文)上一篇,我们结束了演习,在这一篇中,我们将进入实战!我们将学习写一些实用的代码,以使我们的工作高效化。作为简易教程,我的范例代码的难度不会很大,学习者也可以触类旁通,重组这些简单的"零件",发挥自己的"组合能力"。其实这个世界上真正复杂的"东西"很少,但是复杂的"组合"却是很多。复杂的"组合"往往需要自己创造,发挥自己的想象力吧。
4.1 自制吸附工具:事实上,MAYA自己也有吸附工具,可以吸附很多场景中的元素。我们下面的代码的主要是用来吸附中心点位置的。在MAYA场景中,如果遇到有很多物体时,MAYA自带吸附功能可能会有点不太好使(会吸到别的物体)。但也有可能是我MAYA掌握不全面-
-U。(事实上,操作上我更习惯MAX,因为学的比较早,但从软件结构上,更偏爱MAYA)OK,不废话了,先看看下面的代码吧:
# 执行代码前,请大家在自己的场景里建2个物体(任意),我这里是pCube1和pSphere1
def snap():
selection=mc.ls(sl=1) # 把所选的物体命令存入变量selection
pos=mc.xform(selection[1], q=1, t=1, ws=1) # 询问所选的第2个物体的位置信息,并存入变量pos
mc.xform(selection[0], t=pos, ws=1) # 把这个pos变量的值给所选的第一个物体
先执行以上代码,什么也不会发生,因为我们现在已经定义了一个函数,这个函数叫snap,接下来,我们要执行这个函数了。先选pCube1,然后按Shift加选pSphere1,执行函数:
snap()我们看到,pCube1的位置完全移到pSphere1的位置上去了。如果我们撤消操作,先选pSphere1,再加选pCube1,执行函数后结果就成了pSphere1的位置完全移到pCube1的位置上去了。这里我们看到选择的顺序对最终的执行结果形成了直接的影响。所以我们先要测试MAYA中的选择顺序和mc.ls(sl=1)命令之间的关系。再次选pCube1,然后按Shift加选pSphere1,然后执行:
mc.ls(sl=1)我们看到MAYA返回了一个列表["pCube1","pSphere1"]。然后同样反过来操作,先选pSphere1,再加选pCube1,执行mc.ls(sl=1),得到的列表结果是["pSphere1","pCube1"]。所以得出结论:加选的物体,会追加到列表的结尾。selection[0]就是先选的物体,selection[1]就是后选的物体。如果我们想要把后选的物体作为目标位置的话,那我们就要获取后选物体的位置信息:pos=mc.xform(selection[1],
q=1, t=1, ws=1)。我们再次用到了询问开关q;t就不用多说了吧,如有疑问可以参考上一篇3.3.1;ws(worldspace)是世界空间的意思,打开ws说明你所要获取或设置的参数是基于世界坐标的,而不是局部坐标(可以在帮助文档中找到)。这样我们就把后选的那个物体selection[1]的位置信息记录到了pos变量里。
随后我们把这个位置信息用mc.xform(selection[0],
t=pos, ws=1)命令赋予给先选的物体selection[0],这样selection[0]的位置就看上去像"吸"到selection[1]上去了。扩展:由于字数限制,扩展部分介绍请参阅我的博客:
4.2 自制重命名工具:
MAYA自带也有类似的工具。但是功能比较简陋,我们可以自制一个功能更强的重命名工具。先看下代码吧:
def addpre(pre):
selection=mc.ls(sl=1)
for i in selection:
mc.rename(i,
我们先执行以上代码,这样就定义了addpre()函数,然后我们选中刚才创建的pCube1和pSphere1,执行该函数,如下:
addpre("prefix_")执行后,看到我们所选择的物体名字前就加上了前缀,变成了prefix_pCube1和prefix_pSphere1。现在我来解释代码。定义函数中,我们增加了pre变量作为该函数的参数,用来输入你需要的前缀字符。函数主体中第一行大家应该明白,这里就不多说了,主要还是稍微解释下for循环。
for循环的范围是你的选择范围selection,不管selection列表里多少值,都是循环范围。每次循环所执行的语句是mc.rename(i, pre+i),其中rename是重命名的命令,我们可以通过手动给物体重命名,在MEL输出窗口得到MEL命令,然后转成PYTHON;或者到帮助里查找,这里我推荐第一个方法,因为比较快捷。rename中有2个参数,第一个是要rename的原始名字,第二个是修改后的名字。i是selection列表里的的每个成员,也就是你所选择的物体。执行命令后,for循环会逐个对你所选的每一个物体执行rename命令:把i(原始名字)变成pre+i。其中pre是一个预设的变量,在调用函数的时候pre需要被设定成一个字符,比如:addpre("prefix_"),这样pre就等于"prefix_"了,那pre+i就等于在原始名字前加上一个叫做"prefix_"的字符。扩展:由于字数限制,扩展部分介绍请参阅我的博客:
4.3 对文本进行操作这里我写个小小的实例,这个实例可以将当前所选择的物体的位置坐标导出成文本文件。接下来,我们在脚本编辑器中输入以下代码:
import maya.cmds as mc
sel=mc.ls(sl=1)
for i in sel: #获取每个选择物体的名字和它的位置信息
posx=mc.getAttr(i+".tx")
posy=mc.getAttr(i+".ty")
posz=mc.getAttr(i+".tz")
iposInfo=[i,posx,posy,posz]
info.append(iposInfo)
info_str=""
for i in info:
info_str=info_str+i[0]+"\r\nposX:
"+str(i[1])+"\r\nposY: "+str(i[2])+"\r\nposZ:
"+str(i[3])+"\r\n\r\n"
f=open("D:\\posInfo.txt","w") #
"w"表示写入
f.write(info_str) # 把info_str写入文件
f.close()然后我们在视图中创建3个立方体,然后随意放置他们的位置,如下图:
最后全选上面的代码,按小回车执行它们,完了我们打开资源管理器,找到D盘的根目录下,多了一个叫posInfo.txt的文件,打开它,可以看到文本文件的内容,如下:
这个文件记录了我们所选择的物体的坐标位置信息。现在我为大家分析以下这段脚本,谈谈我对写类似脚本的思路:
首先我先要想,我如果要记录一个文本文件要记录哪些信息?这里作为范例,我只记录最简单的信息,那就是:所选物体的名字,以及该物体的XYZ位置信息。所以这里创建了一个空的列表Info,然后使用for循环对每一个所选择的物体进行getAttr(),以获得它的XYZ位置坐标,然后把[物体的名字,坐标X,坐标Y,坐标Z]以列表的形式给一个临时的变量iposInfo,把每个物体的iposInfo再添加给Info列表。这个时候,Info得到的数据应该是这样的:
[[立方体1,POSX,POSY,POSZ],[立方体2,POSX,POSY,POSZ],[立方体3,POSX,POSY,POSZ]]现在我们以列表的形式暂时保存了想要储存的数据,这个列表叫做Info。然后我们需要用到PYTHON的文件读写命令open()和写入命令write()。但是写入文本文件的数据类型是字符,所以我们需要把列表转成字符,而且是带格式的字符,因为带格式的字符可以方便我们浏览文件。这里我们再次使用了for循环,我们对Info列表进行循环,把列表中的信息以特定的格式累积到空字符info_str中去,最后把info_str写入文本。
扩展:由于字数限制,扩展部分介绍请参阅我的博客:
一些隐藏的命令由于字数限制,部分内容介绍请参阅我的博客:
在PYTHON中使用MEL语句由于字数限制,部分内容介绍请参阅我的博客:
---第四篇完---
- 界面篇&(点击标题阅读全文)学习写界面的最好方法是看帮助文档,帮助文档里拥有大量的学习资源!并且大多都很实用。我基本就是直接把帮助文档里的范例直接拿过来用,然后修改其中的参数,边改边学。这里我基本也是拿来主义,在接下来的篇幅中,我会选择性地解释一些基本控件的用法。
5.1 按钮和文字按钮和文字是界面中常用的元素,接下来我们先尝试用最简单的代码来生成一个带按钮的界面。
5.1.1 按钮
import maya.cmds as mc
mc.window()
mc.columnLayout()
mc.button()
mc.showWindow()执行后看到一个只有一个按钮的窗口
点击按钮什么也不会发生。接下来我们在mc.button()中添加一些参数:
mc.button(label="Hu Yongbin")
# 添加按钮标签再次执行所有代码
看到窗口中按钮上的文字变成了label参数后的值。接下来我们继续添加参数:
mc.button(label="Hu Yongbin", w=100,
h=100) # 添加宽度和高度参数执行后,看到按钮变成100*100的方形
接下来,我们要让这个按钮执行些命令,比如打印一句话:
mc.button(label="Hu Yongbin", w=100,
command="print 'hello, my name is Hu
Yongbin'") # command 参数执行所有代码,点Hu Yongbin按钮,观察输出窗口,看到了hello, my name is Hu
Yongbin。我们看到command参数其实包含的是命令。同样,我们也可以定义一个函数:
def printer(whatever):
print whatever然后把函数放在command参数后:
mc.button(label="Hu Yongbin", w=100,
command="printer(12312)'")执行后,点Press
Me,看到输出窗口返回12312这个值。
mc.button(label="Hu Yongbin", w=100,
h=100,bgc=[1,0,1] ) # bgc就是backgroundcolor执行后,看到按钮变成了难看的粉红色。更多的参数请参考帮助文档:)
5.1.2 文字文字在UI中起着说明解释的作用
import maya.cmds as mc
mc.window()
mc.columnLayout()
mc.text(label="welcome to Hu Yongbin blog -
mc.button()
mc.showWindow()执行代码后
看到按钮上方出现welcome to Hu Yongbin blog -
,如果把mc.text(label="welcome to Hu Yongbin blog -
")放到mc.button()下面的话,welcome to Hu Yongbin blog
-&就会在按钮的下面。我们还可以改变字体:
mc.text(label="welcome to Hu Yongbin blog
- ", fn="boldLabelFont" )执行后看到字体变成了黑体。更多的参数请参考帮助文档:)
5.2 输入框输入框也是一个非常实用的功能,我们可以在框中输入一些文本,然后再执行相关的命令,我们可以把上一篇的简单命名工具拿来扩展一下:
def addpre(pre): #
定义加前缀函数
sel=mc.ls(sl=1)
for i in sel:
mc.rename(i,
mc.window()
mc.columnLayout()
a = mc.textField(tx="default") # 文本输入框,我们定义了默认文本default
mc.button(label="Press Me", w=100, h=100,
command="b=mc.textField(a, q=1, tx=1); addpre(b)")
mc.showWindow()执行以上代码
看到按钮上方多了一个文本输入框,里面有个默认的文本内容default,这个值是我们在创建时定义的。现在我们在场景中随意创建一些几何体,然后全部选中,点Press
Me按钮,看到所选的几何体的名字前全部自己加上了default。当然你也可以把默认defualt删除,打入任何字符,这些字符将成为所选物体的前缀。
相信addpre()函数大家应该很熟悉了吧,在上一篇中我介绍过,接下来我分析一下textField命令的用法。
a = mc.textField(tx="default")就是创建一个文本输入框,其默认值是一个字符"default"。我们把定义了的输入框赋予一个具体实例a,因为我们在之后要用到这个实例。一般来说,如果控件需要用到询问模式(q)和编辑模式(e),都要指定一个具体实例,这个具体实例为之后的编辑提供了具体的操作对象。
我们看到button行的command参数里包含了这个实例对象a,mc.textField(a, q=1,
tx=1)表示询问实例对象a关于参数tx的值(这里tx是默认的,你也可以通过改变输入窗口中的默认值来得到新的tx值);然后我们把这个值赋给了变量b;最后把这个得到的变量b的值填入addpre()函数的pre预设变量,并且执行addpre()函数。这样我们就把tx的值加在了所选物体的前面。
所以整体流程就是:在输入窗口输入文本;按Press Me后,通过询问得到文本信息tx,然后传给b,把b填如addpre(pre),这样就得到了最后的结果。
5.3 选项菜单选项菜单是一个菜单,并且是可选的。
import maya.cmds as mc
mc.window()
mc.columnLayout()
o=mc.optionMenu( label='test') # 创建菜单
mc.menuItem( label='cat' ) # 加入菜单内容cat
mc.menuItem( label='dog' ) # 加dog
mc.button(label="Press Me", command="a=mc.optionMenu(o, q=1,
v=1);print a")
mc.showWindow()执行后,得到一个窗口
上面是一个选项菜单,下面是一个按钮。点Press Me,看到输出窗口返回cat;我们把选项菜单中的选项改成dog,再点Press Me,看到输出窗口返回dog。可见,选项菜单中选什么,点Press Me后就打印什么。原理很简单,和上文提到的输入窗口类似,我们在定义选项菜单时要注意设置一个实例o,以便之后再获取菜单中的值。
点PressMe后,执行a=mc.optionMenu(o, q=1,
v=1);mc.optionMenu(o, q=1,
v=1)的意思就是询问实例o的v参数,v参数就是value的意思,也就是指当前optionMenu的值。把获得的值给a,然后打印a。
5.4 列表框接下来,我结合选项菜单来写一段简单的有关列表框的代码:
import maya.cmds as mc
import os # 导入OS模块,常用功能见第二篇。
def changeList():
cdir=mc.optionMenu(op,
myls=os.listdir(cdir)
mc.textScrollList(directoryList , e=1, removeAll=1)
mc.textScrollList(directoryList , e=1, append=myls)
mc.window()
mc.columnLayout()
op=mc.optionMenu( label='Directory', cc="changeList()") #
定义选项菜单
mc.menuItem( label='C:\\' )
mc.menuItem( label='D:\\' )
directoryList = mc.textScrollList(numberOfRows=8,
append=os.listdir("C:\\"))
mc.showWindow()执行后,看到一个窗口
上边是选项菜单,里面有C:\和D:\两个选项。如果你切换盘附,你的列表会显示该盘附里的所有文件和文件夹。如何实现?我慢慢道来...
由于字数限制,列表框的分析内容介绍请参阅我的博客:
5.5 进度条进度条主要用在脚本运算量很大的情况下的,为了避免用户以为死机,进度条可以很好的让脚本使用者了解到当前脚本执行的进度。这里我引用了文档里的一个例子:
import maya.cmds as cmds
window = cmds.window()
cmds.columnLayout()
progressControl = cmds.progressBar(maxValue=10, width=300)
cmds.button(label='Make
Progress!',command='cmds.progressBar(progressControl,edit=True,
cmds.showWindow( window )执行后,看到一个窗口,里面有一个进度条和一个按钮
每点下按钮,进度条会升10%,点10下,进度条就满了。
进度条命令其实很简单。progressControl =
cmds.progressBar(maxValue=10, width=300)定义了一个进度条:最大值10,宽300。按钮命令中,command参数里cmds.progressBar(progressControl, edit=True,
step=1)表示对进度条值的修改,注意edit=True,等同于e=1;step=1表示,每执行一次,进度条前进一格。一般在for循环里用进度条比较多,我一般惯用格式如下:
for i in alist: #
假定有个列表叫alist执行命令 # 这只是一个例子,大家可以自己代命令进去
cmds.progressBar(progressControl,
edit=True, step=1)
这样,每作一次循环,进度条就会前进。
5.6 勾选框勾选框是可以任意勾选自己想要的选项这么一个UI控件,示范代码如下:
import maya.cmds as cmds
#以下定义3个初始值
def test():
print "value 1
is "+str(v1)
print "value 2 is "+str(v2)
print "value 3 is "+str(v3)
print "---"
window = cmds.window()
cmds.columnLayout( adjustableColumn=True )
#三个勾选框
cmds.checkBox( label='value 1', align='left', v=v1,
onCommand="v1=1", offCommand="v1=0")
cmds.checkBox( label='value 2', align='left', v=v2,
onCommand="v2=1", offCommand="v2=0")
cmds.checkBox( label='value 3', align='left', v=v3,
onCommand="v3=1", offCommand="v3=0")
cmds.button( label="Press Me", command="test()") #
cmds.showWindow( window )执行后,看到一个窗口有3个勾选框,分别叫做value 1,value 2,value 3,还有一个按钮
勾选1、3项,2项不要勾选,点press me,看到输出窗口输出信息如下:
value 1 is 1
value 2 is 0
value 3 is 1
---如果勾2、3项,关闭1项,再点press me,输出如下:
value 1 is 0
value 2 is 1
value 3 is 1
---可见,打印结果的0和1取决于勾选框是否被勾上,勾上的为1,否则为0。这段代码,我将不再作过多的分析,希望大家可以自己理解其运作原理。:)
界面篇的内容就到此为止,更多的界面元素以及其用法我不一一熬述,大家要多参考帮助文档,多分析。发挥主观能动性才是学习的王道。
(本教程完)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 maya无法识别文件类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信