Maya的架构 我乱讲的 

2006-12-27 00:01 发布

3909 2 0

郁明浩 (CDV上的网名:我乱讲的)

现任DreamWorks SKG(梦工厂)高级建模师,03年加盟工业光魔任职人物建模师,精通三维建模。曾参与电影《后天》"The Day After Tomorrow"、《地狱男爵》"Hell Boy"、《范海辛》"Van Hellsing以及游戏《EA的赛车》"Need for Speed: Underground"的制作。在ChinaDV网站开设网上课堂,悉心解答CG人以及爱好者的提问,根据自身制作经验编写若干教程,在各网站发表并广泛被三维爱好者收藏,在国内各大CG网站拥有众多拥戴者。其网名“我乱讲的”更被业内熟知。

 

我很久没写教程了,可以很不要脸的说我很忙。其实真实的原因是我不知道写什么好,如何做模型我已经写了太多了,进入NURBS的话,其实也就是知道C0,C1,C2的区别,仅此而已。模型最讲究技术的是布线(我讲了很明白了)和如何快速的用最好的办法做出东西,这个是需要大量练习的,无从教起,所以模型已经结束了。那么三维里剩下的东西呢?我很想教的是MEL,试图写一些教程,结果感觉就是在翻译英文的帮组软件,我可以说明一个command是做什么的,还能举例说明一下,可惜的是,学的人往往除了这个例子,根本不知道如何运用到实际生产上。原因归根是不明白Maya在底部究竟是如何运作的,而如何用人类听得懂的语言去解释这样的问题,在当时的我来说显得略微困难,于是我只有等自己能力的成长,所以在很长的一段时间内,我是没有教程的。 
 
    经验的成长,网络的交流,文献的阅读,导致这篇我自称为教程的理论篇,这篇的目的是把某些人的观念彻底颠覆,就好像2年多前,我把NURBS的人物带到充满着Polygon人物的世界,1年多前我把规范布线的观念带到只计较造型的人物世界,而现在我要说明Maya到底是什么,就好像前面这2样东西一样,反对的人一定会很多,国人的弊病是一旦接受一样东西了,很难去接受新的东西,而三维是个非常流行的东西,每天都在发生着变化,只有不停的接受新理论,才能不停的进步,我也时常不间断的推翻自己以前的想法的。没有必要墨守成规。
 
    重要的是,不要去害怕那些看上去很深奥的东西,只是表面现像而已,他们害怕你也去学,你去和他们竞争,所以吓唬你,取了个高深莫测的名字,发的文章也是成串的命令,说起话来也是DAG,DG,API,不知所谓的,不用害怕,我会全部用人类的交流方式说明以上所有的东西。
 
    我要解释的是Maya的架构,Architecture。

    Maya是一个允许你做错事的软件,也就是说虽然你做的命令不对,可是他一样会给你一个结果,不像其他软件,要么就是不让你做,要么就是自行调整,Maya的内部架构非常自由。你完全可以通过不同的手法来完成同样一件事,这对很多开发人员来说是梦寐以求的,而对于我们这些软件运用者来说,在某种程度上,如果我们不知道我们的做法是错误的话,我们会理所当然得认为是软件笨,人类总是以怪别人为主的。 所以有人就会说Maya的poly很傻,比不上什么什么的poly。可惜的是,他们不知道正是他们的错误命令导致了出错,而其他软件也在窃笑着:“这什么白痴命令啊,还是我帮你改一下吧。”
 
    正因为有了这个让你做错事的特性,在很多时候,犹如迷失方向,总是不能让Maya做你想做的,所以需要了解的正是Maya的架构。
 
    世界上大部份的Maya使用者在每天的工作中运用的是Maya最表面的,也就是GUI,Graphical User Interface。也就是菜单啊,腾转挪移啊,放大缩小等等。就好比你的window XP的开始菜单,然后找个QQ啊什么的一样的道理,而大部份教程也就局限在GUI上面,也就是你按了这个会出现什么样的结果。这是最表面的。
 
    再往里就是MEL, Maya Embedded Language, 在GUI得菜单按每一次都会出一个MEL命令,MEL我可以肯定的和大家说,是世界上最好学的计算机语言了,而且它是interpreted language,不需要compile和link source code。而其他比如C++一类的就不可以, MEL可以直接在Maya中运行测试。
 
    这段话翻成人类的语言就是,好比我在街上走,看到个女生,我很喜欢,我就可以直接上去要她电话,这就是MEL。那么其他就是我在街上走,看到个老外女生,我不会说外文,我就要另找一个会说我的话也会说外文的帮我问她要电话,这就是C++一类的。
 
    虽说MEL在测试上非常快,可是因为是interpreted language,source code是不停的在翻译的,那么在实际运行上要比C++来得慢。因为C++是native machine instruciton。
 
    这段话翻成人类的语言就是,那个老外帮我要了老外女生的电话了,那么我和老外女生每次交流都需要通过中间者,那个老外女生就觉得和我交流太慢了,干脆直接和那个中间者老外好了。
 
    那么在MEL的同时,Maya也可以运用C++来编程,而编写就是运用了C++ API。Application Programming Interface, API里面就是好多mayaclass,而一个plugin就是maya class的extends。 Maya class非常多,幸好在实际运用中用到的只是有限的几个常用的class。
 
    这段话翻成人类的语言就是, 我不服气,也去学老外女生的语言,非但学而且学重点的话(maya class),这样她就又跟我了。
 
    因为Maya是通过MEL来执行命令的,所以我们可以不用它的GUI,在Maya的Batch mode里来完成所有任务。
 
    再往里面呢?

    DG. Dependency Graph 广泛的被称为节点,node。
 
    这是真正的Maya心脏。如果Maya是一个大房子,那么这些就是砖块,而这些的砖块的组合方法是多样多元化的,也完全看你个人的能力,造出的房子多美观,多节约,完全看你如何安排这些小砖块。Maya的强悍就在这里体现出来了。
 
    大部份的3D软件是板块模式的,有个模型板块,动画板块,渲染板块,你可以把mentral ray, brazil理解成一个渲染板块,他们做的就是渲染,如果我在前面的板块里加入了新的东西,那么我的渲染板块未必可以渲染,因为我在写渲染板块的时候没有把可以渲染这样东西写进去,所以我就要重写整个板块,或者干脆说我不能渲。
 
    这样的模式整个限制了软件的发展,而不得不依靠很多的外接板块,而每个板块都具有一定的局限型和时间型,只要有一个板块有了改动,起到的可能是连锁效应,大大提高了开发资金和时间。
 
    Maya就能让你加入新的功能而不去改动旧有的功能,如何做到这一点的呢?

做法说穿了也就是将你可以控制得到的东西深入到最底层,什么是最底层呢?打比方说,一些软件可以做个人出来,可是不能动,只能看看,好看,就这样了。还有些软件呢,做了人后可以手脚都可以动,那你可以玩点pose,就这样了,那么再有些软件呢,你还能告诉这个做出来的人一些思维能力,他们自己也会动,就这样了。而Maya呢?他让你可以控制这个人的细胞和DNA,你可以完全操控这个人的发展,样子,思路,能力。
 
    试想一下三维事物的最底层,到底发生了什么?

    其实就是一个data被创造后,经过了简单或复杂的运算,成为了某种的可用物体,动画等等。而这些data可能是自己就可以成型,而或是需要更多的运算用的data和他相连,从而得到最终的形态。打比方,你想要做个人头,最初的阶段你可能只是创造了一个球体,而当中你拉点,切线,加面,每个命令都好比一个新的data被创造了,而这些data自己的功能就是拉点,切线,加面,做完自己的功能后就把data传到后面,直到最后的完成形体。
 
    这个就是所谓的Data Flow。而整个的大网就是pipeline.Maya运用的Data Flow技术中的Data就是所谓的DG。当然DG本身是push pull不是data flow。正因为这样的网和这样的节点,所以可以随时的更改网线的流动方法,也可以任意的加入新的节点,所有的模块都是以节点出现,可以同时存在,不用改动任何原有的东西。

    自由性在最底层发挥,运用的能力就看人了。(有时看到软件比较..哎,连资格都不具备,用什么和Maya比?)
 
    那么如果在DG节点中我想要编写一些东西呢?有些节点是带有好几个槽的,如何运用呢?Maya一样有方法!

    大多数的节点带有input, output, compute这三样基本能力,换句话说Data进去后,经过这个节点的运算,然后被输出,你可以输入任何你想输入的东西,也就是如以前所提到过的,就算你错误的输入,节点是不会做任何反抗的,节点所做的只是运算,输出。
 
    那么如果我要做一个人走路,身体走动,四肢跟进,我输入的是时间,输出的走的距离,运算的是动画曲线,那么在哪里可以让节点知道身体的移动会导致四肢的跟进呢?节点本身是没有这个能力的,所以就有了新的节点。
 
   DAG节点。Directed Acyclic Graph,其实就是DG,略微不同的是DAG是通常列出的父子关系,也就补足了DG节点本身横向连接的不足。最为基本的DAG就是transform和shape。
 
    在Maya中,任何时间创造一个物体,内部会产生2个node,一个是transform,这个可以确定物体所在的空间位置,还有一个shape,物体本身的样子。如果没有物体空间位置,从而导致Maya不知道将物体放在何处,那么这样物体是不存在的。
 
    也就是说你在Maya中对物体做任何变形,移动,选择,你所改变的是transform。并没有选择物体本身。

    以下这段对非编程人员来说,非常复杂,可是非常重要,如果想不明白,请用纸笔画一下。
 
    上面说过,节点是以Data Flow的形式出现的,这是表面现象,而内里是Push Pull。
 
    Data Flow比较好理解,打一个比方。一个老人分财产,他有10块钱,他交给他儿子,告诉他要把10块钱的一半交给下一代,于是儿子就给了10/2=5块给了老人的孙子,以此类推算下去。那么输入(input)就是10块,运算(compute)就是除2,输出(output)就是5块。
 
    那么复杂一点,老人有2个儿子,一个儿子没有后代,一个儿子有,算到老人的孙子得到的钱是2.5块。
 
    再复杂一点,老人告诉儿子,分配的方法要依据你的工作收入,家庭人员,支出需求,通货膨胀来算,而且遗产是股票基金,每个月会放出一定的百分比。老人有很多个儿子,有些有后,有些没有,有些离异又再结婚。一下子算法变得非常复杂。
 
    因为Data Flow的本质,第一个input改变后,后面所有的Data将被全部重新运算,所以在应付这样复杂的运算时,Data Flow会变得异常缓慢。

    在这样的考量下,Maya运用了Push Pull。可以把它简单的解释为注入信息和提取信息。
 
    打比方来说的话,Push Pull是这个老人的律师。他所做的第一件事就是把所有的东西算一次。然后他会问所有继承人一个重要的问题,你要不要遗产?也就是Maya会把所有的Data给于一个flag,如果需要update这个flag,Maya才会对这个data进行运算。那么如果老人只是想知道某一个子孙所得到的遗产时,其他子孙的财产是不会被运算的,所以就提高了效率。而这个就是Data Flow式的Push Pull。
 

结语:
    我承认我有很多东西没有解释。原因是我没有很好的办法去解释。三维归根结底是数学,很多我都不知道如何打比方。这篇东西的本意是解释Maya的架构,从最表面的GUI到深入的Push Pull。
 
    我不太同意有人说的:“软件不分好坏,全看人的运用。”表面上来说是有道理的,问题是这样的评语也就恰恰停留在了表面上,如果大家看了这个中篇的话,因该知道表面的运用也就是GUI而已。 如果比较的话只看GUI,那么得到的也是非常的表面。
 
    所以说本意好像是在解释架构,到了后来却大有维护Maya之意,其实没有这个意思,只是说Maya确实有过人之处,大多数人同意,却又说不出所以然,不是不明白,而是打不出比方,说不明白,那么我在试图说明白这件事。当然还是会有人反对。
 
    没有一样东西是永远的,只有不停的接受新东西才能进步。

 

我很久没写教程了,可以很不要脸的说我很忙。其实真实的原因是我不知道写什么好,如何做模型我已经写了太多了,进入NURBS的话,其实也就是知道C0,C1,C2的区别,仅此而已。模型最讲究技术的是布线(我讲了很明白了)和如何快速的用最好的办法做出东西,这个是需要大量练习的,无从教起,所以模型已经结束了。那么三维里剩下的东西呢?我很想教的是MEL,试图写一些教程,结果感觉就是在翻译英文的帮组软件,我可以说明一个command是做什么的,还能举例说明一下,可惜的是,学的人往往除了这个例子,根本不知道如何运用到实际生产上。原因归根是不明白Maya在底部究竟是如何运作的,而如何用人类听得懂的语言去解释这样的问题,在当时的我来说显得略微困难,于是我只有等自己能力的成长,所以在很长的一段时间内,我是没有教程的。 
 
    经验的成长,网络的交流,文献的阅读,导致这篇我自称为教程的理论篇,这篇的目的是把某些人的观念彻底颠覆,就好像2年多前,我把NURBS的人物带到充满着Polygon人物的世界,1年多前我把规范布线的观念带到只计较造型的人物世界,而现在我要说明Maya到底是什么,就好像前面这2样东西一样,反对的人一定会很多,国人的弊病是一旦接受一样东西了,很难去接受新的东西,而三维是个非常流行的东西,每天都在发生着变化,只有不停的接受新理论,才能不停的进步,我也时常不间断的推翻自己以前的想法的。没有必要墨守成规。
 
    重要的是,不要去害怕那些看上去很深奥的东西,只是表面现像而已,他们害怕你也去学,你去和他们竞争,所以吓唬你,取了个高深莫测的名字,发的文章也是成串的命令,说起话来也是DAG,DG,API,不知所谓的,不用害怕,我会全部用人类的交流方式说明以上所有的东西。
 
    我要解释的是Maya的架构,Architecture。

    Maya是一个允许你做错事的软件,也就是说虽然你做的命令不对,可是他一样会给你一个结果,不像其他软件,要么就是不让你做,要么就是自行调整,Maya的内部架构非常自由。你完全可以通过不同的手法来完成同样一件事,这对很多开发人员来说是梦寐以求的,而对于我们这些软件运用者来说,在某种程度上,如果我们不知道我们的做法是错误的话,我们会理所当然得认为是软件笨,人类总是以怪别人为主的。 所以有人就会说Maya的poly很傻,比不上什么什么的poly。可惜的是,他们不知道正是他们的错误命令导致了出错,而其他软件也在窃笑着:“这什么白痴命令啊,还是我帮你改一下吧。”
 
    正因为有了这个让你做错事的特性,在很多时候,犹如迷失方向,总是不能让Maya做你想做的,所以需要了解的正是Maya的架构。
 
    世界上大部份的Maya使用者在每天的工作中运用的是Maya最表面的,也就是GUI,Graphical User Interface。也就是菜单啊,腾转挪移啊,放大缩小等等。就好比你的window XP的开始菜单,然后找个QQ啊什么的一样的道理,而大部份教程也就局限在GUI上面,也就是你按了这个会出现什么样的结果。这是最表面的。
 
    再往里就是MEL, Maya Embedded Language, 在GUI得菜单按每一次都会出一个MEL命令,MEL我可以肯定的和大家说,是世界上最好学的计算机语言了,而且它是interpreted language,不需要compile和link source code。而其他比如C++一类的就不可以, MEL可以直接在Maya中运行测试。
 
    这段话翻成人类的语言就是,好比我在街上走,看到个女生,我很喜欢,我就可以直接上去要她电话,这就是MEL。那么其他就是我在街上走,看到个老外女生,我不会说外文,我就要另找一个会说我的话也会说外文的帮我问她要电话,这就是C++一类的。
 
    虽说MEL在测试上非常快,可是因为是interpreted language,source code是不停的在翻译的,那么在实际运行上要比C++来得慢。因为C++是native machine instruciton。
 
    这段话翻成人类的语言就是,那个老外帮我要了老外女生的电话了,那么我和老外女生每次交流都需要通过中间者,那个老外女生就觉得和我交流太慢了,干脆直接和那个中间者老外好了。
 
    那么在MEL的同时,Maya也可以运用C++来编程,而编写就是运用了C++ API。Application Programming Interface, API里面就是好多mayaclass,而一个plugin就是maya class的extends。 Maya class非常多,幸好在实际运用中用到的只是有限的几个常用的class。
 
    这段话翻成人类的语言就是, 我不服气,也去学老外女生的语言,非但学而且学重点的话(maya class),这样她就又跟我了。
 
    因为Maya是通过MEL来执行命令的,所以我们可以不用它的GUI,在Maya的Batch mode里来完成所有任务。
 
    再往里面呢?

    DG. Dependency Graph 广泛的被称为节点,node。
 
    这是真正的Maya心脏。如果Maya是一个大房子,那么这些就是砖块,而这些的砖块的组合方法是多样多元化的,也完全看你个人的能力,造出的房子多美观,多节约,完全看你如何安排这些小砖块。Maya的强悍就在这里体现出来了。
 
    大部份的3D软件是板块模式的,有个模型板块,动画板块,渲染板块,你可以把mentral ray, brazil理解成一个渲染板块,他们做的就是渲染,如果我在前面的板块里加入了新的东西,那么我的渲染板块未必可以渲染,因为我在写渲染板块的时候没有把可以渲染这样东西写进去,所以我就要重写整个板块,或者干脆说我不能渲。
 
    这样的模式整个限制了软件的发展,而不得不依靠很多的外接板块,而每个板块都具有一定的局限型和时间型,只要有一个板块有了改动,起到的可能是连锁效应,大大提高了开发资金和时间。
 
    Maya就能让你加入新的功能而不去改动旧有的功能,如何做到这一点的呢?

做法说穿了也就是将你可以控制得到的东西深入到最底层,什么是最底层呢?打比方说,一些软件可以做个人出来,可是不能动,只能看看,好看,就这样了。还有些软件呢,做了人后可以手脚都可以动,那你可以玩点pose,就这样了,那么再有些软件呢,你还能告诉这个做出来的人一些思维能力,他们自己也会动,就这样了。而Maya呢?他让你可以控制这个人的细胞和DNA,你可以完全操控这个人的发展,样子,思路,能力。
 
    试想一下三维事物的最底层,到底发生了什么?

    其实就是一个data被创造后,经过了简单或复杂的运算,成为了某种的可用物体,动画等等。而这些data可能是自己就可以成型,而或是需要更多的运算用的data和他相连,从而得到最终的形态。打比方,你想要做个人头,最初的阶段你可能只是创造了一个球体,而当中你拉点,切线,加面,每个命令都好比一个新的data被创造了,而这些data自己的功能就是拉点,切线,加面,做完自己的功能后就把data传到后面,直到最后的完成形体。
 
    这个就是所谓的Data Flow。而整个的大网就是pipeline.Maya运用的Data Flow技术中的Data就是所谓的DG。当然DG本身是push pull不是data flow。正因为这样的网和这样的节点,所以可以随时的更改网线的流动方法,也可以任意的加入新的节点,所有的模块都是以节点出现,可以同时存在,不用改动任何原有的东西。

    自由性在最底层发挥,运用的能力就看人了。(有时看到软件比较..哎,连资格都不具备,用什么和Maya比?)
 
    那么如果在DG节点中我想要编写一些东西呢?有些节点是带有好几个槽的,如何运用呢?Maya一样有方法!

    大多数的节点带有input, output, compute这三样基本能力,换句话说Data进去后,经过这个节点的运算,然后被输出,你可以输入任何你想输入的东西,也就是如以前所提到过的,就算你错误的输入,节点是不会做任何反抗的,节点所做的只是运算,输出。
 
    那么如果我要做一个人走路,身体走动,四肢跟进,我输入的是时间,输出的走的距离,运算的是动画曲线,那么在哪里可以让节点知道身体的移动会导致四肢的跟进呢?节点本身是没有这个能力的,所以就有了新的节点。
 
   DAG节点。Directed Acyclic Graph,其实就是DG,略微不同的是DAG是通常列出的父子关系,也就补足了DG节点本身横向连接的不足。最为基本的DAG就是transform和shape。
 
    在Maya中,任何时间创造一个物体,内部会产生2个node,一个是transform,这个可以确定物体所在的空间位置,还有一个shape,物体本身的样子。如果没有物体空间位置,从而导致Maya不知道将物体放在何处,那么这样物体是不存在的。
 
    也就是说你在Maya中对物体做任何变形,移动,选择,你所改变的是transform。并没有选择物体本身。

    以下这段对非编程人员来说,非常复杂,可是非常重要,如果想不明白,请用纸笔画一下。
 
    上面说过,节点是以Data Flow的形式出现的,这是表面现象,而内里是Push Pull。
 
    Data Flow比较好理解,打一个比方。一个老人分财产,他有10块钱,他交给他儿子,告诉他要把10块钱的一半交给下一代,于是儿子就给了10/2=5块给了老人的孙子,以此类推算下去。那么输入(input)就是10块,运算(compute)就是除2,输出(output)就是5块。
 
    那么复杂一点,老人有2个儿子,一个儿子没有后代,一个儿子有,算到老人的孙子得到的钱是2.5块。
 
    再复杂一点,老人告诉儿子,分配的方法要依据你的工作收入,家庭人员,支出需求,通货膨胀来算,而且遗产是股票基金,每个月会放出一定的百分比。老人有很多个儿子,有些有后,有些没有,有些离异又再结婚。一下子算法变得非常复杂。
 
    因为Data Flow的本质,第一个input改变后,后面所有的Data将被全部重新运算,所以在应付这样复杂的运算时,Data Flow会变得异常缓慢。

    在这样的考量下,Maya运用了Push Pull。可以把它简单的解释为注入信息和提取信息。
 
    打比方来说的话,Push Pull是这个老人的律师。他所做的第一件事就是把所有的东西算一次。然后他会问所有继承人一个重要的问题,你要不要遗产?也就是Maya会把所有的Data给于一个flag,如果需要update这个flag,Maya才会对这个data进行运算。那么如果老人只是想知道某一个子孙所得到的遗产时,其他子孙的财产是不会被运算的,所以就提高了效率。而这个就是Data Flow式的Push Pull。
 

结语:
    我承认我有很多东西没有解释。原因是我没有很好的办法去解释。三维归根结底是数学,很多我都不知道如何打比方。这篇东西的本意是解释Maya的架构,从最表面的GUI到深入的Push Pull。
 
    我不太同意有人说的:“软件不分好坏,全看人的运用。”表面上来说是有道理的,问题是这样的评语也就恰恰停留在了表面上,如果大家看了这个中篇的话,因该知道表面的运用也就是GUI而已。 如果比较的话只看GUI,那么得到的也是非常的表面。
 
    所以说本意好像是在解释架构,到了后来却大有维护Maya之意,其实没有这个意思,只是说Maya确实有过人之处,大多数人同意,却又说不出所以然,不是不明白,而是打不出比方,说不明白,那么我在试图说明白这件事。当然还是会有人反对。
 
    没有一样东西是永远的,只有不停的接受新东西才能进步。

 

B Color Smilies

全部评论2

  • ronelex
    ronelex 2006-12-29 19:45:00
    其实最好的MAYA教程就是能够说明一个命令的特性,引导读者在此基础上进行发散思维,而不是"中国特色的灌输教育"---教大家做个这个,做个那个,而往往到实际生产的时候,这些教程是根本运用不上的
  • psp870192
    psp870192 2011-5-6 08:31:40
    好東西 哈哈哈 收走了

你可能喜欢

Maya的架构 我乱讲的 
联系
我们
快速回复 返回顶部 返回列表