1. 先弄清一个前提金属的永久变形到底由什么决定做技术美术的在Houdini里碰金属弯曲这个需求通常不是从零开始造轮子而是被项目逼出来的。要么是片头里一块钢板被压弯又回弹要么是游戏过场里车门碰撞留下凹陷再要么就是产品展示里铝板被机械臂弯折成形。这类镜头用CLoth解算肯定不对用刚体(RBD)又表现不出局部形变最后都会绕到Vellum上。但Vellum做布料是默认技能做金属却有个很容易被忽略的门槛——金属的弯曲和布料的柔软在物理机制上根本不是一回事。1.1 为什么直接套布料流程会翻车我见过不少同事第一次尝试时把金属板当成一块高硬度布料来处理提高stiffness、降低gravity然后扔进Vellum Solver里跑。结果要么是钢板像弹簧一样疯狂抖动要么是弯到一半慢慢弹回原状看起来完全不像金属形变反而像一块冻住的塑料布。根本原因在于默认的Vellum约束体系里restlength和restangle是固定的。布料模拟希望让网格尽可能回到初始姿态所以柔是它的默认性格。而金属弯曲的核心诉求是当应力超过某个阈值之后变形要永久保留。钢板被压弯了就是弯了不会因为你松手就恢复平整。这个永久保留的机制在物理上叫塑性形变(plastic deformation)它需要显式地开启和配置布料流程默认并不会给你打开。1.2 弹性形变与塑性形变的本质区别用生活化的话说弹性形变像拉一根橡皮筋——你松手它缩回去能量被存储又释放塑性形变像掰弯一根铁丝——你掰到位它就在那了能量大部分转化成了材料内部的结构改变回不去了。真实金属材料同时具备这两种行为应力较小时表现出弹性一旦超过屈服强度(yield strength)就进入塑性阶段。钢材、铝材、铜材之所以手感不同就是因为它们的屈服点、硬化趋势和断裂前的极限应变量不一样。钢的屈服强度高不容易弯但一弯就容易产生明显折痕铝相对软容易弯曲但局部容易起皱铜介于两者之间延展性更好。这意味着在Houdini里我们需要的不是一套高硬度布料参数而是一套能区分弹性区和塑性区的约束逻辑。Vellum恰好提供了这个能力但它的触发方式和参数命名都比较隐蔽官方文档也没有给出一套直接可用的金属参数方案。1.3 Vellum做金属弯曲的核心逻辑Vellum里实现塑性形变的基本思路是给约束尤其是弯曲约束bend constraint和拉伸约束stretch constraint开启塑性选项然后在约束上设置一个屈服阈值。当实际应力低于阈值时约束行为是弹性的网格会倾向于回到原始姿态当应力超过阈值时约束的rest angle或rest length会朝当前变形方向持续更新于是这个变形就被写入了约束的静止状态成为永久形变。打个比方这就相当于给材料加了一个记忆平时它记得自己原来长什么样一旦被掰得太狠它就彻底忘掉过去只记得被掰之后的模样。控制这个遗忘的阈值就是控制金属的硬度与手感。把这个逻辑搞清楚后面所有参数调整就都有了判断依据。2. 几何预处理与约束初始化这一步决定模拟上限很多人在Vellum里调参数调到怀疑人生最后发现是基础几何体没准备好。Vellum的约束是从点对、点-三角形关系生成的网格拓扑的质量直接决定了约束的质量。拓扑差的网格后面无论你stiffness开到多大、iterations拉到多高都会出现局部抖动或异常变形。这块值得花时间捋清楚。2.1 网格密度与均匀性怎么取舍金属弯曲模拟对网格的要求和布料不太一样。布料为了表现大范围拖曳和褶皱需要足够高的细分度金属更多依赖弯曲约束来表现折痕和面板变形所以网格密度要匹配你想要的最小折痕尺度。举个例子如果你模拟一块1米乘1米的铝板希望表现出被弯折后半径约5厘米的折角那么网格边长最好控制在2厘米左右也就是约50x50的细分。这样做的好处是折痕区域至少有2到3排三角形参与形变弯曲约束能平滑过渡不会出现棱角分明的不自然折线。但网格不是越细越好。Vellum Solver的每个substep都要遍历所有约束约束数量约等于点数的3到6倍。我把一块板从40x40细分加到80x80解算时间直接翻了接近4倍而视觉差异在常规镜头里几乎看不出来。对金属这种形变区域通常有限的对象网格密度策略应该是整体保持中等密度在预期发生弯曲和碰撞的区域做局部加密。2.2 Remesh和Triangulate的参数建议Houdini里把网格处理成适合Vellum解算的拓扑通常有两条路VDB Remesh适合快速得到均匀密度的网格对原始模型的拓扑要求低缺点是会损失一些锐利边角而且在曲率大的地方可能过度简化。我一般用它做粗处理。Remesh节点基于Target Size更可控能设置Adaptive参数让曲率高的区域自动加密。处理金属板这类扁平几何时我倾向于把Target Size设为目标网格边长的1.2倍左右然后开Adaptive让靠近边界和预切割线的地方稍微密一点。Adaptive值在0.4到0.6之间比较稳妥太小会导致三角形尺寸差异过大影响约束质量。Triangulate如果原始模型是四边形网格且分布均匀也可以直接用Triangulate转成三角形。这样可以保留UV和属性省去重新投影的麻烦。但要注意四边形网格的Triangulate结果会按固定方向切开如果原始拓扑是规则棋盘格可能出现斜对角方向的约束密集区导致弯曲时出现方向性偏差。不管走哪条路最后都要用Clean节点清理一下非法三角形和重叠点。尤其是重叠点Vellum Source在初始化约束时如果遇到重合点会产生长度为零的stretch constrain解算时瞬间爆出巨大力量现象就是一点就炸。2.3 初始状态与局部加固的准备工作有一个细节很多人容易忽略Vellum的约束是定义在rest状态上的。如果你的金属板在被解算前已经处于一个弯曲或折叠的造型比如角色手里拿着的弧形盾牌那么rest状态就应该是那个弧形而不是把它展平后再模拟从平面变弧形的过程。我常用一个很简单的验证方法把Vellum Solver的gravity关掉、所有v归零跑一两帧看看模型是不是保持静止。如果有明显的回弹或塌陷说明rest状态和初始状态不一致需要在Vellum Source里使用Set Rest From Points或在模拟前用Rest Position来固定初始姿态。另外如果金属物体上有些区域应该保持刚性比如连接件、加强筋、折边可以在这些区域的点上把mass加大或者在对应约束上给更高的stiffness。我用得比较多的是Attribute Paint直接在视口里刷一个constraint_stiffness_scale之类的属性再在Vellum Attribute节点里乘进去。这个方法比单独分区域做约束要快得多现场调镜头时尤其好使。3. 塑性约束的核心参数从橡皮筋到易拉罐的关键开关几何准备好之后进入正题如何在Vellum里把一块默认橡皮筋性格的网格调成易拉罐性格。这里有几个关键节点和参数需要逐个说清楚它们之间的联动关系决定了最终手感。3.1 约束类型选择StretchBend的组合Vellum Source生成约束时对于三角形网格会自动创建Stretch、Shear和Bend三类约束Stretch constraint约束两点之间的当前距离不偏离rest length负责抗拉伸。Shear constraint约束三角形内部边的角度负责抗剪切对应材料抵抗扭曲的能力。Bend constraint约束相邻三角形之间的二面角负责抗弯曲是金属弯折表现的核心。做金属时Stretch和Shear的stiffness应该设置得非常高。金属在宏观弯曲过程中其局部拉伸量极小绝大部分形变体现为弯折而不是材料被拉长。我通常把Stretch stiffness设为默认值的5到10倍甚至直接拉到1e6级别让它在解算中近似不可拉伸。Shear相对可以稍低一点但要保持同一量级否则三角形会发生局部扭曲表现为表面出现不自然的扭麻花纹理。Bend constraint则要单独处理——它是启用塑性形变的主战场。Bend stiffness决定材料抵抗弯曲的能力数值越高越难弯但真正让它弯了不回来的是Bend约束上的塑性参数。3.2 塑性形变参数怎么开Houdini新版里开启塑性形变有几个入口。最直接的是在Vellum Solver节点的Constraints标签页勾选Plastic Deformation选项然后在Vellum Constraint Property节点里对特定约束组设置塑性相关属性。约束上的塑性属性核心有两个plastic塑性比例范围0到1表示当应力超过屈服点时当前形变中有多少比例会被永久写回rest状态。值为1时超过屈服点之后几乎完全塑性材料弯了就记住值小于1时部分形变会恢复呈现半弹半塑的性格。金属材料通常取0.8到1.0之间的值具体取决于合金特性。yield strength屈服强度这是应力阈值。实际应力低于它时约束表现为弹性高于它时开始发生塑性形变。可以理解为材料骨气的程度——yield越高越难被说服永久改变自己。还有一个容易被忽略的stiffness与yield的换算关系。Vellum内部通过stiffness乘以当前应变来计算应力所以单纯改yield而不考虑stiffness效果会偏差很大。举个例子如果Stretch stiffness设成了1e6那yield如果还停留在默认的布料量级比如几百这个约束会瞬间进入塑性状态相当于材料变成了超软的橡皮泥。反过来如果stiffness很低yield设很高材料又永远不会进入塑性变成一根顽固的弹簧。我的经验是开启塑性后先用constraint visualization工具查看约束的应力分布确认不同区域的应力量级然后据此设定yield。这样比盲试参数效率高得多。3.3 钢、铝、铜的不同手感从哪调不同金属的区别在物理上主要体现为屈服强度、弹性模量和硬化行为。在Vellum里可以通过参数组合大致还原手感目标Stretch/Shear stiffnessBend stiffnessyield strengthplastic附加调整钢板硬、折痕锐利1e6较高高0.95-1.0适当提高Damping铝板较软、易起皱5e5 - 8e5中等中等0.85-0.95Self-collision开高铜板延展好、平滑弯曲4e5 - 7e5中等偏低较低0.8-0.9增加塑性阈值范围钢板和铝板最大的观感差异在折痕上。钢板屈服点高不容易弯但一旦弯过去就会出现非常锐利的折线铝板屈服点低更容易起皱折痕更像一组密集的小波纹而非一条锐线。对应到参数上就是yield强度的高低和bend约束的密度。想得到锐利折线除了提高yield还可以给bend constraint添加一个**post-hardening硬化**属性——当塑性形变累积到一定程度后该区域的刚度反而上升这会阻止折痕扩散让变形集中在一条线上。这个技术在制作被弯折的板材时非常实用。铜的特点是延展性好弯曲半径大不容易断裂。可以在约束上增加**max strain最大应变**限制或者配合后续的断裂约束使用。Vellum里可以给约束设置随应变变化的stiffness曲线让材料在接近极限时刚度下降模拟软化行为。4. 碰撞、自穿插与稳定性我踩过的坑和排查路径参数调通了之后真正让人头大的是稳定性和碰撞问题。这一节我把自己在项目中实际踩过的坑和完整的排查思路写出来比直接给参数更有参考价值。4.1 弯曲后疯狂回弹问题出在哪这是我遇到最多的现象金属板被工具压弯了松手之后又慢慢弹回来看着像一块有记忆功能的合金。排查链条是这样的。第一步确认Plastic Deformation确实开启了而且作用在正确的约束上。我吃过一次亏勾了Solver上的plastic选项但约束来源是一个单独的constraint network那里面的bend constraint没有开启塑性结果完全没效果。第二步检查yield strength是否低到足以让目标应力触发塑性。用可视化工具查看stress如果stress在模拟中始终低于yield那永远不会进入塑性状态。第三步检查plastic的数值是否太接近0。曾经我把一个约束组的plastic属性写成了0.1本意是设置0.9结果手感变成回弹90%远看就像橡皮筋。一个更隐蔽的原因模拟时间尺度和substep不足。Vellum解算是基于substep的如果substep太少每次步进产生的应变过大超过yield太多约束会在超调和矫正之间来回震荡表现为整体回弹或抖动。我通常把Sub Steps设在3到5Collision Pass设在4以上这对金属这种高刚度材料尤其重要。4.2 解算爆炸和局部抖动高stiffness带来的最常见副作用就是解算不稳定。现象是模拟开始几帧还正常某次碰撞后局部点突然飞出十万八千里。排查时先看是不是某个约束的rest length异常——初始化约束时如果有退化的三角形或重合点会出现长度接近0的约束它存储的能量极大一旦被拉伸就会爆炸。另一个常见原因是碰撞体的初始穿透。如果金属板初始状态和碰撞物体穿插了哪怕0.01个单位Vellum Solver在第一个substep就会试图用巨大的排斥力把它们分开引发震荡甚至爆炸。我现在的习惯是模拟前用Intersection Analysis节点检查所有碰撞对把初始穿透清理干净再跑。这个检查10秒钟的事能省掉一个下午的排查时间。局部抖动高频振动通常是damping不足或stiffness过高的组合。很多人的第一反应是把stiffness降下来但更好的做法是提高damping并增加substep。金属表面出现持续高频微振会毁掉一版缓存即使后期可以加模糊也挡不住它在法线贴图上产生的闪烁。我把Vellum Solver里的Damping从默认的0.01提到0.05到0.1对高刚度材料效果非常明显。4.3 自穿插与碰撞穿透薄板金属在弯折过程中几乎必然会发生自接触——折过来的面板会碰到另一侧的面板。如果self-collision没有处理好你会看到两块面板互相穿过看起来像幽灵一样。处理自碰撞的优先级如下确认Self-Collision开启。Vellum Solver里默认是开的但如果你复用了某个省了配置的资产可能被关掉了。调整Collision Thickness。厚度设太小高速运动下碰撞检测会漏掉设太大薄的金属板看起来会变得臃肿尤其是在细节丰富的折痕处。金属板的厚度我一般设在网格边长的0.1到0.3倍之间。提高Collision Pass。碰撞迭代次数决定每个substep内碰撞解决的彻底程度。折叠类镜头建议设在6以上代价是解算时间明显上涨。临时性放大厚度做预解。如果某个镜头折叠非常剧烈我偶尔会先把Collision Thickness临时放大1.5倍跑一遍确认没有穿透再恢复厚度重新解算。这个方法并不能保证100%解决但能快速区分是碰撞设置问题还是约束本身的问题。5. 从解算到渲染缓存、法线与UV的交接细节模拟出的变形本身只是资产的一半把它交到渲染手里并且不出幺蛾子才是技术美术真正的日常。这一节聊几个我在交付环节反复踩的点。5.1 缓存前必须做掉的模型病直接拿模拟结果去渲染大概率会遇到法线问题。Vellum Solver输出的是变形后的点位置但法线如果没有重新计算可能还是旧的或者由于三角形翻转变成负数。模拟前养成好习惯在Solver之后接一个Normal节点把法线重算一遍。三角形翻转是另一个隐蔽问题。模拟过程中个别三角形可能发生翻转在渲染时表现为黑面或闪烁。排查方法是加一个Measure节点查看area属性是否为负值把翻转区域找出来。如果翻转区域很小可以尝试减小Collision Thickness或增加self-collision的迭代来消除如果翻转区域很大说明模拟本身就出现了穿透级问题不是修法线的层面能解决的。5.2 UV保持模拟变形后的纹理不漂移UV在Vellum模拟中默认是随点走的但如果你的金属板经过了RemeshUV就可能被清掉或破坏。处理方式有两种模拟前把UV属性转成顶点色或rest属性模拟后用Attribute Transfer把UV从rest状态映射到当前状态。这个方法对大幅度变形效果不错但要注意Transfer时使用nearest face来避免UV穿帮。如果你依赖纹理细节在折痕处的拉伸表现更推荐用Texture Deformation思路在渲染阶段根据曲率或应变属性生成额外的细节纹理而不是让UV去跟踪模拟形变。比如通过strain属性控制折痕处金属拉伤高光的强度这种方案在近景中比纯UV拉伸效果更真实。5.3 交给材质组的信息不只是缓存的几何每次交付模拟结果我给材质组准备的东西除了Alembic缓存通常还包括三张经过重映射的属性贴图或属性场strain应变表示局部被拉伸或压缩的程度可以用来驱动划痕、金属拉伤、氧化色变。curvature曲率标识折痕和锐角区域用来驱动高光集中度和粗糙度变化。impact velocity碰撞速度如果有碰撞记录碰撞瞬间的速度大小用来驱动碰撞损伤、漆面脱落等效果。这三个属性直接从模拟结果里用Attribute Promote和Measure节点提取然后写进缓存的point属性里。渲染侧只需要读取它们就能在材质层面做出和形变严格匹配的细节。比方说一块被弯折的铝板折痕中心区域的curvature高、strain高金属拉伤和微划痕就集中在那个区域而不是全板均匀分布——这样出来的效果比单纯靠贴图叠加要真实得多。5.4 缓存格式的选择建议Vellum模拟结果导出时我通常用Alembic而不是.bgeo.sc。Alembic的优势是对跨软件协作友好材质组在Maya或Clarisse里也能直接读取。但有两个注意点一是Alembic里要勾选Attribute Prefix确保自定义属性不会因为命名冲突被丢弃二是在导出前要把不需要的中间属性删除比如v、previousv这些解算缓存否则文件体积会大好几倍。文件小了解算组和渲染组的协作效率都会明显提升。还有一个小习惯导出之前把点数量检查一遍确认没有因为解算中途的topology变化导致点数改变。Vellum默认不会改变拓扑但如果你加了Remesh或者某些基于DOP的节点点数可能会变这时候Alembic的对接会出问题最好在节点图里配一个Attribute Wrangler在解算后强制检查ptnum的范围和总数。6. 这套流程的边界以及我现在的默认做法做到这里Vellum做金属弯曲的基本流程已经完整了几何预处理、约束初始化、塑性参数调校、碰撞处理、缓存交付。但作为笔记的最后部分我想坦白说几句这套流程的边界和适用场景免得有人拿着它去硬套所有金属形变需求。Vellum适合的是薄板类金属的连续形变——钣金弯折、铝板压形、铁皮碰撞凹陷、罐头挤压变形这些是它的主场。但如果你要的是金属断裂成碎片飞溅应该去看Vellum的破裂约束或者RBD Fracture如果你要的是整体结构不发生局部扭曲只需要一个弯折角度的机械运动那用普通的Transform加一点形变混合就够了完全不需要上模拟。技术美术的日常就是在正确的地方用正确的工具硬拿最强武器处理所有问题只会让自己累死还不讨好。我现在的默认做法是碰到金属形变需求先问三个问题——形变是局部还是全局形变是永久还是回弹镜头是近景还是远景近景局部永久变形Vellum塑性方案是最佳选择远景全局回弹形变可能一个简单的混合变形器就搞定了近景且需要断裂那再考虑Vellum破裂约束和RBD的组合。另外想分享一个实际项目里学到的经验模拟和动画的配合。金属弯曲模拟很少是孤立的通常有一个机械臂、一道冲压工序或一个角色在施加力。机械臂这种主动施力的物体我一般处理成keyframe动画然后用RBD Pin Constraint或者Vellum的Attach Constraint把金属板的部分点约束到机械臂上等弯折到位后再断开。这个动态挂接-断开的操作比直接把机械臂做成动力物体然后让它物理推动金属板要稳定得多也更容易获得导演想要的精确弯折角度。具体实现上可以用Attribute Wrangle按时间片动态写入pin的激活值控制在第几帧开始挂接、第几帧断开。这块我可以后面专门写一篇笔记。最后说一句掏心窝的话Houdini的模拟参数永远没有一次调对的魔法值有的只是一套能帮你快速判断问题出在哪里的逻辑。塑性形变这套流程懂了背后弹性vs塑性和rest状态更新的原理参数就只是表现细节的不同组合方式而已。希望这期笔记能帮你少走点弯路。