其实作为一个设置或者技术指导,学习到一定程度必须要接触编程,比如Mel、Python、C++

Api等程序语言,这些教程主要是转载胡泳滨的Maya

Python学习教程,现在开始第一章-MayaPython教程四之实战篇。

上一篇,我们结束了演习,在这一篇中,我们将进入实战!我们将学习写一些实用的代码,以使我们的工作高效化。作为简易教程,我的范例代码的难度不会很大,学习者也可以触类旁通,重组这些简单的“零件”,发挥自己的“组合能力”。其实这个世界上真正复杂的“东西”很少,但是复杂的“组合”却是很多。复杂的“组合”往往需要自己创造,发挥自己的想象力吧。

4.1 自制吸附工具

事实上,Maya自己也有吸附工具,可以吸附很多场景中的元素。我们下面的代码的主要是用来吸附中心点位置的。在Maya场景中,如果遇到有很多物体时,Maya自带吸附功能可能会有点不太好使(会吸到别的物体)。但也有可能是我Maya掌握不全面。(事实上,操作上我更习惯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]上去了。

扩展:

我们可以对这个函数进行扩展。我们把t参数该成rotation参数。这样改变就是旋转,而不是位置了。当然,t和rotation也可以同时使用。甚至可以改变位移的具体数值,比如我们在代码最后一行把selection[0]的t设置成pos,我们查看pos,看到pos其实是一个[x,y,z]格式的位置列表信息。我们把t改成[pos[0],pos[1],pos[2]]的形式,这样就可以对具体的轴向上的量进行微操作了。比如把t的值设成[pos[0],pos[1]+2,pos[2]],这样“吸附”后的y值会+

2。再如,这个2又可以用一个变量h代替,在函数定义时在括号里增加一个h参数,这个h参数可以在执行函数的时候自己设置,设置成多少,吸附后的位置就高多少。再再比如,我们可以不只对2个物体进行操作,可以对n个物体进行操作,吸附后,每个物体的高度值都让它有变化,还可以根据自己的习惯来设置选择的顺序...甚至可以做个界面,这是后话了。

4.2 自制重命名工具

Maya自带也有类似的工具。但是功能比较简陋,我们可以自制一个功能更强的重命名工具。先看下代码吧:

def

addpre(pre):

selection = mc.ls(sl = 1)

for i in selection:

mc.rename(i,pre + 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_”的字符。

扩展:

这个函数的扩展空间还是非常大的,你可以把它改成加后缀的:mc.rename(i, i +

suff),把变量改成suff并放在成员变量i后面就OK了。还可以结合re模块中的re.sub()命令写出可以替换部分名字的功能。可以后缀数字序列,如:001,002,003...基本可以写出一个强于MAX的rename工具。(当然,Max用maxscript也可以写)

4.3 对文本进行操作

有时我们需要把一些Maya中的信息以文本的方式储存出来,比如存储模型的面信息,或存储材质球路径信息等等。这里我写个小小的实例,这个实例可以将当前所选择的物体的位置坐标导出成文本文件。接下来,我们在脚本编辑器中输入以下代码:

import

maya.cmds as mc

sel =

mc.ls(sl = 1)

info =

[]

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] + “rnposX:” + str(i[1]) + “rnposY:”

+ str(i[2]) + “rnposZ:” + str(i[3]) + “rnrn”

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写入文本。

扩展:

除了位置信息,我们还可以记录旋转信息、缩放信息,甚至权重信息……但关键是需要知道如何获得这些信息,可以用getAttr(),q询问开关等。另外,如果反过来操作,我们还可以读取某个文本文件,把读取出来的字符数据列表化,然后通过setAttr()等命令再把数据返回给物体。

一些隐藏的命令

Maya中有些操作执行后,并不会直接反映在你的Mel输出窗口中。比如History命令,当你执行这个操作后,Mel输出窗口只会显示命令具体执行的事情,而不是命令本身(比如说,它会告诉你清历史后,他删了哪些内容,而不显示删历史命令)有个方法可以让命令显身:当你执行删除历史操作后,按键盘Z,撤消操作。然后观察Mel输出窗口的输出://

Undo: DeleteHistory

//。这个Undo的命令,就是刚才真正执行的Mel命令,类似的命令有很多,大家可以自己慢慢摸索。

在Python中使用Mel语句

虽然Maya集成了Python,但是有些语句仍然只能用Mel执行,这样,我们就需要用到maya.mel,使用方法很简单,我们任意选种场景中的节点,然后执行:

import

maya.mel as mm

mm.eval(“select -cl;”) # 引号中的就是Mel命令

执行后看到场景中的选择的物体都被取消选择了。

maya python教程下载_[转载]技术教程-MayaPython教程四之实战篇相关推荐

  1. 二级mysql教程下载_全国计算机等级考试教程:二级MySQL数据库程序设计

    第一章 数据库技术的基本概念与方法 1.1 基本概念 1.2 数据库系统的特点 1.3 数据库系统的结构 1.3.1 数据库系统的三级模式结构 1.3.2 三级模式结构的两层映像与两级数据独立性 1. ...

  2. python初学者教程下载_初学者Python教程

    python初学者教程下载 Welcome to Python Tutorial for Beginners. You are probably here because you think prog ...

  3. JavaWeb全套教程笔记_前端技术

    JavaWeb全套教程笔记第一阶段_前端技术 自己整理一套详细的笔记资料,可以满足平时查阅复习,还能帮助别人学习JavaWeb知识.JavaWeb教程分为四个阶段 前端技术 1.HTML.2.CSS. ...

  4. 用python怎么下载_如何使用python下载视频

    python怎么下载视频 在进行爬虫的时候,经常需要保存视频到本地.通常得先获得视频(.mp4)的下载链接,再设置保存到本地的路径(路径包括最后的命名, 例如:D:/1.mp4),因此函数传入的参数为 ...

  5. 对计算机网络教程的计划,计算机网络技术与应教程教学计划14.doc

    计算机网络技术与应教程教学计划14 百色市财经职业技术学校 百色市民族旅游学校 授课计划表 授课专业: 计算机 授课名称:计算机网络技术与应用教程 授课教师: 卢佳锐 教务负责人: 何堂飞 学校负责人 ...

  6. 代码编程教学_少儿编程教学环境开发之代码实战篇

    少儿编程教学环境开发之代码实战篇​mp.weixin.qq.com 之前架构选型篇许诺要上自己原型demo的界面图,先把这个许诺给实现了,首先声明,这只是技术原型demo,比起http://code. ...

  7. 《TensorFlow技术解析与实践》之实战篇--李佳璇

    <第二篇 实战篇>代码及实现(https://blog.csdn.net/longji/article/category/6840109/1) 1. 第一个TensorFlow程序 2.T ...

  8. 420集的python教程下载_微软官方发布了最新420集Python教程,这教程简直就是编程界福利...

    泰国清迈-2014 年 10 月 22 日: 微软主页 clos Austria, Tyrol, Axamer Lizum, hosting village of 近日,微软上线了一套 Python ...

  9. 420集的python教程下载_阿里达摩院推荐的420集的python教程,据说懂中文就能入门高清版...

    为了吸取教训,小编一定要分享一下攻略,"怎样获得小编分享的教程呢?",其实很简单,只需要私信我就可以了啦,具体步骤如下. 言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都 ...

最新文章

  1. 从PyTorch到ONNX的端到端AlexNet
  2. python十三:函数
  3. 常用sql-----DDL语句
  4. 配置apache支持cgi
  5. 大学计算机英语专业感想感知,非英语专业大学生英语感知学习风格研究
  6. wxWidgets:wxMouseCaptureChangedEvent类用法
  7. dubbo forbid service的解决办法
  8. Android下常见的内存泄露 经典
  9. 解决/mnt中有hgfs无共享文件
  10. PAT乙级(1001 害死⼈不偿命的(3n+1)猜想)
  11. 【产品】产品经理常用的五大分析法
  12. UnityShader例子:边缘检测
  13. 关于 Unix 用户权限及进程权限及 Saved set-user-id
  14. 面试中遇见的一些考试题目
  15. SqlServer2008卸载掉
  16. 美女程序员,看到最后一个就亮了
  17. VBS病毒(爱虫病毒) 源代码
  18. php单引号与双引号用法
  19. 第三章 变量和数据类型_C语言中的小数(float,double)
  20. 2023全网首发抖音标签检测程序源码+花800买的/最新版本

热门文章

  1. #036数字信息指南十分钟速成课
  2. Java企业级开发框架(一):概述
  3. C语言实现逆波兰表达式计算函数(含浮点型、整型混合运算)
  4. 论文查重时图片会不会被检测?
  5. Cognitively-Inspired Model for Incremental Learning Using a Few Examples(附翻译)
  6. 如何把密码写入代码,让VBA自动撤销工作表保护 / 工作簿保护(使用VBA代码 保护工作表 / 工作簿 和取消保护工作表 / 工作簿)
  7. linux之cp/scp命令+scp命令详解---远程拷贝
  8. 网络营销都有什么特点
  9. 3.牛顿迭代法求解方程的根
  10. linux命令:tar(打包、压缩、解压)