当前位置: 首页 > news >正文

如何学习maya mel语言的经验分享

一、前言

总结一下这十几年来学习和使用mel语言的一些经验,供初学朋参考,哈哈。
这里不说深奥理论,只是朴实经历陈述。 其实,早在2003年,最初接触maya时,就已经涉及到mel的学习,当时在大学里接触到一些程序基础,虽然本人不是程序专业的(美术设计类专业)。但是还是对编程比较感兴趣。 特别对于手动输入代码,之后得到神奇反馈这件事很是着迷。哈哈。后来在制作动画时,死肯官方帮助你、mel基础知识。发现,mel确实非常的简单方便,特别是在处理大量繁琐和重复的批量工作时,可以大大提高工作效率。

二、总结一下mel 的特点:

一)、优点:

1、代码简练,使用方便。简单易学,上手迅速。
2、解释类语言,实时勘验结果,调试快速。
3、类C 的语言语法。规范精炼。
4、兼容性好,基本上在所有maya版本上都可以运行。
5、免费资源众多,便于参考学习。由于是解释类的语言,所以源码都是可见的。世界上,拥有不可计数的免费资源可以供大家学习参考。比如业内非常知名的www.creativecrash.com 就是以前的highend3d网提供大量的免费资源。

二)、缺点:

1、执行效率较低,对出处理高密度海量运算,没有优势,比C++开发的api插件效率差10倍;
2、单线程运行,cpu使用率低。现在多核心处理器很普及了,但是mel本身是单线程的这就大大的降低了脚本的执行效率。所以,maya才引入了python,哈哈。当然python的优点还有很多很多,这里就不详述了。
3、保密性差,对于不希望公布源码的开发者来说,mel几乎是完全透明的。这可能也是mel 的最大的魅力。哈哈。
4、mel的功能方面,局限于maya自身的功能,对于视频,音频、网络处理等方面没有有效的解决方案。当然,mel本身并不属于开发类语言,只是属于辅助类工具脚本。

三、好的下面说说我的mel学习经历

我最初其实是在开发一块群体动画插件brick dance时,开始学习mel的,这款插件的功能就是通过目标控制器批量控制群体物体的给类属性产生有秩序的渐变效果的插件。如图:
在这里插入图片描述

后来更名为attract magic,如图, 因为是学工业设计出身,所以在用户体验和UI设计方面花的精力多些。 说道底其实就是兴趣使然,如果不是因为喜欢,相信根本无法坚持下来。这里我为大家推荐一本书。《Maya5编程全攻略》,如下图。本书对于掌握maya的基本原理和将来深入的开发,非常有帮助。
在这里插入图片描述
其实,当初开发插件时,感觉就是一种精神历练,这么说吧,因为当时没有任何的编程经验,经常会犯一些低级错误,比如:语法规范,标点符号、逻辑顺序等等。对于一个几千行代码的脚本来说,真的是一行一行的测试,修改。直到最终把mel 的规范变成自己的本能!这就是一种守规矩的训练,与其他的工作一样,都需要先了解并遵守规则,之后,才能融会贯通,游刃有余。佛法中讲“戒、定、慧”三学,就是先守规矩;之后,就是专一不杂,持久深入就是开窍了,能游刃有余举一反三。哈哈。阿弥陀佛。

说到这里,我想所有编程其实都是一样的。作为一种语言,只有在不断的使用中才能够真正掌握。在这10几年影视工作中,涉及到maya 的各个模块编程,从建模、材质、UV、贴图、动画、渲染、特效。其实,你的工作内容就是你编程的战场。哈哈。这里对于初学者的建议是,首先,你如果要对maya中某个模块编程,一定要对该模块有较深入的使用经验,否则你的程序会被大家骂惨,这里主要涉及到人机交互UI设计和使用流程问题。从用户体验角度来说,你要站在使用者角度,为其提供最大方便。这样才算成功。之后就是不断的接受反馈和修复bug了,打磨迭代了。

这个过程是漫长的。你绝对不要有侥幸的心理。没有一款软件是完美无缺的。所以不要害怕被人骂,没有骂声就没有一个完美的工具诞生了,哈哈!阿弥陀佛。

四、提高和深入

掌握以后,就涉及到提高和深入的问题了。这个给的建议是,从maya官方的scripts目录中的程序,寻找灵感,我们知道,maya中所有可视界面和功能模块,都是通过mel构建的。所以,当你在制作中,希望改善流程或提高效率时,首先要反查maya内部的mel代码,并进行有效记录的过程。之后再组织代码,添加自定义变量和交互界面…

我一般的流程是,首先,在maya中找到解决问题的思路和方法,就是具体的制作步骤。之后,在脚本编辑器中,查看底层代码显示,并反查原始的mel命令源码,之后,就可以进行优化和编写自己的脚本程序了。
在这里插入图片描述
使用的编辑器是EditPlus,一个第三方的脚本开发工具 ,如下图:
在这里插入图片描述
官方提供了针对mel的语言包地址如下:
http://knowledge.autodesk.com/support/maya/downloads/caas/downloads/content/download-install-maya-product-help.html

editplus mel stx 语言支持包 下载地址:链接:http://pan.baidu.com/s/1qWvezZQ 密码:js4j

1)拷贝到editplus目录后,需要在设置中指定相应的文件路径。如下图:
在这里插入图片描述
2)新建自定义mel 脚本类:如下图:
在这里插入图片描述

3)指定解压后的配置文件路径:
在这里插入图片描述
4)打开mel脚本,就可以显示不同的关键字色彩了。该软件有批量查找功能,能够从无数的脚本中,查找程序关键字,这就帮了大忙了。哈哈。我经常使用它来搜索maya自身的程序命令非常的好用!如图:
在这里插入图片描述

五、MEL 与 Python 之间的重要差异

现在用python的人比较多,但作为maya的原生语言,mel还是有很多Python不具有的优势。官方也出了相应的说明:

1) 更改
在 Python 中可以访问使用 MEL runTimeCommand 命令创建的 MEL 命令。例如:
在 MEL 选项卡中:

runTimeCommand -command "sphere -name myName" mySphere;

在 Python 选项卡中

import maya.cmds as cmds 
cmds.mySphere() 

同样,可以使用以下语法创建 Python 运行时命令,并从 Python 中调用这些命令:

import maya.cmds as cmds 
def mySphere(): 	 cmds.sphere(name='myName') cmds.runTimeCommand('MyBall', command='mySphere()') cmds.MyBall() 

2)其他差异
在 Python 中不支持 eval 和 evalDeferred Maya 命令。但是,请注意下列事项:
Python 有一个用于对 Python 表达式求值的内置 eval 函数。
Python 具有用于对 MEL 表达式求值的 maya.mel.eval。
evalDeferred 已由 maya.utils.executeDeferred() 取代。
有关详细信息,请参见使用 Python。

MEL 具有它自己的警告和错误消息报告机制,该机制已与 Maya 消息报告集成。这包括命令行上的颜色反馈。Python 附带系统模块,这些模块提供警告和错误报告功能;但是,这些模块未集成到 Maya 中,并且在命令行中不提供颜色反馈。
必须将 Python 中的单位指定为带引号的字符串;例如:

maya.cmds.scale(3, 3, 3, r=True, p=('0cm', '0.5cm', '0cm'))

Python 脚本中的命令标志参数采用一个包含 Python 脚本的字符串(就像 MEL 等效项一样)或一个 Python 可调用对象(如函数)。
例如:

import maya.cmds as cmds 
def defaultButtonPush(*args): 	print 'Default was pushed.' cmds.window( width=150 ) cmds.columnLayout( adjustableColumn=True ) cmds.button( label='Default', command=defaultButtonPush ) cmds.button( label='Left', align='left' ) cmds.button( label='Center', align='center' ) cmds.button( label='Right', align='right' ) cmds.showWindow()

MEL 使用不同于 Python 的语法来指定值的范围。在 MEL 中,使用 “*” 来指定值的范围,而不使用 *,例如:

select -r surface1.cv["*"][0]; 

在 Python 中,使用不带引号的 * 指定值的范围。对于上面的示例,在 Python 中则为:

cmds.select( 'surface1.cv[*][0]' , r=True) 

3)返回和回显结果
存在两种方式,MEL 和 Python 在返回和回显结果方面会有差异。一个是与正确的脚本执行相关的,而另一个是表面问题。本节将讨论回显结果和返回结果,有时会混淆它们。

本节主要对熟悉 MEL 但不熟悉 Python 的人员有帮助。

4)返回结果
MEL 在执行脚本时会返回最后执行的语句的结果(如果有)。将值指定给变量和返回结果的过程调用的语句属于返回结果的语句类型。例如,以下代码块将有一个结果,MEL 会将该结果回显到脚本编辑器和命令行消息区域:

if ( $foo == 1 ) $bar = 42; else $bar = 7;

相比之下,在 Python 中指定值的语句不返回结果,尽管 Python 执行该指定。

使用 Python 的语法,只需引用一个变量即可返回其值。MEL 的语法不允许只是编写变量的名称作为一条完整的语句。

在 Python 中可以将上述 MEL 代码片段编写为以下内容。最后一行 (bar) 会返回结果。

if foo == 1: bar = 42 else bar = 7 bar

如果需要在一种语言的上下文中使用在另一种语言中计算的值,那么了解该差异是很重要的。例如,如果希望在 MEL 中使用 Python 值,只需执行以下命令:

$myMELvariable = python ("myPythonVariable");

反之,如果希望在 Python 中使用 MEL 变量,则需要执行类似以下的命令:

import maya.mel myPythonVariable = maya.mel.eval ('global $myMELvariable; $temp=$myMELvariable;' )

可以这样做是因为赋值语句会返回一个结果,该语句是脚本中传递到 eval 命令的最后一条语句。

在 Python 中只能访问全局范围的 MEL 变量。

5)回显结果
MEL 会回显由脚本的最后一条语句返回的结果(如果有),而不管脚本中有多少行。Python 仅回显单条语句的结果。

六、mel学习的意义

1、mel与python 的关系

最后,展望一下学习mel语言的必要性,mel 的全称叫maya embed language,从字面上你就看出,作为maya嵌入式核心语言,它涉及了maya的所有方面,因为maya本身就是mel构建的。python其实是mel命令c++的外部封装。了解mel的用法,对于python的调用其实一样。

2、经验积累效率提升

如果你是一个maya的专业用户,那么建议你一定要掌握它,因为它可以帮你解决很多的核心问题。比如对于复杂制作流程的记录与快速重复操作。有些制作技巧过程很复杂,别人不容易重复模仿,此时,可以编写为工具插件。

还有一些是默认maya命令没有提供的mel内部功能选项,maya默认官方可能只用到了mel命令的部分选项功能, 还有一些隐藏选项功能,没被使用到。

其实,国外的很多工作室效率极高,是因为他们都积累大量的工作经验,和工具插件。

3、模块标准化操作

可以实现技术的普及化标准化,对于团队作战,这是必须解决的问题,如果制作标准不规范,很难被其他流程模块所理解和使用,比如统一的命名规范,统一的文件格式、统一的流程等。

好了就简单说说,一门编程语言的学习,就和普通中文和英语一样,要天天的说和练习,才能不断积累和提高。所以一定要有毅力和恒心。南无阿弥陀佛。

相关文章:

如何学习maya mel语言的经验分享

一、前言 总结一下这十几年来学习和使用mel语言的一些经验,供初学朋参考,哈哈。 这里不说深奥理论,只是朴实经历陈述。 其实,早在2003年,最初接触maya时,就已经涉及到mel的学习,当时在大学里接…...

睿趣科技:新手抖音开店卖什么产品好

抖音已经成为了一款年轻人热爱的社交媒体应用,同时也成为了一种全新的电商平台。对于新手来说,抖音开店卖什么产品是一个备受关注的问题。在这篇文章中,我们将探讨一些适合新手的产品选择,帮助他们在抖音上开店获得成功。 流行时尚…...

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计<Web架构>Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…...

竞赛选题 基于视觉的身份证识别系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…...

git详细教程

git详细教程 区域划分单分支操作git log语法常用的参数及其详解git log 结果 git refloggit diff常用的参数及其详解 git reset常用的参数及其详解 git checkoutgit rm常用的参数及其详解 git remote常用的参数及其详解 多分支切换代码融合git switch常用的参数及其详解 git br…...

[old]TeamDev DotNetBrowser Crack

TeamDev DotNetBrowser将 Chromium Web 浏览器添加到您的 .NET 应用程序中。在 WPF 和 WinForms 中显示现代网页。使用 DOM、JS、网络、打印等。在 Windows x86/x64/ARM64、macOS x64/Apple Silicon、Linux x64/ARM64 上运行,支持.NET Framework 4.5 特征 HTML5、C…...

Zynq-Linux移植学习笔记之63- linux内核崩溃的重启

1、背景介绍 在运行linux应用程序的时候,有时会遇到内核崩溃异常的情况,此时串口中会打印出内核崩溃时的堆栈情况,如下: 当出现这个情况后串口就死了,应用也停了,此时无法进行恢复。 之前写过可通过板子w…...

【精华】ubuntu编译openpose

文章目录 (1)参考资料(2)opencv编译(3)Openpose编译(4)异常问题 (1)参考资料 ubuntu20 openpose cuda11.7 cudnn8 opencv4.7.0_Nightmare004的博客-CSDN博客…...

第二届全国高校计算机技能竞赛——Java赛道

第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…...

使用Webpack设置TS引用模块,解决Module not found: Error: Can‘t resolve ‘./m1‘ in ...问题

当我们把ts文件作为模块被引用的时候&#xff0c;我们使用Webpack打包代码会报错&#xff1a; Module not found: Error: Cant resolve ./m1 in ... 解决方法&#xff1a; 在webpack.config.js文件中配置如下代码&#xff1a; module.exports {// 设置引用模块resolve: {ext…...

北斗GPS网络时钟系统(子母钟系统)助力智慧教室建设

北斗GPS网络时钟系统&#xff08;子母钟系统&#xff09;助力智慧教室建设 北斗GPS网络时钟系统&#xff08;子母钟系统&#xff09;助力智慧教室建设 HR系列型NTP网络时钟系统是由我公司精心设计、自行研发生产的一套通过网口与母钟连接的子钟&#xff0c;接收母钟发送来的时间…...

蓝牙芯片香薰机智能化方案

RAMSUN提供的蓝牙芯片香薰机智能化方案&#xff0c;支持提供远程提前开启、多档位调节、工作模式切换等产品方案&#xff0c;可通过倒计时进行计时管理&#xff0c;实现免看管香薰&#xff0c;方便节能。 香薰机智能化方案采用的蓝牙芯片MS1656内置有M0内核的32位MCU,具有24MH…...

9.23 校招 实习 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 友道智途2024年校招开启&招聘投递Q&A&#xff08;内推&#xff09; 校招 | 友道智途2024年校招开启&招聘投递Q&A&#xff08;内推&#xff09; 2、校招 | ABB机器人…...

ARM 和 AMD 架构的区别

ARM 架构和 AMD 架构是两种不同的计算机处理器架构&#xff0c;它们有以下几个主要区别&#xff1a; 设计出发点&#xff1a; ARM 架构&#xff1a;ARM 架构最初是为嵌入式系统设计的&#xff0c;旨在提供低功耗和高效能的解决方案。它主要应用于移动设备、嵌入式系统和物联网设…...

Logstash、sharding-proxy组件高级配置

记录Logstash数据同步插件在分库分表场景下相关高可用、高并发配置 一、Logstash 1.配置文件控制任务数 vim /etc/logstash/logstash.yml pipeline.workers: 24 pipeline.batch.size: 10000 pipeline.batch.delay: 10 Logstash建议在修改配置项以提高性能的时候&#xff0c;每…...

【Elasticsearch】简单搜索(三)

简介&#xff1a;Elasticsearch&#xff08;ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点&#xff0c;被广泛用于构建实时搜索、日志分析、数据可视化等应用。 这篇文章主要介绍检索相…...

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时&#xff0c;通常着重考虑三个主要层次&#xff1a;业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性&#xff0c;用户需求明确最终用户的期望&#xff0c;而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…...

Linux基础知识 总结

Linux基础知识 总结 1、Clion的简单介绍 CLion是以IntelliJ为基础&#xff0c;专为开发C及C所设计的跨平台IDE&#xff0c;可以在Windows、Linux及MacOS使用&#xff0c;这里我是在ubuntu 16.0.4基础上安装。2、下载 Linux版Clion的.tar.gz的压缩包 wget https://download.j…...

网上申请流量卡要不要身份证?填写的信息安全吗?

网上申请流量卡要不要身份证&#xff1f;当然是要的&#xff01; 现在直接从营业厅办理流量卡的很少了&#xff0c;都是直接在网上申请大流量卡&#xff0c;在这里小编提醒大家&#xff0c;在网上申请大流量卡和激活时都是需要提供个人证件的。 申请时提供身份证号是为了运营…...

关于计算机缺失vcruntime140.dll文件的解决方法分享

在计算机系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;是一种特殊的文件类型&#xff0c;它包含了可以被多个程序共享的代码和数据。其中&#xff0c;VCRuntime140.dll是一个由Microsoft Visual C Redistributable package提供的运行时库文件&#xff0c;它为许多M…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...