EP.002 — ← 返回日志

程序化 3D 模型与材质

程序化 3D 模型与材质
Timothy Steele
25 年秋季
Houdini, Copernicus, VEX, Solaris, 材质
2026 年 1 月 29 日

《程序化 3D 模型与材质》是一门由 Timothy Steele 教授主讲的课程,内容围绕 Houdini 的 Copernicus/VEX 材质系统,并采用 Solaris/USD 工作流程。我对学习这些内容感到非常兴奋。在 Houdini 里,我已经经历过太多自己摸索的时刻了(不过只要还在这个行业里做下去,这种时刻大概永远不会真正消失)。我真的很需要一位经验丰富的行业前辈来带我走这一段路。材质一直是我的弱项,很感激能有机会上这门课。这也是我在 SCAD 的第一门课 —— 一切都新鲜又令人兴奋。

项目一:多肉植物材质

在项目一中,我们接触了 Copernicus 系统的基础知识以及材质制作的通用概念。目标是为给定的多肉植物模型制作材质,使其匹配找到的参考图。

Copernicus 中的程序化多肉植物材质效果
多肉植物材质 —— 最终效果

项目二:程序化金属工具

在项目二中,我们深入学习了 VEX 材质制作。目标是创建一个带有自定义界面控制的程序化金属材质。我选择了在大都会博物馆参观时看到的一顶破旧金属头盔作为对象。

这个项目一开始很顺利 —— 我用多层噪波做出了类似头盔凹痕的贴图。但很快我遇到了一个真正有挑战性的编程问题:放射状划痕。线性划痕很简单,用一个基础的 sin() 波就能画出来,但放射状划痕完全是另一种思路。经过数小时的反复试验,并向我的老朋友 ChatGPT 请教之后,我终于搞清楚了放射状划痕的原理,并为它搭建了可供美术调节的控制参数。

来自大都会博物馆的破旧金属头盔参考照片
参考图 —— 大都会博物馆头盔
最终程序化金属头盔材质效果
最终程序化金属材质
程序化金属材质细节特写
特写 —— 放射状划痕细节

项目三:程序化格纹工具

在项目三中,我们需要挑选一种格纹图案,并搭建一个程序化工具来生成它。

这是一个相当痛苦的项目,也让我学到了很重要的一课 —— 好代码不是靠蛮干堆出来的,而是需要高效的结构与合理的规划。事情是这样的:我一开始为每一条可见的线都单独指定了一个频率为 1 的 sin() 波。这带来了两个问题:代码冗余,而且无法程序化控制整块布料图案的缩放。

我算是吃了苦头才明白这个道理。尽管我做出的图案和参考图一模一样,却无法被程序化控制 —— 而如果不能供美术调节,这个工具也就失去了意义。根本原因在于我没有从大局出发思考,而是把精力都放在了定位每一条单独的线上,却没有识别出底层那个更大的重复格纹结构。

于是我重新搭建了整个代码结构。这一次,我先明确了真正的重复图案是什么,并用一个更高频率的 sin() 波来表示线条图案。有了这个新的底层结构,我才真正为格纹图案搭建出了可用的程序化控制。

项目四:程序化木纹工具

项目四的目标是制作一个程序化木纹材质工具。

期末项目:芭菲

期末项目要求我们挑选一款饮品,并围绕它布置一整个桌面场景。我选择了抹茶芭菲。

抹茶芭菲参考照片
参考图
抹茶芭菲参考照片,另一角度
参考图,另一角度

虽然这不是项目要求,但在看过 Peter Sanitra 关于用 MPM 制作奥利奥奶油的分享后,我实在忍不住想试试 Houdini 21 里的 MPM 求解器。为了更熟悉它,我刷了大量 MPM 教程,也通读了文档。当时网上的 MPM 教程既少又比较浅显 —— 这也可以理解,毕竟 MPM 对 Houdini 来说还很新。这意味着我需要自己做大量实验和参数测试。

说实话,我没想到会这么难 —— 不过这更多是我把目标定得太宏大的问题。我原本想在一次模拟中同时处理多种材质:果冻、抹茶、麦片、奶油泡沫、冰淇淋配料,还有巧克力。对一个第一次接触 MPM 的人来说,这个目标实在太宏大了。

我很快发现这个方案在我的设备上根本行不通,原因有几个。首先,为了保持运动的精度,MPM 材质预设会产生过多粒子,很快就把我 96GB 的内存吃光了。其次,模拟泡沫并不是 MPM 的强项 —— 事实上,MPM 根本没办法真正模拟出泡沫。你可以通过网格化流体表面、散布点、在上面复制小球体再布尔运算的方式去伪造泡沫,但那并不是真正的泡沫模拟。最后,MPM 对尺度非常敏感:材质预设默认使用它们被制作时的尺度,有时是以米为单位的巨大尺度,有时又是真实生活尺度。单独模拟一种材质时这不是问题,但同时模拟多种材质时,尺度问题会互相叠加,这意味着我得覆盖掉预设、自己调整参数来弥补。整个过程并不愉快。

为了让模拟保持在我的内存预算之内,我把所有东西都放大到比实际尺寸更大,以减少粒子数量。仅仅是测试奶油从裱花嘴挤出的效果就花了很长时间 —— 我得一边保持星形截面,以及奶油柔软、黏稠、层层堆叠的运动感,一边搞清楚每个参数究竟对模拟起了什么作用。很难。

由于时间有限,我放弃了这种一次性全部搞定的方案,转而结合使用 RBD 与 MPM,把模拟拆分成多个阶段:先用 MPM 求解果冻、水和奶油;再把 MPM 表面网格化,作为 RBD 模拟的碰撞体;最后把 RBD 的结果作为第二次 MPM 模拟(奶油顶部配料)的碰撞体。这不是一次统一的模拟,但确实奏效了。

场景的其余部分,我尽量把建模、材质与渲染全部在 Houdini 内完成。除了勺子之外,其他一切都是我自己建模的,材质也全部自己制作:用自己做的金属工具为勺子上材质,用自己做的格纹工具处理桌布,用自己做的木纹工具处理木盘和杯垫。

抹茶芭菲模拟制作过程,阶段一
制作过程 —— 阶段 1
抹茶芭菲模拟制作过程,阶段二
制作过程 —— 阶段 2
抹茶芭菲模拟制作过程,阶段三
制作过程 —— 阶段 3
抹茶芭菲最终渲染图
最终渲染 —— 抹茶芭菲

结语

深夜在学校机房与朋友们的自拍
深夜的机房

特效是一条需要用一生去追寻、也难免疲惫的路。很庆幸我不是一个人在走。

就像 Timothy 教授常说的那样 —— "你一定会搞明白的。"


← 上一篇 视觉特效摄影
下一篇 → USD 基础

← 返回日志