最终渲染:一套覆满金色缠丝纹样与彩色宝石的仪仗板甲,胸前与肩部镶满宝石,链甲衬在下方

引言

我是 Erindale,一名技术总监,专精 Blender 里的程序化工作流。虽然我们没有 Houdini 那样显赫的地位,但大家不该忽视 Blender 能做的事。如果你想了解更多,可以看看我的 YouTube 频道、在线课程或者 Discord 服务器。

作为 Nodevember(面向程序化艺术家、为期一个月的年度创作挑战)的一部分,我想真正把 Blender 的程序化建模系统 Geometry Nodes 用到极限。第 8 天的题目是「Bejewelled」(缀满珠宝),于是我选择做一套极其华丽、覆满金色缠丝与宝石的仪仗板甲。

这个模型依赖四项进阶技术:双轨放样(bi-rAIl loft)、卷曲噪波(curl noise)、变形到曲线、变形到曲面。其余部分都只是简单的选择与实例化。

铠甲

双轨放样让我们可以让一条轮廓曲线沿着一对轨道曲线滑动,从而生成网格片。轨道之间靠近或远离时,轮廓曲线会随之缩放。我为此写了一个自定义节点组,它还支持多条轮廓曲线,让它们沿着放样方向插值。

这个方法让我们对腰部、胸部、颈部这些相当复杂曲面的轮廓有了很细致的控制。手臂就简单得多,只是锥化的圆柱体;肩部是一连串挤出;领口是一个圆沿着单条曲线放样;而锁子甲的基础网格则是两个 icosphere。

Blender 视口中的灰色基础网格:躯干、双臂与肩甲的粗模,尚未添加任何装饰

胸甲用一对由较短的曲线段组成的轨道,加上四条沿放样插值的轮廓曲线做成。借助 Blender 5.0 新的 Closure 系统,我们可以往 Bi-Rail Loft 节点组里注入一条自定义的浮点曲线,用来调整各条轮廓混入的位置。

Blender 界面:左侧是双轨放样生成的曲面片,右侧是支持多条轮廓曲线插值的自定义节点组

卷曲噪波

我们可以在噪波场中挤出一条边,把噪波的输出当作挤出方向,从而做出装饰性的卷曲几何。如果在不同位置放一堆点分别挤出,就能把噪波场可视化出来;但另一种做法,是在同一个位置放多个点,让它们各自采样略微不同的噪波——通过改变缩放或随机种子都能实现。这样会得到漂亮的簇,可以网格化成叶片装饰。

从基础网格上选出成条的几何之后,我们就能在更大的区域上铺满卷曲噪波,比如肩部这里。卷曲噪波的方向,是噪波纹理与表面法线的叉积。这让卷曲沿着表面生长。任何超出边缘的部分,会直接从挤出的布尔运算里移除,于是它就停止生长了。

Blender 视口:深蓝色的甲壳表面,金色卷曲噪波纹样沿着边缘生长,并在一侧区块内铺满

当我们从单点出发、加上一点噪波偏移生成曲线时,就能做出非常有装饰感的东西;镜像之后,看起来更刻意、更精致。胸针上的额外装饰与花纹,用的就是这个流程。

平面预览:由卷曲噪波挤出的一组白色叶片状纹样,可以网格化成叶片母题

要做出这个效果,节点可以这样搭:

Blender Geometry Nodes 节点图:用噪波场作为挤出方向生成卷曲几何的节点结构

变形到曲线

有时候我们不只是想把一个物体沿着曲线做实例化,而是想要更复杂的弯曲——让物体变形,去跟随曲线的切线方向与法线。就我们这里而言,既然费了这么大功夫放样出这些复杂曲面,那么让大的装饰件顺着这个形体走、而不是跟它对着干,就顺理成章。比如钢制甲片边缘那一圈金色卷曲噪波,就是沿着从主体几何提取出的曲线生长的:

特写:钢制甲片边缘攀附着金色卷曲纹样,顺着主体几何提取出的曲线生长

金色本身只是一小段被镜像过的卷曲噪波,然后沿着直线做实例化。这一条金色再变形到从基础网格提取出的曲线上。

那我们怎么把东西变形到曲线上?如果把几何体想象成存在于 XYZ 三条线性轴构成的标准 3D 空间里,我们要做的,是把它转换到曲线的 U 轴(沿曲线方向)、法线轴与副法线轴上。

在 Geometry Nodes 里,这个转换相当简单。用一个包围盒,我们可以把几何体的 3D 坐标归一化到每个轴 0–1 的范围。然后,用 Sample Curve 节点,按我们原本的某一根轴去采样曲线上的位置。

这会把所有几何体移到沿曲线的那条线上。接着我们需要把它重新「撑开」:把另外两根轴上的量,分别按法线与副法线方向缩放后加上去。节点可能长这样:

Blender 界面:左侧是一条由单点加噪波偏移生成的装饰曲线,右侧是对应的节点图

变形到曲面

比曲线变形再高一层的,是曲面变形,也就是网格包裹(Mesh Wrapping)。这种情况下,我们有一些铺在二维平面上的几何,想把它包裹到某个三维曲面上。当我们有一个更容易平着做的复杂图案,又有一个用简单几何更容易搭出来的三维形体时,这非常有用。这里的例子是我们的绗缝护颈:

特写渲染:深红色绗缝护颈压在镶满宝石与金色缠丝纹样的胸甲上,宝石泛出红蓝光泽

这种情况下,做绗缝设计、加上缝线,在 XY 平面上平着做要容易得多;但要做出像套在脖子上的东西,用 Curve to Mesh 节点沿样条控制圆的半径则容易得多。

我们护颈的基础网格正是后者。而只要我们懂得怎么把平面图案弯到三维曲面上,就能同时利用这两种便利之处。为此,我们要「滥用」一下 UV 坐标。

如果我们主要在 XY 平面上工作,那把手上任何坐标重新映射到每个轴 0–1 的空间里就很合理。这样,把这些几何映射到三维物体的 UV 上就变得容易。我们的几何虽然平铺,但仍有一定厚度,所以需要用 Z 分量作为表面法线的标量把它撑起来。

这样我们就能把几何拉伸到 UV 曲面上,再朝着正确的方向加厚。我们平铺的护颈几何长这样:

平面预览:粉红色的绗缝护颈,菱形绗缝纹路在平面上完整铺开

如果我们用 Sample UV Surface 节点去采样基础网格的位置以及法线,就能把这部分几何摆到正确的位置:

Blender 界面:左侧是弯成颈箍形状的护颈,右侧是用 Sample Uv Surface 采样的节点图

对于布料,我们还可以加一些折痕与皱褶。这我更倾向于就位之后再去做,免得噪波纹理明显跟着形变走。我用一层基于 UV 贴图的噪波来跟随表面,另一层基于世界坐标位置的噪波来做整体变形。

Blender 界面:左侧是加上褶皱与起皱的护颈,右侧是对应的节点图

想更深入地了解完整的建模流程,可以看这里的延时视频:

结语

你也可以在 Patreon 上免费下载这个项目文件。自从 Geometry Nodes 在 2020 年 11 月作为 Blender 2.91 Beta 的实验性功能出现以来,我几乎每天都在用它。每一个版本的进步都让我惊叹——无论是性能,还是新增、乃至仍在持续加入的节点范围。

我承认,这套铠甲如果用混合的做法、而不是纯节点,可以做得更高效、更写实;但那就不是 Nodevember 的精神了。

更多程序化建模的思路可以查看本站 案例教程 分类;

想找 Blender 几何节点的现成资产,可以看 Smart Mesh Blend 2:Blender 几何节点法线与材质混合资产,程序化材质库则可以参考 Sanctus Library v3.4.16:Blender 程序化材质与资产库。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。