本教程中使用的 3D 模型:

  

大家好!

这是关于Blender 2.92Geometry Nodes modifier的两个介绍性视频教程中的第二部分。

在前面的教程中,我们研究了Geometry组的nodes(即TransformJoin,用于修改和合并修改器内的几何体);为Group Input创建输入端口的能力,以便在修改器标签中指定参数,以及使用一些Vector和实用Utilities nodes(尤其是Math)来进行数学运算和组合信息。

在这段视频中,我们将看到Geometry Nodes的不同用途,因为我们将把它们用作 "散射" 的粒子系统,也就是在其他物体的表面分布物体实例;然而,本迷你系列的第一个视频教程中所涉及的所有主题在这里都会派上用场。

B3D Geometry Nodes 2 of 2 01

Geometry Nodes修改器允许我们将使用它的对象的几何图形转化为点的生成器,这些点将分布在它的表面上(即:在它的面上)。

我们可以在它们的对应关系和其他对象的实例中安排这些点;此外,Geometry Nodes还允许我们为这些点中的每一个分配变换(位置、旋转和大小调整),以便引入随机性。

在列出这些操作时,我特别说了三件事:

  1. 将几何图形转换为一组分布在曲面上的点
  2. 在这些点上对物体进行实体化;
  3. 修改生成的点的特征(即属性),从而影响创建的实例。

这三个操作转化为同样多的Geometry Nodes,而我们可以立即看到这个效果。

在屏幕上可见的场景中,有一个非常简单的默认Plane(因此只由4个顶点和一个面构成);此外,我使用APPEND导入了一些卵石(“Pebbles”)、一块石头 (“Stone 1”) 和一个包含草叶的物体的3D模型。

为了方便起见,我把卵石分组到一个Collection中,并隐藏所有这些附属元素,在Outliner编辑器中把它们关掉。

B3D Geometry Nodes 2 of 2 02

你可以在视频的描述中找到这些资源的链接;然而,就像前一个视频中的手表一样,我们并没有必要获得这些模型来跟随视频学习!

我选择Plane并添加一个Geometry Nodes modifier到对象中。

B3D Geometry Nodes 2 of 2 03

为了执行第一个操作,也就是将平面转化为其表面上的一组DISTRIBUTED点,我在组的中间添加了一个Point DISTRIBUTE node

B3D Geometry Nodes 2 of 2 04

在屏幕上,我们可以看到Plane已经消失了,取而代之的是一组点......好吧,实际上开始的信息并没有丢失,实际上它还在那里:Geometry Nodes的非破坏性建模方式允许我们在Point DistributeGroup Output之间添加一个Geometry Join node,并将从Geometry Input(即:原始Plane)到达的几何体连接到两个Join输入中的一个。

B3D Geometry Nodes 2 of 2 05

这样,我们就有了原始的Plane(我们可以对其进行修改和纹理化,例如,使其具有地形的外观),以及分布在其表面的点。

Point Distribute node提供了一些参数,其中Density参数最为突出,它允许我们直观地增加或减少分布在曲面上的点的数量。

B3D Geometry Nodes 2 of 2 06

在之前的视频教程中,我们看到如何将一个node信息连接到Group Input,以便能够在修改器界面中修改数值;这对Point Distribute Density参数这样做应该是有意义的。

然后,我们继续进行上述三个操作中的第二个操作,即INSTANCE另一个对象(或一个对象Collection),为Point Distribute创建的每个点放置一个副本。然后我们在Point DistributeJoin之间插入一个Point INSTANCE node

B3D Geometry Nodes 2 of 2 07

其操作的含义很清楚:Distribute生成点,Instance从这些点中获取信息来创建另一个对象的副本......是的,但到底是哪个对象呢?

Point Instance node中,我们有一个选择器,允许我们定义我们是要实例化一个单一的对象还是一个对象Collection;选择模式后(在我的例子中,那就是Object),我们可以点击位于node内的空框,选择我们感兴趣的对象(在我的例子中,即是“Stone 1”)。

B3D Geometry Nodes 2 of 2 08

重要提示:为了获得正确的结果,请确保你已经应用了你想实例化的对象的RotationScale变换;你可以通过选择它们并按下CTRL A,然后从屏幕上出现的Apply菜单中选择“Rotation and Scale” 来实现。

然后,我们根据需要调整Point DistributeDensity参数,直到达到一个适合我们的结果。

B3D Geometry Nodes 2 of 2 09

第三个要做的基本操作是修改各个点的参数(因此也是生成的实例的参数);实际上,可以进行不同类型的操作,所以我们谈论的不是单个node,而是PointAttribute组的节点。

在这两种情况下,转换节点将被插入到Point DistributePoint Instance之间,因为它们必须修改所创建的点,然后再从这些点生成实例。

例如,让我们从旋转开始,应用于所有的点:然后我们在Point DistributePoint Instance之间添加一个Point Rotate node,修改粒子的旋转角度。

B3D Geometry Nodes 2 of 2 10

这个结果已经比没有这个node的结果要好,但是如何在旋转中引入随机性呢?还有,为什么不在这些实例的大小上引入随机性呢?

我们得到了Attribute Randomize node的帮助(当然是来自 "Random"),我们可以在Point RotatePoint Instance之间进行级联(事实上这个处理流程总是发生在几何体上,通过观察各个节点之间的链接Geometry端口就可以验证)。

B3D Geometry Nodes 2 of 2 11

Attribute Randomize是一个node,它允许我们在点的ATTRIBUTE上引入随机性,要在node的 "Attribute" 字段中精确指定。

在粒子的基本属性中,不用说,我们有"rotation" "scale",所以我们先在这个字段中写上"rotation",然后修改Max值......。

B3D Geometry Nodes 2 of 2 12

该节点在粒子的方向上引入了随机性,但是这些粒子围绕它们的所有轴旋转,这并不是一个完全有趣的结果:我们希望保持Point Rotate给定的基本方向,只围绕垂直轴随机地旋转实例。

为了解决这个问题,我们需要将操作值的类型从Float(这是一个统一作用于三个XYZ轴的带逗号的数值)改为Vector,在这里我们可以将所有的值都设为0,除了我们有兴趣修改的轴的MAX之外...

B3D Geometry Nodes 2 of 2 13

但即使是这样的操作也带来了一个问题:我们已经失去了由Point Rotate所给出的旋转!在这个过程中,我们会有一个问题。

B3D Geometry Nodes 2 of 2 14

从某种意义上说,这是一个优先级的问题:在Point DistributePoint Instance之间,我们必须先把Attribute Randomize,然后再把Point Rotate

B3D Geometry Nodes 2 of 2 15

现在复制 Attribute Randomize,并将其添加到原属性和Point Rotate之间,同时修改Scale参数(要像 "旋转点" 一样,完全用小写字母书写,否则Blender将无法识别它)。

B3D Geometry Nodes 2 of 2 16

然而,在这种情况下,我们将不得不修改所有参数最小和最大的XYZ,以获得有用的结果(也许要避免将最小值设为0,否则对象将失去一个或多个维度)。

关于Scale属性,你可能会发现回到Float类型更方便,这样你就只用一个参数来表示最小的比例因子,只用一个参数来表示最大的比例因子......选择权完全在于你。

然而,仅凭这两个Attribute nodes,我们就可以从一个由单一几何体组成的物体中获得某种多样性:Stone 1

如果我们把Point Instance中要实例化的对象的类型从Object改为Collection,并指定卵石的集合,事情就会变得更有趣了。

B3D Geometry Nodes 2 of 2 17

然而,让我们再次将Object设置为Point Instance中的Stone 1,以检查Geometry Nodes的另一个可用功能。

在经典的粒子系统中,我们也可以定义在几何体的哪些部分创建粒子,哪些部分不创建;它是通过定义表面各部分的密度值(从0到1)来完成的,特别是在Weight Painting方面......好吧,我们在这里也可以这么做。

然而,在继续之前,我们必须增加Plane的细分数量,因为Weight Painting(在Geometry Node之外对原始几何体进行操作)作用于顶点,所以Plane的四个基本顶点是不够的。

在三维视图中,我们进入Edit Mode,对整个表面进行多次细分;然后让我们切换到Weight Paint mode

B3D Geometry Nodes 2 of 2 18

B3D Geometry Nodes 2 of 2 19

在默认情况下,表面应该显示为蓝色,即 "权重为0";Point Distribute node将在权重为1的区域创建点,所以我们必须在想让实例出现的区域上涂抹。

B3D Geometry Nodes 2 of 2 20

注意:如果你想在除特定地方外的所有地方应用实例,你必须反过来进行;在这种情况下,特别是,我们想从Point Distribute中使用画笔去除某个区域(Blender会自动创建一个Vertex Group,它的默认名称应该是“Group”,但我们也可以把它重命名为更重要的东西,比如 "Pebbles")。

B3D Geometry Nodes 2 of 2 21

在操作结束时,打开3D窗口中的Weights菜单,点击 "Invert",以反转权重:现在,我们画的区域的权重是0,而在几何体的其他部分,我们的权重是1。

B3D Geometry Nodes 2 of 2 22

显然地,没有什么能阻止我们在以后的时间里修改权重,在Weight Paint mode下,通过改变Tool标签中的Weight参数值来刷新表面;我们只需要记住,我们不会在0权重的区域插入实例。

Geometry Nodes编辑器中,我们在Point Distribute nodeDensity字段中输入Vertex Group的名称(在我们的例子中,那就是“Pebbles;请注意大写和小写):原始曲面上的点分布将与我们设置的Vertex Weights成正比。

B3D Geometry Nodes 2 of 2 23

在结束本视频教程以及Blender 2.92中的Geometry Nodes小系列的介绍之前,让我们再看一个对象实例化的例子......但当中还有一个变化。

在我们定义的方案中,我们插入一个新的Point Density node,将其连接到Group InputGeometry端口,然后让我们将其连接到一个新的(空的)Point Instance,并将场景中可用的两个Point Instances连接到一个新的Join Geometry node,这又将与场景中已有的Join node相连;所产生的几何将由原始的几何与两个Instance nodes所到达的几何相连接而得到。

B3D Geometry Nodes 2 of 2 24

在新的Distribute node中,我们设置了相同的 "Stone 1" 的Density属性,但在Point Instance中,我们将High Grass对象设置为要实例化的对象。

B3D Geometry Nodes 2 of 2 25

如果有必要,我们可以插入一个Point Rotate node来正确确定草叶的方向。

让我们也插入一个Point Scale node(在Point RotatePoint Instance之间),特别是设置Vector模式,这样我们就可以用矢量来指定草地大小的比例因子。

B3D Geometry Nodes 2 of 2 26

让我们插入一个Combine XYZ node,并将它的Vector输出连接到Point ScaleFactor(矢量)输入;草叶会消失,因为Combine XYZ参数的默认值是0.0,所以我们将XY返回到1.0(或者,无论如何,对于这些尺寸来说,它都是一个足够的值)。

B3D Geometry Nodes 2 of 2 27

然后,我们将Combine XYZZ输入连接到一个新的Geometry Input端口;你可能已经猜到了,目的是在修改器界面中调整草叶的高度......但为什么要把自己限制在一个常数或必须手动改变这个值呢?

B3D Geometry Nodes 2 of 2 28

让我们在Blender窗口添加一个Timeline编辑器,并为一个动画设置一个帧范围,例如240帧。

B3D Geometry Nodes 2 of 2 29

让我们转到第1帧,然后为Z参数设置0.0(我们可以随意重命名,就像上一集的时钟指针的名字一样);然后右击这个参数的值,选择 "Insert Keyframe" 来记录一个动画关键帧。

B3D Geometry Nodes 2 of 2 30

让我们移到动画的第240帧,根据需要改变Z的值,在动画的最后一帧也为这个参数插入一个关键帧。

B3D Geometry Nodes 2 of 2 31

我们只需在Timeline上按下Play,就可以看到我们的动画效果。

B3D Geometry Nodes 2 of 2 32

B3D Geometry Nodes 2 of 2 33

那么这次的教程就到此结束了!

我们下次再见!

B3D Geometry Nodes 2 of 2 34