使用NDynamic模块进行解算
公司发的镜头一般都带有布料资产并会带有自定义的控制器,部分参数会传递到控制器上,但是这有时候可能并不能满足需求,就需要到资产内部修改子节点。
Maya解算基础
一个3D角色的服饰大多依托于角色绑定,也有部分是依托于父子关系的,父子关系的布料reference相对依托于绑定的布料问题更大一些,最好的处理方式是附加一个骨骼节点,为该布料增加权重。
maya 利用模型的点间距,通过计算点的数据传递使模型矩阵满足流体力学公式,然后通过分配切面约束和点距约束来达到模拟张力的效果,使其达到平衡状态的方法。
有布料资产的情况下解算,打开人物的reference,了解角色及控制器,查看控制器内是否有类似Dynamic或cloth或sim的字样的词条,那就是基础的控制器了。
一般这个控制器里会有一些关键的属性参数,他们与原始参数建立了连接,使用这些参数一般都可以实现简单的解算。
这样的解算一般跟著重于实现简单动画效果,从而提升动画质量。
现在有很多动画都是通过绑定来达到固定的动画效果
快速创建布料,针对没有布料资产的文件就需要自行创建。
布料的组成
一张布料是由多个shape和解算器组成的,默认情况下创建一个N布料会自动生成2个shape一个参数控制器,一个解算器组成,有时需要增加碰撞体和约束控制器。
创建布料
首先构建一个简单的胳膊和袖子’,通常情况下布料解算都是通过解算低模来包裹高模来实现解算效果,因为高模的模型复杂不利于解算,一般从动画final或绑定那里获得的资产文件高模和低模都是做好包裹的,通常不需要自行包裹,动画未进入final阶段的动画文件为了方便制作动画有可能会出现无高模的状态,这时需要请动画替换资产再进行解算。
选择绿色布料后,会注意到,Inputs下有两个节点,一个是绑定权重,另一个是根。shapes里的clothShape是要做解算的低模。
①.在创建布料之前需要注意模型的底层是否只有一个shape实体,需要打开标签。如果有其他东西需要咨询或可能是之前创建过布料后做了修改等操作剩余的残留需要删除。
②.创建布料的模型最好是间距想相同或类似的达到均匀为佳,不能出现及点小间距模型,如出现间距不统一的地方请做适当修改。
从自定义工具中选择创建布料。
如果存在解算器,则会有一个名字为Nucleus1的子选项。如果是独立个个体建议选择new选项而不是已有的。
需要注意的是上面的连个单选框。
1–local Space Output 为锁定当前创建布料为中心,这对于普通解算是必须的,让布料看起来是相对于人运动的。
2–World Space Output 为锁定为世界坐标,这样在表现长距离唯一并没有特别长动画的效果下非常有效的加速效果。这个功能开启后会发现变成了Houdini的空间效果,如果想要维持这个世界坐标并产生正常的效果就需要将角色的全部移动到世界中心位置进行解算。
在低模的基础上创建一个被骨骼带动的cloth的布料。
内部结构
首先从表面上看除了原有的cloth模型还则更加了两个节点,一个解算器一个参数控制器。
一般来说参数控制器内有且只有一个shape,如果出现两个就要小心了,这可能带来很多错误,并会给之后修改造车给麻烦。
然后来看一下shape模型。打开shape节点。
会看到一个叫outPutChoth的节点,这个节点就是现在显示出来的shape也是解算所显示的shape,这个shape会继承原始shape的材质球,并会继承原shape上的部分参数,对解算造成影响,为了后面的区分给个材质球到这个shape 上。
修改个颜色。
然后会发现attribut里会有两个lamberte证明添加成功了。
选择cloth顶层节点。
在ncloth中的edit标签下会看到Display Current Mesh和Display Input Mesh,前者是当前的展示布料后者则是原始shape。
其中左侧两排为绑定的内容,中间的clothShape为原始模型,看到他的worldMesh是输出给nClthShape属性编辑器节点的,右侧一排为解算器他的输出工程是通过下方的节点传递的,而下方nCloth有约束着解算器的输入属性。然后最后一排为最终解算输出效果的shape和刚刚为原始模型赋予的材质球。
这样的结构就会让布料的初始位置永远的和模型同步,为了让我们的布料能有一部分跟随模型解算,也就是常说的约束可以使用两种方式进行约束。
①内部约束(摆脱Input和Rest控制的约束)
同InputMeshAttract属性控制约束,默认情况下,布料是受到Attract和Rest控制的,即使InputMeshAttract参数为0,但是仍然是受控和映像的,因此这会对解算效果比较特殊的布料会造成受限而无法实现效果。
如何控制Attract参数
1、选择nCloth1节点,Ctrl+A打开属性控制面板。
2、点击DynamicPropertites标签。
3、找到InputMeshAttract属性增加其参数大小以使布料受到Attract的完全控制。
InputMeshAttract 参数建议给到1及以上以达到受限的约束效果。
InputAttractMethod 参数是约束方式,默认是不锁死的状态,另一个的锁死状态,如果非必要不建议锁死。
其他两个参数根据动画效果而调节这里不解释参数。
4、为Attract绘制权重表示影范围。
这里需要注意的是不要使用Texture的形式绘制贴图,这会增加shape面数,并且会出现控制不准确的现象。这中约束方式不会增加节点。
②外部约束(点和面的约束)
1、先将outputcloth选择为点模式,然后选中需要约束的范围,ctrl加选需要依附的模型。从快捷标签中选择nConstraint创建pointToSurface对当前选择的点和已选择的面进行约束。
2、该约束方式是以解算器的初始帧数为约束建立开始时间,通过选择的点和当前距离选择点距离最近的面建立约束。
3、这种约束方式会增加三种节点,一个是碰撞体一个是约束器节点两个转换器。
拾取碰撞体和布料的区域序号整合到约束器上然后传递给解算器,让解算器处理。
4、这里创建的碰撞体和后面创建的碰撞体是一个东西,只不过这个没有开启碰撞,但是碰撞体是激活的。并且这种碰撞体不会根据布料和模型的距离预设碰撞距离也不会指定哪个解算器,如果担心出问题就需要手动创建碰撞体。
为了布料和角色产生必要的碰撞,需要为解算器添加碰撞体以保证碰撞的有效性。
选择碰撞体为其添加为碰撞体。
然后指定需要添加的碰撞体的解算器,每个模型只能给一个解算器添加碰撞体,不能直接为两个解算器添加碰撞体,添加需要在节点编辑器中连接对应节点。
如果是添加约束时创建的碰撞体则会时未开启碰撞的状体,并不是碰撞没有添加成功。
从节点编辑器里可以看到,碰撞体时和布料没有任何关系的。
修改解算器以达到场景需求。
首先CurrentTime是当前动画帧数,这个时黄色的,并不是和创建的控制器产生关联了,而是关联的时间线,不建议将这个进行BreakConnection。
若修改了,需要在节点编辑器中创建time节点重新连接。
然后StartFrame是解算开始帧。
FrameJumpLimit为分级跳帧解算,处理一些动作太快的往返的动画解算。
TimeScale是当前的动画速度反馈,动画速度越快就需要更大的数值以影响解算速度。
这会使帧数成正比增长,如果timeScale为2就是每一帧就会产生两倍速度的解算效果,这会对解算精度造成影响,适当提高解算精度以防止穿帮。
SpaceScale 是根据角色空间场景的的比例进行调整参数,这需要了解默认的场景比例大小。
如果布料比例大于这个范围则SpaceScale相对减小。
如果布料比例小于这个范围则SpaceScale相应增大以维持正常比例。
默认的方格大小为厘米模式,若发现做了修改请换算该大小进行SpaceScale的设置。