第1章 动力学 19第1章 动 力 学Houdini的动力学系统使用可插式解算器仿真模拟显示世界中的事件,例如:两个刚体动力学(RBD)对象发生碰撞,布料渗透,弹簧和绳子等Houdini动力学系统灵活性很大,它将一些本该是被初学者所回避的东西展示出来,并且应用到复杂的后期合成当中去1.1 关于Houdini动力学1.1.1 概述用户可以使用工具架上的工具来创建复杂的仿真模拟,而不需要进入仿真模拟网络但是,如果用户想要根据自己的习惯改变所仿真模拟的行为,加快仿真模拟速度或创建新的行为就必须明白Houdini的动力学系统是如何工作的1.1.2 对象数据和解算器仿真模拟包括对象和数据对象只是数据的存放处,当用户在场景中看到对象时,例如RBD球,是因为Houdini根据惯例在浏览器和渲染器中绘制的对象的几何图形数据已经连接到了场景上在某种意义上,连接到对象上的数据是任意的数据名称和数据内容都没有限制,但是只有某些名称和类型的数据对于解算器来说是有意义的解算器计算被仿真的对象(如RBD对象、线、布曲面和液体等)如何运动解算器查看连接到对象上的数据(也可能会将一些数据连接到它们自己身上),然后使用这些数据来实现仿真,更多信息见解算部分。
当用户在工具架上创建了一个仿真对象时,Houdini会创建一个更高级别的对象,如RBD对象,用户可以进入RBD对象节点查看它是一个真正的空对象,并且连接有RBD解算器在仿真时所需要的正确数据,如图1-1所示许多动力学节点都是这样执行的,如数字资源中,封装末端网络的高级别节点只是将数据连接到对象上供解算器解算解算器将使用它所知道的数据,忽略它不知道的数据所以,用户可以将有用的数据(如标量数据)或者任何任意命名的数据,连接到另一个RBD对象的解算器上,RBD解算器会将它们忽略 高级别RBD对象 里边是一个带有RBD 在RBD设定对象节点内部是 设定对象节点的空对象 一个数据附属分支图1-11.1.3 detail view(细节浏览)detail view是用户查看下层对象和仿真数据的窗口用户可以在标签上创建一个details view窗口左边的树状图展示了场景中的对象和分类(如关系),分支代表连接到每个对象上的数据等级;右边显示在左边窗口中选中的数据区域和它们各自的值(如图1-2所示)。
图1-2该窗口可以用于检查仿真效果的结构,用户可以看到当前播放节点的帧上哪个数据被连接到了什么地方,数据包的名称和独特ID,还可以看到组成数据的数值提醒:当用户在进行仿真模拟时,细节浏览会进行动态更新用户可以用它查看数据是如何随着时间变化的,但是它会减慢仿真模拟的速度当用户不需要再使用仿真模拟从而使播放更流畅时,可以用窗口分区上的箭头将细节浏览折叠起来动力学网络的细节浏览还包含将关系可视化的 affector matrix(效应器矩阵)1.1.4 数据名称和数据共享1.数据名称每个对象和数据片段都有名称,解算器在对象上根据名称来寻找数据例如:RBD解算器会在对象上寻找一个名为Forces的数据,然后使用在对象中所寻找到的Forces数据来改变对象的位置因为节点是使用名称来连接数据的,所以如果用户试图使用同种类型的多个节点(如:两个Fan Forces)连接数据,其中一个节点会覆盖另一个节点数据;因此,Houdini使用了Unique Data Name操作,给数据名称添加一比特的文本使数据名成为唯一的名字(如图1-3所示)例如,在下面网络中(如图1-4所示),只要两个Fan Forces节点打开了,RBD对象就会有两段不同的力数据片段连接到这两个节点上:Forces/Fan_fan1 和 Forces/Fan_fan2。
因为解算器会使用它在Forces文件夹下找到的任何力,所以如上步骤很容易实现 图1-3 图1-4如果用户想让一个节点覆盖另一个节点,可以关闭Unique Data Name复选框,该节点将会被从左到右、从头到尾进行评估用户还可以在set弹出的菜单中(如图1-3)用数据名称设置控制一个节点如何覆盖另一个节点在连接数据的动力学节点上,每个文件夹都有一个弹出菜单控制右边的数值什么时候被设置在输入对象上(如图1-5所示)图1-5Set initial在仿真模拟的第一个帧上设置该数值,从该点开始,让仿真模拟控制数值Set always在每个帧上都更新该数值如果用户想要使用该数值控制每个帧,或者如果数值被动画了不能被仿真模拟控制,就可以使用该数值Set never不要改变或设置该值,哪怕是第一帧也不可以Use default使用该节点上的Default operation 弹出菜单上的设置,这种方法可以一次改变或设置很多参数策略默认状态的设置是Set initial2.数据共享对于每个数据片段,Houdini都会给每个对象连接一段新的数据备份,或者在对象之间共享某个数据片段。
在每个时间段内,Houdini都会给仿真模拟中的每个对象创建一个新的备份对于每个数据片段,Houdini都会为每个时间段的数据创建一个新备份,或者跨越时间段分享相同数据Data sharing操作控制能够跨越时间段在两个对象之间分享数据(如图1-6所示)图1-6No sharingHoudini不在对象间共享数据,它会为每个时间段创建新备份Share data across timestep在每个时间段内,数据名相同的数据可以被所有对象共享,但是每个时间段内都会创建几个新的数据备份,该选项可以用于用户所了解的、不依赖它所连接的对象的任何信息的数据上Share data across all time数据被所有使用相同数据名称的对象所共享,跨越所有的时间段该选项可以用于用户所了解的、不依赖它所连接的对象或者时间的,任何信息的数据上(即:对于所有对象来说时间都是相同的,对于整个仿真模拟过程来说时间都是恒定不变的)例如,重力可以跨越所有时间段被共享Share data across all time默认状态是no sharing,因为在该设置下才会产生和预期最相符的效果,但是如果用户知道该数据可以在对象之间或者跨越所有时间段安全共享,那么他可以使用共享操作来减少仿真模拟的记忆量;如果用户不使用共享功能,有些数据可能就要在每个时间段内都复制成千上万次,这些空间如果可以用于共享数据,实际上就是通过显著仿真模拟减少了记忆量。
1.1.5 Unique ID、对象ID和对象名称每个对象和数据都有一个绝对唯一的ID,这个128位的数字在所有时间内、所有机器上的所有仿真模拟中都是唯一的用户可以使用该数值来表明在每个时间段内数据包何时被分享或者何时被重建这个唯一的ID在细节浏览中是以对象上的一个区域和数据项来显示的每个对象都有一个对象ID,这个ID就是在仿真模拟中标示出来的一个整数与绝对唯一的ID不同,这个ID在超越了仿真模拟网络、计算机或者仿真模拟运行界限之后就不再是唯一的了每个对象都有一个对象名称,对象名称是为了方便操作,与对象的ID数字相比,对象名称更便于记忆和识别对象名称不是唯一的,即便是在同一个仿真模拟中,也可以有多个对象使用同一个名称(在很多情况下,该功能还是很有用的)在对象创建节点中(例如:RBD Object或者Empty Object),Object name参数控制被创建对象的名称如果用户使用Number of Objects参数同时创建多个对象,就可以使用本地变量$OBJ将被创建物体数目连接到名称上例如:如果Object name是brick$OBJ,Number of Objects是3,Houdini就会创建名为brick0, brick1, brick2的对象。
细节浏览通常会通过名称来显示物体,但是用户可以将它切换到用对象ID的方式来显示1.1.6 单位度 量 方 式单 位Mass(质量)kgDistance(距离)m (1 Houdini unit = 1 m)Velocity(速度)m/s续表度 量 方 式单 位Angular velocity(角速度)degrees per secondDensity(密度)kg/m3Force(力)N (newtons)注:动力学引擎使用标准SI单位因为Houdini使用米和千克作为基本单位,所以默认状态下都是描述巨大而沉重的对象说明:见关系章节和动力学节点网络章节1.2 布料仿真模拟1.2.1 概述布料解算器模拟可变形曲面,包括布料、橡胶和金属任何一个SOP几何图形不需要进行几何测量就可以转变成布料对象见关系章节中如何将布料与其他对象渗透1.2.2 工具架Cloth shelf tab(布料工具标签)包含了用来创建布块的工具用户可以使用Drive simulation shelf tab标签上的Forces工具来影响布料,还可以使用工具将布料对象上的一个点钉在某个空间或另一个对象上的一个点上。
1.2.3 重要节点Cloth object引入几何图形,作为布块使用Cloth solverCloth constraint1.2.4 有用的布料对象参数Stretch stiffness抗伸展性该参数数值越大说明布料越难被拉伸Shear抗剪切性(沿布料平面的一种力,将一个正方形拉成平行四边形的力就是剪切力当布料被悬挂在一个角上时会增加这种影响,例如桌子上的桌布Bend stiffness增加该参数值可以使布料更光滑、更抗皱1.3 碰撞1.3.1 RBD碰撞展示Houdini支持两种类型的碰撞展示:体积和薄板使用基于体积的普通物体碰撞和薄板碰撞来碰撞那些没有体积的对象1.基于体积的碰撞跟踪基于体积的碰撞跟踪为每个对象创建一个体积展示用户可以将对象的体积展示可视化,并控制如何使用对象参数Collision标签中的Volume标签上的操作来创建它为了跟踪碰撞,Houdini将一个对象的曲面展示和另一个物体的体积展示进行交叉,反之亦然几何图形的默认曲面展示只是对象的点这对于密度大、笨重的几何体可以行得通,但是对于边缘锐利、没有很多点的对象来说就不再起作用了用户可以使用边来代表曲面,在对象的参数编辑器中,单击Collisions标签,选择Surface标签,将Surface representation设成Edges。
边展示要比使用点展示浪费得多,对于许多复杂模型来说这是不必要的过度行为;但是对于某些图形,例如面上没有点的立方体,就需要使用边2.薄板碰撞跟踪如果对象没有体积(如一张纸或一个平面),关闭Collision标签上的Use volume based collision detection,Houdini将把该对象作为一个薄曲面来对待如果薄板对象与基于体积的对象发生碰撞,则使用基于体积的碰撞,但是如果两个薄板对象发生碰撞,Houdini会使用逐角碰撞跟踪注:薄板对象不好堆积,如果用户需要将薄板对象进行堆积,就应该增加DOP网。