maya nCloth 教程.docx
《maya nCloth 教程.docx》由会员分享,可在线阅读,更多相关《maya nCloth 教程.docx(37页珍藏版)》请在冰豆网上搜索。
mayanCloth教程
讲一下maya8.5的新模块(Maya甛\nNucleus".动力学系统)nCloth的一些基本概念。
相信大家都用过maya的上的布料插件syflex,其实nCloth和syflex有很多相似的地方,如果对syflex很熟悉的话,其实对nCloth的学习很有帮助。
nCloth能够做的事情比它的名字:
cloth要多的多,除了布料,它还可以模拟刚体力学,制造车祸,喷洒,切割撕裂,反正软不拉矶的东西都可以用它来生成,效果精确。
下图是摘自mayahelp文档中的一张截图,描述了nCloth的节点关系。
图中,左侧的pMeshShape是布料的原始shape节点,右侧的pMeshShape是碰撞物体的shape节点。
我们在场景中所看到的最终布料是经过nucleus等节点计算过以后所输出的outputCloth节点,这一点非常重要。
所以,首先让我们来了解一下处于核心位置的nucles节点:
见上图,所展示的场景很简单,一个pCylinder作为碰撞物体,撞击一块布,一个transform Constraint约束吊起这块布。
我们选择布,打开AttributeEditor,找到nucleus1节点,如下图:
首先,Enable勾选项控制场景中隶属于此nucleus节点下的nCloth节点的启用和禁用。
就是说,在同一个场景中,我们可以使用多个nucleus节点,每一个nucleus解算器下,建立多个nCloth节点。
nucleus所描述的,是一个动力学环境,比如第一项Gravityandwind,重力场和风,在这里,我们可以设置:
Gravity(重力),默认是9.8,单位是m/s,这个属性和模型大小有关系,以后我们会讲到。
GravityDirection,重力方向,很好理解,默认是世界坐标-y方向。
AirDensity(空气密度):
AirDensity控制的是空气的密度,同nCloth节点的两个属性Drag和Lift有关。
我们可以这样理解:
布在水中(low airDensity)和布在空气中(highairDensity)如果这个数值很低,低到0,那么布就不受风力影响了。
windSpeed(风速)
WindDirection(风向):
也很好理解,抱怨一句,虽然syflex的Delta属性不直观,但它的locator做的很直观,风向和大小一目了然,nCloth就不太直观。
==================================
GroundPlane栏不常用,它的作用是指定一个二维平面扮演一个无限大的碰撞物体,比如一个无限大的地面,它的属性包括:
方向(Origin),法线方向(Normal),反弹力(Bounce),摩擦(Friction)。
=====================================================================
SolverAttributes(解算器属性):
在这里,可以设置解算器的三个重要属性:
Substeps(精度):
就是每一个frame的解算次数,每一帧解算次数越多,则精度越高,也需要更多的计算时间。
这是一个全局的属性,在nCloth节点下,我们还可以设置每一个布料单元的解算精度。
MaxCollisionIterations(碰撞检测(times/substeps)):
当发生碰撞的时候,每一次解算(substeps)就是前一个属性中,解算器进行多少次碰撞插值,最低为一次,如果设为0,则碰撞检测关闭。
CollisionLayerRange(最大碰撞层数):
nCloth在布料间碰撞关系上引入了层级的观念,下级层影响上级层和同级层,上级层不影响下基层,这里告诉maya你要使用多少层的布料碰撞,第一层编号为0,布料层级关系是nCloth非常强大的功能,我们可以很方便的设置一个角色的毛衣和夹克衫的碰撞关系。
===================================
TimeAttributes(时间):
这里我们可以设置解算器的起始帧,默认为时间轴第一帧,这个属性会被连接到每一个下属的nCloth节点的TimeAttribute下的startFrame,我们可以手动打断这个连接获得更多的控制。
上面那个CurrentTime,我们最好不要去动它,当然,你可以试着搞一把看看会发生什么事情(什么都没有发生)
===================================
ScaleAttributes(缩放系数):
这个是比较重要的一栏,我们可以在这里对时间和空间进行缩放,默认为1,就是不做变动。
如果我们的模型是按照厘米为单位建立的,则需要修改SpaceScale为0.01,因为nCloth默认的解算单位是米。
TimeScale如果你需要得到一个“子弹时间”的耍酷效果,可以修改这个数值。
====================================
好了,这次就讲这么多,片子还在紧张制作中,我每天就抽一点之间写一小部分,其实还是鼓励大家看maya的帮助文档来的快。
这是我第一次写教程,不知道大家是否喜欢,如果有不明白的,或者我说错的地方,欢迎大家指出,我会努力回答大家的问题。
我们继续来了解一下nucleus节点各个属性对布料解算的影响。
首先声明一点:
本教程都是我自己写的,肯定有不足和错误的地方,大家还是要以maya的help文档为准。
另外呢,我写这个小教程的目的,主要是为我们这个blog做在火星上一个宣传,拉点人气,也和大家分享一下自己的经验。
我们来看一下场景,上一篇的场景我们下次将nClothShape节点的时候再用,这次我们用如下的布置:
所有设置都用默认,运行50帧。
首先来看一下重力:
重力为9.8
重力为0.98
差别很明显,我们继续将重力保持在0.98,而修改一下SpaceScale的数值为0.1
重力为0.98,SpaceScale 0.1
对比一下重力为9.8同时SpaceScale的数值为1的情况,可以看到,效果是一样的。
接着让我们来修改一下GravityDirection的方向为1,+y向上:
GravityDirection010
当你需要模拟降落伞效果的时候,可以修改这个数值。
我们来看一下风力:
现在我们看不到风的作用是因为WindSpeed默认设置为0,所以,没有风,我们修改一下windspeed为1,看看有什么效果
airDensity:
2
windspeed:
1
windDirection:
000
我们发现,似乎没有作用,原因是我们没有设置风向,所以修改一下:
00-1,让风向-z轴方向吹:
airDensity:
2
windspeed:
1
windDirection:
00-1
怎么还是没有反应的样子?
?
把windspeed调高到10:
很好,小风开始轻轻吹了,不过我们发现一个有趣的现象,重力对布料的影响变弱了:
其实是airDensity在起作用,我们给它设一个极端的数值:
0,可以看到,重力又回来了:
将airDensity设到较高的数值10:
布料发生了很大的起伏,或许,这就是我们想要的效果。
总结:
我们怎么理解这三个数值的关系:
首先把方向(WindDirection)排除,因为它就是一个向量(00-1)和(00-100)效果一样,都是-Z方向的风,和大小没关系。
不管是风还是重力,中间都有一个“空气密度(AirDensity)”作为介质,在真空(airDensity=0)的情况下,一张纸和一个铁球在重力的作用下,下落速度应该是一样的,但是如果在空气中(airDensity>0),纸的速度会变慢,重力的作用会被空气阻力消减(这个例子其实在nCloth中并不十分准确,但可以这样理解),在airDensity不变的情况下,WindSpeed就是风力的大小了。
有同学可能会想:
可不可以将airDensity或者WindSpeed设为负值呢?
答案是,airDensity如果是负值的话,则解算结果会非常奇怪,不要将它设为负值,但WindSpeed可以设为负值,其结果是把windDirection反向(X-1)。
====================================
这一节就讲到这里,下一节我跳过GroundPlane,因为它很简单。
重点要讲的是SolverAttributes和CollisionLayerRange。
2007年7月30日,电影史上最悲痛的一天,英格玛伯格曼和安东尼奥尼永远地成为史书上的传奇。
好,这次我们来看一下nucleus节点的SolverAttributes栏下的三个属性
Substeps:
直译过来就是“子步”,我们就当作解算精度来理解,即每一帧的计算次数,默认为3次。
什么时候需要改动这个数值呢?
我们来看下面这个场景:
从第0到第50帧,一个pCylinder快速沿+Z方向穿过悬挂的布料。
我们以默认值看一下圆柱穿过布匹的那一帧。
(补充一下:
在作布料演算的时候,回放速度必须是playeveryFrame或更低,除非你的CPU比PS3的强大。
以后我们会讲到如何运用回放速度这个选项)
结果非常糟糕,如果你遇到像这种碰撞物体快速移动的情况下,可能需要提高Substeps的数值,我们尝试一下将Subsetps设置为6,12和24:
Subsetps=6
Subsetps=12
Subsetps=24
观察解算结果,发现,当Substeps从3提高到6的时候,效果非常显著,结果可以让人接受,数值为12的时候,已经非常好了,如果再高到24就浪费了。
实际工作中,我们需要反复尝试一下,找到最合理的数值。
下面我们看一下MaxCollisionIterations(最大碰撞检测次数),这个数值是指,在每一个Substeps,发生碰撞事件时,所做的碰撞检测次数。
我们来实际看一下它的效果,Substeps改回默认的3,MaxCollisionIterations分别为6、12、24:
MaxCollisionIterations=6(default)
MaxCollisionIterations= 12
MaxCollisionIterations= 24
是不是发现了MaxCollisionIterations和Substeps对解算结果起到了同样的效果?
没错。
那我们怎么区分和设置这两个看上去十分相似的数值呢?
如果你足够细心的观察图中布料的下摆,你就会发现它们之间的一个显著区别。
当我们修改Substeps属性的时候,随着数值的提高,布料下摆变得越来越光滑,而MaxCollisionIterations却没有这个效果。
我们可以这样去理解这两个数值的关系,MaxCollisionIterations是Substeps的子集。
Substeps对布料的全局精度,方方面面都有影响,而MaxCollisionIterations只对布料碰撞事件发生影响。
最后,我们来看一下nucleus的重头戏:
CollisionLayerRange(碰撞层范围)。
说碰撞层范围,我们就不得不提前提到碰撞层的概念了。
我们来看如下场景:
大家有没有用过Syflex的碰撞层哦,是不是还记得在Syflex里面,两层布料如果要做碰撞,那是费了老劲了,拓扑要一样,大小要一样,还有一堆参数。
当我拿到nCloth的帮助文件,我差点跳起来了,太他妈好使了。
在这个场景里面,两块布料大小不一,拓扑不同,但nCloth就不管这些琐碎。
先讲一下nCloth的碰撞层是怎么回事,然后我们再来看实例。
不管是布料(cloth)还是碰撞物体(Passive或者collisionMesh)都被指定了一个所属的碰撞层(在nClothShape节点中):
每一个碰撞层都有一个编号,从0开始为第一层,依次类推。
每一个层内,可以指定任意多的nCloth物体,当发生碰撞的时候,编号较低的层中的nCloth对编号高的层中的物体,扮演PassiveObject的角色,高层中的物体对低层的物体只扮演被碰撞的角色。
如果两个cloth物体处于同一层,那么他们之间会互相影响。
这么说可能有些糊涂,我们来看实例:
球体是一个PassiveObject处于层0,中间带棋方格的布料和球体处于同一层(0),最上层的布料,处在编号1层。
碰撞检测就有一个自球向上的过程。
好,如果我们将棋方格该到层2,看看解算结果:
棋方格被上方的布料狠狠的压制住,毫无反抗能力,连四角的约束也救不了它。
因为它的层编号高于上层布料。
我们再把棋方格的层编号改为3:
看到,结果是一样的,虽然发生了层级的跨越。
collisionRangs 决定了两个对象之间所能发生碰撞的最大范围,如果超出这个范围,则不发生碰撞,计算公式:
clothA的层号 -clothB的层号的绝对值减去collisionRangs的值<0则发生碰撞,否则不发生碰撞。
则我们可以通过设置这个数值来排除不需要的碰撞事件。
(感谢火星时代bbs论坛上的ID“盗亦有道”同学的指正)
在我现在进行的短片中,CollisionLayerRange足可以对付如此复杂的碰撞关系:
===================================
好了,今天就讲到这里,明天我们来解决nucleus节点下的最后两个项目:
TimeAttributes和ScaleAttributes,借用乱讲老师的一句话:
不要光看,要练啊!
谢谢大家的支持
。
通宵,和fluid干上了,云彩和大海,现在头还有点晕~,所以下文中可能发生语无伦次,跳切越轴等的状况,请大家谅解。
另外这部分内容需要大家自己做解算才能体会到区别,我截图也无助于说明问题,所以就干写了,也请大家谅解。
昨天北京突降雷暴雨,我的adsl被雷打击了,所以更新的有点晚~还请大家谅解。
====================================
今天我们来解决nucleus节点中最后俩节目:
TimeAttributes和ScaleAttributes,先来看TimeAttributes(时间)。
没有时间就没有空间,也就没有布料的解算,在这一栏中,有两个半属性,为什么说是两个半呢,因为CurrentTime被连接到了场景中的一个“绝对存在节点”--Time,time节点,没道理可讲,就是输出当前帧。
你可以去打断这个连接关系,但我想不出这么干的理由。
startframe(解算起始帧):
很好理解,但并不如你想的那么简单,我们打开hypergraph(很多书上翻译做:
超图,很酷的翻译,但hyperShade为什么不叫超影呢?
后来我才明白,原来金山词霸把hypergraph翻译做超图...)节点管理器,在节点管理器中,展开nucleus的上下游连接我们发现,nucleus.outTime输出到所有下游的nCloth节点的nClothShape.currentTime.记住这个连接关系,后面我们会提到这点。
===================================
ScaleAttributes(缩放系数):
这个数值是用来和时间和空间相乘的,如果设为2,前面提到的那个“绝对存在节点”Time就会以两倍的速度输出时间,加快解算过程。
但是施加在布料的上力的效果也会增加,最终的结果是解算结果变的极不准确(我自己的实验结果)。
那如果减小这个数值呢?
比如0.1,其结果是解算结果变的更加漫长,布料行为变得无比优雅轻柔,近乎失重。
spacescale对于我们来说更加有用处,主要和你的建模的时候所采用的尺寸有关,前文说过,ncloth的解算采用米为单位,如果你的模型是按照厘米建立的,那么默认9.8的重力可能就太大了,将spacescale修改为0.01可以得到正确的结果。
我一般修改为0.1,因为我们都要求按照1:
10的比例建模,可能有些同学从来没有想过建模还要考虑比例,那你就需要为自己的模型找到一个比例尺。
如果不注意比例尺这个问题,那么在动力学解算的时候,可能就会心里没个谱了。
====================================
好,nucleus节点我们就讲完了,我有讲错的地方请大家一定要告诉我,不要一个人偷着乐,如果还有不明白的地方,发帖问,我一定会回答的。
下一节开始。
。
。
让我想想,讲怎样建立一个nCloth场景吧,然后我们就可以继续交流怎样设置nCloth节点。
开始工作之前,找一下创建布料所需要的菜单,把菜单组该到nCloth
从上到下,依次为:
创建nCloth对象,创建碰撞物体,赋予解算器,获取nCloth实例文件,删除nCloth对象,删除历史纪录,显示原始shape节点,显示输出shape节点,nCloth节点属性标签的显示和隐藏,交互式回放。
看上去很多的样子,我们慢慢来讲。
首先搞一个ploy的plane,起个名字flag,subdivisionswidth/height设置为15,以x为轴旋转90°,设置scaleX=2,scaleZ=1.25,世界坐标向上移动0.625,放着别动。
我们来观察一下这块“布”:
首先看尺寸,我们做nCloth要养成习惯,先问尺寸,不光要问自己,还要问和你合作的模型师,要个比例尺,我的maya(也是多数人的maya)默认单位是厘米,一个格子就是1*1厘米(默认网格),我们这块布,2*1.125厘米,就是说如果现实中长1米,高0.625米的布,那么我们的比例尺就是0.625,得到这个比例尺,我们就要可以去调整那个spaceScale和重力的数值了。
(0.625,6.125),多说一句,关于重力,虽然理论上是有一个“准确的数值”存在,比如9.8,但实际上,在Autodesk的工程师的blog上,他们推荐尽量使用小的数值,这样可以得到比较好的结果,所以我们采纳这个建议,取一个整数6。
选择这块布,(保留历史和transform的数值),打开CreatenCloth的optionBox,可以看到两个选项,spaceoutput解算空间矩阵和solver(建立/重用解算器):
不要被我的倒霉翻译唬住了,没那么复杂,spaceoutput决定采用哪个转换矩阵来进行布料解算,物体空间或者世界坐标。
一般我都无视这个选项,直接用默认的localspace,但我还是解释一下。
当采用localspace的时候,我们能得到可靠和准确的解算,因为inputMesh和outputMesh同时受到nucleus节点的影响,也就是说,原始Mesh和解算用的Mesh共享一个变换矩阵(transformnode),再大白话,inputMesh跟着outputMesh走!
如果使用worldSpace,IM和OM将处于不同的transformNode下,文档中解释说,这样更有利于做布料缓存。
就我自己的经验来看,貌似可以忽视这点优势。
solver(解算器):
如果场景中没有nucleus解算器存在,那就新建一个,反之,你可以选择新建一个,或者使用已有的解算器。
要注意的是,如果两个nCloth对象处于不同的解算器下,他们之间将不会发生解算关系。
我们选择localSpace和CreateNewSolver,创建布料:
那个绿色的是新创建的nCloth节点的选择handle,选择它就选择了nClothShpae节点。
在我们按下创建按钮以后,我们需要观察一下场景中发生了些什么。
选择handle,打开hyperGraph,展开上下游连接:
我们观察一下DG图,看到中间那个亮灰色的shape节点,那个就是我们一开始创建的pPlane的shape节点(它上面的polyPlane1是我们创建pPlane时候的历史记录),也就是inputMesh最右边的meshShape就是我们在场景中看到的那块布料,也就是outputMeshnCloth1节点是一个transform节点,下面是一个nClothShape,所有的布料属性就在里面。
我们播放一下动画,布料随重力下落了。
我们进入元素选择模式,选择角上的几个vertex:
然后给它加一个transform约束:
看到出现一个绿色的locator,关于约束,我会在后面详细介绍,这里就略过了。
我们播放一下(记得我上一节提到的注意事项):
好了,这次就先说到这里。
下次重点介绍nCloth节点的众多属性,争取让旗子飘起来。
这一节我们开始介绍nCloth节点,首先来看一下布料的碰撞属性,我们继续使用上一节使用的场景-flag
观察一下默认的运算结果,似乎还不错,没有发生穿插。
先看一下和碰撞和自碰撞相关的几个属性:
Collide(碰撞):
打开或关闭控制布料和其他物体之间的碰撞检测。
selfcollide(自碰撞):
打开或关闭布料自身的碰撞检测。
当我做布料的时候,可能发生这样的情况:
在所能忍耐的极限下,还不能得到很好的自碰撞结果,而且这些自碰撞检测对于镜头来说并不重要,这个时候我就干脆关闭布料的自碰撞,轻微的穿插还是可以允许的。
CollisionLayer(最大碰撞检测层数):
前文已经阐述过,请留意我的“勘误”。
Thickness(全局碰撞厚度):
其实就是布料的厚度,这个厚度值是可以在场景中实时看到的(见下文)。
SelfcollideWidthScale(自碰撞厚度缩放系数):
这个数值被拿来和Thickness相成,默认是和布料厚度一致,我们可以修改这个数值来得到我们所要的效果。
SolverDisplay(显示解算厚度):
刚才我说了,布料的厚度和自碰撞厚度是可以被实时看到的,就是在这里设置:
在下拉菜单里,默认是off,关闭显示。
下面依次是:
a)
b)
c)
a:
碰撞厚度 b:
自碰撞厚度 c):
拉伸Links
d)
e)
d:
弯曲Linkse:
解算优先权
以上的翻译并不准确,完全是根据我自己的理解,我逐个做一下解释:
a:
对于自碰撞厚度来说,它是通过对布料mesh点的偏移(offset),来求得一个用于碰撞解算的shell(壳),我们近距离观察一下:
可以看到被壳包裹在内的outputMesh。
需要特别指出的是,壳的显示形态是随着CollisionFlag(碰撞检测参数方法)的变化而变化的,在这里,牵扯到的知识点一下子拓展开了,别急,慢慢来。
nCloth布料的碰撞参数有三种:
vertex,edge和face:
vertex:
顶点碰撞,在没一个顶点建立一个碰撞球(collisionsphere)计算碰撞.
edge:
边碰撞,在每一条细分后的e