目录
Cloth
Breaking and tearing
Paneling and draping
Cloth simulation
Calculating mass and thickness
Working with low res and high res cloth
Quick moving cloth
Softbody
Vellum softbodies
Plasticity with softbodies
Constraints
Stitch and sliding constraints
Plasticity
Triangle and tetrahedral stretch constraints
Animated pressure constraints
Dynamic constraints
Shape matching
Constraint browser pane
Collisions
修正碰撞穿插
摩擦力
Advanced
Setting up a 64-bit solve
vellum attributes
Tips and troubleshooting
Cloth
Breaking and tearing
Edge Fracture节点可很容易的切开几何体(可手动绘制断开位置),以便断开或撕裂;使用Vellum Weld Point节点焊接接缝,然后根据特定条件来断开;
Normalize Stress默认开启的,总是归一化应力,以便子步变化时被计算的值更加可预测;这对基于应力阈值,断开约束非常有用,因为可在改变子步时不必调整值;如碰撞体非常快,需要增加子步时,可能只需稍微调整阈值;也适用于基于密度计算的mass,如改变的布料的精度,应力仍然是一致的;这使得在子步和分辨率中,更容易设置值;
以下案例展示相同布料在不同分辨率和子步下的应力阈值,结果是非常相似的:
Paneling and draping
Paneling工作流
- 导入T-pose角色模型;
- 绘制衣服版型轮廓线,应比角色大些以便包裹角色(应绘制多笔曲线);
- 在添加resample,以调整每笔的点数;
- 在使用fuse,将点合并到一起;
- 在使用Planar Patch from Curve节点,构建均匀三角形面片;
- 勾选Resample Curves,确保曲线的边缘间距与内部边缘长度相匹配;
- 降低Interior Edge Length,提高精度;
- 旋转Smoothing->Subdivision Curves;
- 在创建其他位置的布料面板模型;
- 在使用Vellum Configure Cloth节点,配置布料;
- 在使用Vellum Stitch Points节点,缝合接缝,设置约束长度为0;
- 在使用Vellum Weld Points节点,焊接接缝,使接缝完全在一起;
Draping工作流
- 创建布料面板模型,与Paneling工作流一样;
- 在添加Vellum Drape节点,可自动缝合接缝;
- 如布料难以包裹角色,应增大面板,也可在增加一个Vellum Drape节点(勾选Inflate Collisions);
- 满意布料结果后,使用Vellum I/O缓存,在使用Vellum Rest Blend设置当前约束为起始状态;
Cloth simulation
将已drap布料转为起始几何体
- 一旦布料drap后,即可后续解算保持约束,也可将其转换为起始几何体;
- 转化为起始几何体,将会丢弃任何已设置的stiffness,可重新使用,也确保系统中没有更多的能量;
- 使用Vellum Post-Process,是快速焊接点的好方法;
- 为确保法线一致,可使用Polydoctor节点(勾选Correct Winding of Polygons to Majority of their Manifold Patch);
- 然后在使用Vellum Constraint节点;
注:确保没有冲突的ID属性;新约束是厚度会被设置为0.01(默认),应确保厚度合适;
解算布料时应考虑的事项
- Substeps、Iterations,决定布料的拉伸性,子步为5对布料是一个好的开始;
- Tailoring,一些小的改变可能会很大改善最终效果,如根据角色的步伐,增加裙子的宽度可防止衣服底部的拉扯;
- Static,通常衣服会在身上不切实际的移动,增加静态摩擦系数以更加贴合角色;
- Bend Strength,值为0将有大量的褶皱,值越高越硬;
- Compression Stiffness,压缩刚性,可使三角形折叠而不展开;
- Tangent Stiffness,对附着在腰上的裤子或裙子解算非常有用,避免因重力掉落或滑动,比降低Rest Length Scale效果更好;仅在attach约束起作用,是vellum对外部几何体;
- Stiffness Dropoff,降低或增加约束刚性,在远离起始状态时;
- Air resistance,气流对布料非常重要,没有气流布料会变平,太大的气流则会被drag,默认值为0.1,通常会产生很好的效果;
- Gravity,改变重力可使时间好像变快或变慢,也会影响比例,增加重力会有更大的拉伸;
Calculating mass and thickness
默认会自动计算mass和thickness,即改变vellum精度时解算效果不会改变太多;特别是对弯曲,较重或较轻的布料其褶皱大不相同;该方法是使用polyline的长度,三角形的面积,四面体的体积及密度density来计算mass,使用边长度来计算thickness;
质量Mass,Calculate Uniform均匀的在所有点间分配质量,但对精度或布线不均的会产生问题;Calculate Varying(默认设置)分配的质量会与周围面积相匹配,点密集的区域质量相对较小;默认的Density参数0.1是针对布料的,其他预设类型约束Density参数会针对其类型有所不同;
厚度Thickness,Calculate Uniform(默认设置)是基于每个面中边的平均长度,可避免过多的自碰撞并保持均匀的厚度,均匀统一的厚度是默认的设置,可像布料一样平整;Calculate Varying将自动根据布线的密集程度调整pscale大小,对角色来说是有用的;
Working with low res and high res cloth
布料的stretch/bend的方式非常重要,起皱的程度和快慢可看出布料的材质;在处理mass/scale/topology时确保pscale属性正确,以使不同精度的材质看起来一致;调整精度时,Vellum Constraint节点会自动调整mass(总质量不变)、pscale(相对距离不变);
Quick moving cloth
快速移动的对象,将使与之一起移动的布料聚集能量,如整个角色或角色的一部分快速移动;Velocity Blend参数和Refrence Frame节点,可用来生成更加理想的结果;Velocity Blend是通常用于快速移动的身体部分,如摆动的手臂;Refrence Frame节点通常用于快速移动的整个角色,如超级英雄和他的斗篷;
Velocity Blend
- Attach to Geometry约束的Velocity Blend参数,可避免突然运动引起的问题,对跟随快速移动手臂末端的袖子也很有用;要求目标对象有速度属性v;
Reference Frame
- 参照参考对象的几何体,类似Velocity Blend,但适用于整体而不是局部;对快速移动的角色或作为其他环绕对象的父对象有用;
- 可与Velocity Blend一起使用,如角色移动的很快,同时手臂向上猛拉;
- wind force对角色快速移动很重要,Drag Compensation参数可调整任何风速;
- 确保Refrence Frame节点上的子步和解算器上的子步相同;
Softbody
Vellum softbodies
PBD柔体的主要优点是其可控性、稳定性、及可快速产生可信结果;尽管FEM是创建柔体的有利方法,只是世界的准确性和行为,但vellum是非常快,可多种约束;依据场景和要制作柔体的类型选择方法;
Vellum Struct Softbody工具,使用在内部点间随机随机形成的支柱,来创建粗略保持体积;仍然是对原始几何体进行模拟;
Vellum Tetrahedral Softbody工具,会polyreduce、remesh以创建一个低精度的代理模型,并四面体化;创建四面体后,沿边将距离约束以保持对象的整体形状,创建体积约束以保持每个四面体的体积;解算完后,使用point deform变形原始几何体;
尽管vellum balloon、vellum struct softbody、vellum tetrahedral softbody看起来都像可延展黏糊的物体,但其主要区别是保持体积的方式;
- vellum balloon保持全局体积,是使用压力约束均匀向外,挤压一个区域会膨胀另一个区域,类似气球;
- vellum tetrahedral softbody更多的保持局部体积,因为每个四面体都保留体积,对有机材料很有用;
- vellum struct softbody根本无法保持体积,使用的是内部支柱,类似里面有一组弹簧来保持形状;
Vellum Fiber 是柔体约束的一种类型,会沿着纤维方向压缩,如有保持体积会在另一个方向扩展;
Plasticity with softbodies
塑性可使用物体在受到特定力或外部碰撞时,适应新的rest形态;通常对布料应避免塑性,然而柔体约束(如Tetrahedral Stretch)能很好的适应塑性;使用vellum tetrahedral softbody与vellum constraint结合使用,可获得逼真的结果;
有三个重要的参数控制柔体的塑性:
- Plasticity Threshold,变形超过此阈值,将适应新的rest;
- Plasticity Rate,适应新rest的速度;
- Plasticity Hardening,适应新rest的更硬还是更软;
上例制作文件:An Introduction to Vellum Soft Bodies | SideFX
Constraints
Stitch and sliding constraints
stitch约束可点到面,不仅仅是点到点,对缝合布料非常有用,缝合到最近位置对polyline也起作用,可创建平滑和真实的滑动;
Sliding Constraints
滑动约束是stitch或attach约束可在目标表面滑动,启用Use Closest Location on Primitive(仅在polyline、triangle、quad有效),及Target Group Type为Primitives;Sliding Rate控制滑动快慢,1表示匹配约束速度;
Tangent Stiffness会减缓滑动,此时可增加sliding rate;
Plasticity
在vellum里,但对象被弯曲或拉伸时,会恢复到原始状态;当启用Plasticity时,一旦超过阈值就会保持新的状态,常用于Hair;在Shape Match约束,塑性也是有效的;可通过Stretch Plastic Flow、Bend Plastic Flow查看;
注,vellum很难创建非常坚硬的材质,如金属片,可使用Bullet Soft Constraints;
Triangle and tetrahedral stretch constraints
ARAP是H18引入的一种约束,可忽略旋转,同时最大限度的减少stretch或shear;会产生类似弹性的效果,以恢复原始形态;此约束作用于三角形或四面体的整个形状,而不仅仅是边;这对有机材质或需要自然拉伸或压缩特别有用,会更平滑;Cloth约束也有Triangle Stretch选项;
启用Preserve Volumes会应用额外约束,强制保持体积(类似tetrahedral volume约束);
Tetrahedral stretch约束也可很好的塑性,塑性改变的时形状不是体积;
Animated pressure constraints
气球对应两种约束,外部表面可拉伸的cloth约束,及避免塌陷的pressure约束;pressure保持全局的体积,挤压一边,另一边会膨胀;点属性pressurescale属性可缩放pressure效果,同时应设置restlength属性;
Dynamic constraints
通常在解算前设置约束,但也可在解算过程中设置约束(即在DOP内的force_output处,创建vellum constraint),如glue;
Shape matching
使用shape mathing方法,在vellum中刚体模拟;是用球填充对象的体积,尽可能的接近对象外形;将球约束在一起,创建类似刚体的结构;球与其他对象碰撞计算是非常快的,此方法适用于大量对象;
shape matching基于vellum grain,使用Sphere Packing模式来填充对象;球的大小可以统一或可变,以捕获较小的结构,球还可重叠以更好表示对象,但无论如何都是近似的;
Vellum Configure Grain Pieces会创建vellum grain和vellum shape match,解算完后在使用Vellum Transform Pieces节点来驱动原模型;
不支持老的芯片架构,如有问题将GPU改为CPU;
Constraint browser pane
此面板可组织、创建、编辑约束(RBD或Vellum);依据tag,来确定自定义的主层次hierarchy(列出所有约束),同一个tag多个约束类型被添加为约束layer;
- RBD,layers由constraint_name属性定义,tag由constraint_tag属性定义;
- Vellum,layers由type属性定义,tag由constraint_tag属性定义;
Collisions
- collisionignore(vellum字符串点属性),碰撞对象的名字,用于指定特定对象忽略碰撞,可使用POP Collison Ignore节点,如PackedGeo对象有面属性objname,则此属性表示对象名称;
- collisiongroup(碰撞体字符串点属性),可针对对象的一部分设置碰撞,如角色的拇指;这对于清理布料和角色间的交互非常有用,如想手指和袖子交互而不和口袋交互;
修正碰撞穿插
当碰撞体自身穿插时,可将整个碰撞体作为cloth对象,对穿插位置使用pin软约束(其他部分使用pin硬约束),还可使用peak节点稍微增加一点厚度(为布料创建更多空间),以在解算时变形修复穿插;
摩擦力
解算器Static Threshold参数,由属性friction控制(如无此属性默认为1),解算器Dynamic Scale参数,由属性dynamicfriction控制;如两布料碰撞,其中一布料摩擦力乘以另一布料摩擦力,再乘以全局摩擦力,就为碰撞的静摩擦力;
Advanced
Setting up a 64-bit solve
解算布料或毛发离原点超过10000个单位,可能会引起布料褶皱或头发缠绕的问题;将对象移动高离原点更近的位置即可解决问题,还可使用64位以获得更高精度(通常不建议,速度明显变慢);
解算器没有选项在64位操作,为将几何体设置为64位:
- 在vellum configure cloth前,使用attribute cast节点,确保几何体和约束都是64位精度;
vellum attributes
设置属性
Type Name Description vector materialuv Geo点属性,可由Planar Patch/Planar Patch Curve设置,用于确定各向异性; float bendname, stretchname Geo点属性,默认缩放约束属性;
解算Geo属性,所有POP属性均可应用:
Dynamics: parameters
Type Name Description float dragnormal, dragtangent point,阻尼影响最终速度; float inertia point,hair约束旋转阻力; integer weld, branchweld, collisionweld point,默认为-1;
weld是用户访问,branchweld是hair约束构建,collisionweld按需生成为detangle节点;
float friction, dynamicfriction point/detail,缩放静摩擦力和dongle摩擦力; float pressurescale point,缩放pressure约束效果,可用于充气效果;
Dynamics: state
Type Name Description vector P, pprevious, plast, v, vprevious, vlast point,二阶算法,先前一帧位置和速度,及先先前一帧位置和速度; point, vector orient, orientprevious, orientlast, w, wprevious, wlast point,对于hair的点方向和角速度; integer stopped point,可被自动休眠及唤醒使用(标准的POP属性),还可释放pin的点(而不是对mass为0操作);此属性可控制方向和位置,0都不控制,1控制位置,2仅控制旋转,3都控制;
integer dead point,标准的POP属性,值为1点及对应的约束均会被移除,可使用POP Kill节点设置;
collision
Type Name Description float pscale point,每点半径; integer layer point,软度优先级,越大越轻; integer disableself, disableexternal point,值为0表示可自碰撞和外部碰撞,值为1表示禁用碰撞;只要边或三角形任意一个点的值为0,则整个边或三角形都禁用; float overlap_self, overlap_external point,默认值为10000,储存原始pscale的重叠度,0表示已完全使用pscale; string collisionignore point,vellum点禁用与指定的对象碰撞; string collisiongroup point,待禁用的碰撞对象点组;
Targeting
Type Name Description string, integer target_path, target_pt point,attach目标路径及点号; pintoanimation, gluetoanimation point,pintoanimation更新位置,gluetoanimation更新位置及方向; float targetweight point,影响pin点的强度?
Breaking Type Name Description float, string breakthreshold, breaktype point,weld/branch weld类型,断开;阈值小于0将不断开;
Pressure Type Name Description vector, integer pressuregradient, volumepts, volume point,pressuregradient体积增大的方向类似法线,volumepts计算点体积的点数组;
内部变量 Type Name Description float dP, dPw point,约束置换及权重; string patchname point,标识每个vellum对象的名字;
解算Con约束属性,由许多类型的约束,其意义取决于约束类型,通常是面属性:
Dynamics: parameters Type Name Description float dampingratio prim,值在0~1,高于0.1可能会阻止约束收敛; float restlength, restlengthorig prim,初始约束状态(距离或角度等),实际仅使用restlength,restlengthorig为方便; point restvector prim,存储方向约束,及pin约束的目标位置; vector rest point,被shapematch约束使用的起始点位置; float stiffness prim,约束强度,较高的值可能需要较高迭代; float compressionsstiffness prim,压缩约束强度,较高的值可能需要较高迭代; float stiffnessdropoff, stiffnessdropoffmin, stiffnessscaled(解算时) prim,超过指定的阈值,刚度从stiffness~0或0~stiffness;解算时有效的光效值存储在stiffnessscaled; string type prim,约束类型
distance、stitch、branchstitch 约束点长度,distance约束距离(如三角形或毛发的边),stitch距离约束的别称,branchstitch用于hair的自动焊接; ptprim stitch点到面的约束,restvector存储prim uv; bend 四点弯曲约束,表示共享边的两个三角形,约束共享边的角度; trianglebend 三点约束,保持线的弯曲;? angle 三点约束,保持二面角,被string约束使用; tetvolume 四点约束,保持四面体体积; pressure 多点约束,表示mesh表面的所有点,保持体积; attach、pin 约束点到特定位置,attach依据target属性,pin根据matchanimation属性; attachnormal attach to geometry的额外约束,约束目标对象方向(由restdir指定); pinorient 约束点方向; bendtwist 两点约束,将边点方向一致,可沿hair方向创建扭曲效果; stretchshear 两点约束,距离约束和弯曲约束的组合,被hair使用; tetfiber 四面体约束,可沿materialW方向压缩; triarap 三角形ARAP拉伸约束,可最大限度地减少与起始形状(restvector)偏差; tetarap* 四面体ARAP拉伸约束,可最大限度地减少与起始形状(restmatrix)偏差; shapematch 保持原始形状(rest)的约束;
Dynamics: state Type Name Description float stress 约束施加的应力大小;
Sliding Type Name Description float slidingrate prim,滑动速率; string target_group, targetpath prim,目标位置; string slidingattrib, attribpromote prim,缩放滑动速率;
Breaking Type Name Description float, string breakthreshold, breaktype prim,断开约束的阈值及类型,阈值小于0将不会断开;
Plasticity Type Name Description float plasticthreshold 塑性阈值,修改restlength;如值为负,将视为拉伸比率; plasticrate, 塑性速率,设置为0是禁用塑性的最简单方法; plastichardening 塑性后的刚性 plasticflow(解算时) 塑性流的大小量;
Targeting Type Name Description integer matchanimation prim,如对pin约束设置为1,将查找target_path和target_pt,更新restvector到指定位置,以便跟随目标动画;
内部变量 Type Name Description vector L prim,约束量,可能是不同刚性或压缩刚性轴;通常应使用stress属性来确定约束量; integer pts prim,被该约束影响的点;
Tips and troubleshooting
Sources
- vellum使用连续的碰撞检测,可很好的避免快速运动穿过布料,如几何体点数是变化的则就不起作用了;
- 尝试和下一帧模型blend,查看是否融合,如否,检查是否有id属性(会覆盖点号),也可使用match topology节点是点号在帧间一致;
- vellum只关心前一帧的点,不介意在每帧中对prim数随机;
Pscale
- 默认pscale很小,但输入的任何pscale属性都会超过它;
- vellum与不太小的pscale效果最好,会在碰撞体顶部,而没有剧烈碰撞;通常,pscale不要超过边长,否则可能会相交;
- vellum会预处理(类似bullet),即使点在彼此之上,也不会爆开;会记录原始距离在属性上,用于降低pscale对于碰撞;当布料分离时,这些属性会松开以使布料返回不会太靠近;设置过大的pscale可能也不会爆开,但会用大的pscale碰撞测试,导致布料缓慢停止;
Speed vs Quality 四个主要的区域,可使解算又快又好:
- substeps,对快速运动的布料很重要,如在单个子步内有太多的碰撞和变化,可能会减慢速度,使用较小的子步会提供更好的碰撞边界;
- Constraint Iterations,使拉伸和弯曲起作用,需要更高的迭代以获得刚性、无拉伸、无弯曲;如增加子步,力的量会有效的减少,因此会减少迭代;
- Collision Passes,外部和内部碰撞都可处理,会在约束迭代中穿插着执行;如50迭代5碰撞,则每10迭代1碰撞;增加此值有助于失败的碰撞,但也考虑增加子步;2子步10碰撞与1子步20碰撞,成本大致相同,但前者可能会更好;
- Post Collison Passes,在所有约束迭代完成后,在执行此额外的操作;由于此过程不与约束交互,布料会以碰撞外形推出,是避免碰撞失败的最后一次尝试;
Resolving problems
-
Stretchiness,XPBD在不过度刚性方面很好,如没有足够的迭代会无法收敛;如拉伸开了,增加约束迭代;增加子步也可解决,但迭代会更加便宜;
-
Protrusion problem,突出问题,如高精度布料与尖锐几何体碰撞,可能局部会变形(因为碰撞解算完全是局部的,仅移动碰撞点);
-
可增加Collision Passes,Substeps;
-
- Failed collisions
- Thickness,默认布料非常薄,使布料更厚可提供更多空间以对剧烈的碰撞,但不要大于边长;
- Substeps,可减少错误,高精度布料需要高子步;
- Post Collision Passes
- Layer Shock,层数越高点会越轻;
- Asymmetric solves
- vellum使用的是Gauss Seidel而不是Jacobi,可快速收敛,但此过程不会平滑的更新;如没有完全收敛,会得到奇怪的不对称结果;因为误差会集中在一部分区域,不是均匀分布;使用Smooth Iterations参数解决上述问题;
- Unruly objects
- 有时物体无视能量守恒,开始加速或旋转;
- 一种原因可能是自穿插,特别是pscale过大;可使用塑性,来一层内部的能量;
- 另一种原因可能是没有收敛,能量不对称的留着系统中,甚至会引起没有自穿插的旋转,特别是在pressure和strut约束中;增加Smooth Iterations和Damping可避免;有时可随机排序约束,或随机排序点(在构建约束前);
- Unstable pins
- hard pin与强bend约束,可能会引起不稳定;使用软约束,Smooth Iterations可解决;
Restarting sims 当使用drap的输出或先去解算的作为起点,必须注意属性:
- IDs
- 合并多个,检查id属性是否冲突;
- 如删除prim,检查约束是否一致;
- 检查weld点位置是否正确;
- 考虑后处理的fuse焊接点;
- overlap
- 仅当没有overlap_self或overlap_external属性时,初始帧overlap才会被计算;删除这些属性通常是安全的选择;
- Collisions not working vellum与大多数几何体类型碰撞,但不是所有:
- Sphere, Tube, Circle, Metaball 在prim模式时,只与中心点碰撞;
- Bezier/NURBS Curves 与多边形hull碰撞;
- Bezier/NURBS Mesh Surfaces 仅与hull点碰撞;
- VDB, Volume, HeightField 在SOP仅与点碰撞,在DOP使用地形高度场或静态对象的体积碰撞;
- Polygon Soups 与polygon一样;
- Tetrahedra 与四面体外部的triangle碰撞;
- Packed Geometry 与polygon一样;
- Other Packed Types 取决于是否支持Fast Extraction选项,repack节点可转化为支持此选项;
- 要与RBD packed geometry碰撞,需在Assemble节点后添加repack;
Crinkled cloth or tangled hair
- 离原点超过10000个单位,可能会引起布料褶皱或头发缠绕的问题;将对象移动高离原点更近的位置即可解决问题,还可使用64位以获得更高精度(通常不建议,速度明显变慢);