从“场”看懂几何节点

面向初学者的几何节点核心概念笔记。中文节点名后保留英文名,方便在 Blender 界面中查找。

一张总图

几何(Geometry)
├─ 组件(Component):这是什么几何?网格、曲线、点云、实例……
└─ 域(Domain):在这类几何里,按每个什么来算?点、边、面、实例……
   └─ 元素(Element):当前那一个点 / 面 / 实例
      └─ 场(Field):面对当前元素时,给出一个结果的规则
         └─ 上下文(Context):场此刻可读取的位置、索引、法线、属性等信息

一句话版本:组件决定“是什么”,域决定“对谁算”,场决定“怎么算”,上下文决定“此刻能知道什么”。


1. 场:不是一个数,而是一条规则

普通值 0.5 的意思是:不管处理哪个元素,结果都一样。

位置(Position) 则是场:问不同顶点“你在哪”,会得到不同答案。

固定值:给班上每个人同一支笔
场:按每个人的身高发不同长度的尺子

常见场:

  • 位置(Position):当前元素的位置。
  • 索引(Index):当前元素的编号。
  • 法线(Normal):当前元素的朝向。
  • 随机值(Random Value):当前元素的一次随机结果。
  • 命名属性(Named Attribute):读取已经存到几何上的数据。

场不会在连线时立刻变成一组数字。它会等某个节点真正使用它时,再针对每个元素计算。菱形插口通常能接收场;看到它时可以问:这里是输入一个统一结果,还是一条“每个元素分别算”的规则?


2. 域:这份数据属于“每个什么”

域只是在回答:一份数据的拥有者是谁?

对于网格,最常见的是:

每个什么拥有一份数据 典型用途
点(Point) 每个顶点 设置顶点位置、顶点随机值
边(Edge) 每条边 选择或处理边
面(Face) 每张面 删除面、给每面分配结果
面角(Face Corner) 每个面上的每个角 UV 接缝、同一顶点在相邻面可不同
实例(Instance) 每个实例 缩放、旋转或选择一个完整实例

设置位置(Set Position)可以先理解为按网格的点域工作:它让每个顶点各自决定移动多少,所以能使网格变形,而不是只让整个物体一起平移。

设置位置
  几何:要改哪份几何?
  选择:哪些顶点要改?
  偏移量:每个被选顶点分别移动多少?

3. 上下文:场在哪里被使用

同一个场节点本身通常不说“我要按点算”还是“我要按面算”。使用它的节点提供上下文。

随机值 → 设置位置的偏移量
         ↓
      设置位置按顶点处理
         ↓
      每个顶点得到一个随机值

随机值 → 删除几何(Delete Geometry),域 = 面
         ↓
      每张面得到一个随机值

把随机值想成抽签机:放在顶点队列前,每个顶点抽一次;放在面队列前,每张面抽一次。抽签机没有改变,队列改变了。

读场的实战顺序

遇到复杂节点树时,不要先盯着场从哪里来。按下面四步读:

  1. 哪个节点正在使用这个场?
  2. 这个节点处理的是什么组件?
  3. 它按什么域处理?
  4. 因此,场会对每个什么元素给出结果?

4. 组件:几何盒子里装的不同种类

一个 几何(Geometry) 插口可以理解为一个盒子,里面可包含多种组件:

几何
├─ 网格(Mesh):顶点、边、面,例如立方体
├─ 曲线(Curve):控制点和样条线
├─ 点云(Point Cloud):只有点,没有边和面
└─ 实例(Instances):对其他几何的轻量引用

点域不等于点云组件。

  • 点域:一个网格的每个顶点分别计算。
  • 点云:一种真的只由点组成的几何类型。

所以,立方体是网格组件,但它同样可以在点域上处理。


5. 实例:许多摆放方式,不是许多份网格

假设平面上有 10 个点,把一个小立方体接到 在点上放实例(Instance on Points)。画面看起来有 10 个立方体,内部更像这样:

10 个点 + “每个点引用同一个小立方体” = 10 个实例

实例保存的是“摆在哪里、转多少、缩放多少”的记录,而不是每个立方体都复制一份顶点、边、面。因此它很省性能。

目标 应使用的节点
移动、旋转、缩放每个完整复制品 平移实例(Translate Instances)、旋转实例(Rotate Instances)、缩放实例(Scale Instances)
修改复制品内部的顶点形状 先实现实例(Realize Instances),再设置位置

口诀:改整个复制品,用实例节点;改复制品内部的形状,先实现实例。

小练习的答案

随机值 → 缩放实例

这里随机值在实例域中被使用,因此每个完整的小立方体随机变大或变小;它不会逐个缩放立方体内部顶点。前面没有“实现实例”正是关键。


6. 几何流与字段流

节点树里常常同时有两条“流”:

几何流:网格 → 设置位置 → 输出几何
字段流:位置 → 分离 XYZ → 数学 → 设置位置的偏移量

几何流回答“几何在哪里、变成什么”;字段流回答“每个元素具体怎么处理”。字段不是另一份几何,而是一条交给几何节点执行的规则。


7. 属性:把规则的结果写进几何

场是“现问现算”的规则,例如:

位置的 Z 值 × 2

当使用 储存命名属性(Store Named Attribute) 并把它命名为 高度,Blender 会在指定组件和域上把结果真正存下来。之后可用 命名属性(Named Attribute) 读回。

场:现问现算
属性:提前写入几何的一张表

日常节点树中,能直接连接场就不必急着存属性;只有需要把结果留给后续步骤、材质或多次读取时,再存成属性。


8. 跨域使用:为什么数据有时会“混合”

两个面可以共用一个顶点。假设每张面各有一种颜色:

面 A = 红色 ── 共用顶点 ── 面 B = 蓝色

如果后面的节点要求“每个顶点一种颜色”,共用顶点只有一个位置,不能原样同时保存红和蓝。Blender 必须把周围面的信息整理成一个点上的结果;这就是域转换造成的直观现象。

你现在不用背转换规则。排错时只要记得:

当“按每面不同”的信息要给“每点一份”的操作使用时,共用顶点附近的结果可能被合并或改变。

反过来,一个面有多个顶点;如果要从“每点不同”变成“每面一份”,Blender 也必须整理成一个面上的结果。


9. 索引与重复使用场

索引(Index)的意思是当前元素的编号。点域中是顶点编号,面域中是面编号,实例域中是实例编号。它不是整个物体唯一不变的编号。

同一个场可以接到多个输入口;每个接收者可能在自己的上下文中计算它。若确实需要把某次计算结果固定下来并在后续共享,就把它存为属性。


10. 最终检查表

看到一个场连接时,依次问:

[ ] 谁在使用这个场?
[ ] 当前是什么组件:网格、曲线、点云,还是实例?
[ ] 当前域是什么:点、边、面,还是实例?
[ ] 它会对“每个什么”分别得到结果?
[ ] 我是在改整个实例,还是在改实例内部网格?
[ ] 是否可能发生了跨域使用?

只要能顺着这六个问题回答,场、上下文、组件与域就已经真正串起来了。


跟着这次学习对话,把概念真正串起来

前面的部分适合查阅。下面保留这次学习中最关键的提问顺序,把“为什么会困惑”和“应该怎样想”一起写出来。它不是逐字聊天记录,而是将对话整理为一条可以重复阅读的学习路线。

第一站:场到底是什么?

你最初的困惑

“场、上下文、组件、域这些东西和关系还没有完全搞懂。”

这个问题难在:四个词经常同时出现,初学时很容易把它们当成四种相似的数据。但它们其实处在不同层级。

先只抓住场。几何节点里的场不是“存着很多数字的一根线”,而是一条规则。例如:

位置(Position)

它不是“这个物体的位置”。当它被用于网格点时,它在问:这个顶点在哪里? 网格有很多顶点,所以每个顶点会得到不同位置。

而数值 0.5 不会随顶点变化。它可以看成一条非常简单的规则:不管问谁,都回答 0.5。

固定值:每个元素都得到同一个答案
场:每个元素都按同一条规则自己算答案

因此,场最准确、也最不容易忘记的说法是:

场是“对当前元素给出结果的规则”。

这句话里面的“当前元素”暂时可以理解成顶点;后面会看到,它也可能是面或实例。

第二站:设置位置到底在移动谁?

你的回答

“设置位置影响的是点域,所以是对立方体的顶点进行分别移动。”

这是整个学习过程的第一个关键转折。设置位置(Set Position)不是把一个物体整体拖到另一个位置;它通常是在修改网格里每一个顶点的位置。

例如一个立方体的顶部顶点和底部顶点可以拿到不同的偏移量:

顶部顶点:向上移动更多
底部顶点:不动

立方体就被拉高了。这里没有复杂数学,只有一个事实:不同顶点可以得到不同答案。

于是可以把三个词先连成一个非常具体的句子:

设置位置:在点域中工作
位置:给每个顶点的位置
场:让每个顶点按规则获得不同的移动量

第三站:什么东西会“按每个面”计算?

你的追问

“什么东西按每个面计算?”

这个追问非常好,因为域不是一个抽象标签;它必须落在一个具体操作上才有意义。

可以看 删除几何(Delete Geometry)。把它的域设为“面(Face)”时,它不再问“这个顶点删不删”,而是问:

这一张面删不删?
下一张面删不删?
再下一张面删不删?

随机值(Random Value) 接到它的“选择(Selection)”,就像让每张面各抽一次签。抽中的面被删除,没抽中的面被保留。

同样,缩放元素(Scale Elements) 可按面处理;储存命名属性(Store Named Attribute) 也可以明确选择把数据按面保存。这里“按面”不是说面里的每个顶点都独立执行一次,而是说一整张面拥有一份属于自己的结果。

第四站:为什么同一个随机值有时按点、有时按面?

这就是“上下文”真正发挥作用的地方。

随机值本身不是“点随机节点”或“面随机节点”。它更像一台抽签机,等着别人叫它工作。谁来调用它,就决定了排队抽签的是谁。

随机值 → 设置位置的偏移量
         设置位置正在处理顶点
         所以每个顶点抽一次

随机值 → 删除几何的选择,域 = 面
         删除几何正在处理面
         所以每张面抽一次

这就是上下文最实用的定义:

上下文是场被求值时的当前工作环境;它告诉场正在处理什么组件、什么域、哪个元素,并提供位置、索引、法线和属性等信息。

以后遇到看不懂的连线,别先问“这个场是什么”;先问“谁在使用它?

第五站:组件是什么,为什么点域不是点云?

容易混淆的地方

“点域”和“点云”只有一个字不同,却不是同一个东西。

几何节点的 几何(Geometry) 插口像一个盒子。盒子里可以装网格、曲线、点云和实例。它们是不同的组件

网格组件:有顶点、边和面
曲线组件:有控制点和曲线
点云组件:只有点
实例组件:记录对其他几何的引用

点域不是“点云”。点域只是说:在某个可以拥有点的几何上,按每个点(对网格就是每个顶点)分别处理。一个立方体是网格,不是点云;但它当然有顶点,因此可以在点域中使用场。

换一个说法:

组件:物品的种类
域:在这种物品里,数据分给每个什么单位

第六站:实例为什么会改变一切?

我们使用的练习

网格平面
→ 在面上分布点(Distribute Points on Faces)
→ 在点上放实例(Instance on Points)
→ 缩放实例(Scale Instances)

随机值 → 缩放实例的缩放

你的结论

“是让每个完整的小立方体变大变小,因为这里连接的是缩放实例,所以只对实例个体起作用,前面也并没有实现实例。”

这个判断完全抓住了要点。

实例不是很多份已经复制好的网格。可以把它看成“同一个小立方体的许多摆放记录”。缩放实例处理的是每一条摆放记录,因此随机值是在实例域中计算:每个完整小立方体得到一个大小。

如果改用 设置位置,它想处理的是网格内部的顶点。实例内部的网格还没有展开时,不能把“改每个实例整体”和“改每个内部顶点”混为一谈。

想改整个复制品:平移 / 旋转 / 缩放实例
想改复制品内部:实现实例 → 设置位置

实现实例(Realize Instances)的意思是把轻量的引用真正展开为独立几何。它很有用,但会增加真实几何数量,所以不要在只需移动或缩放整体时提前使用。

第七站:场什么时候真的被计算?

一个常见误会是:看见 位置 → 分离 XYZ → 数学 就以为 Blender 已经先得到一串数字,再交给后面的节点。

实际更接近下面的执行方式:

设置位置准备处理顶点 A:
  取 A 的位置 → 取 Z → 按数学节点计算 → 用于 A 的偏移量

设置位置准备处理顶点 B:
  取 B 的位置 → 取 Z → 按同一条规则计算 → 用于 B 的偏移量

因此场是延后执行的规则。它可以被接到多个地方;不同的接收者甚至可以在不同上下文中调用它。

这也解释了为什么“几何流”和“字段流”应该分开看:

几何流:哪份几何传到哪里,最后长成什么
字段流:对其中每个元素要怎样计算

第八站:属性为什么不是场?

场是规则,属性是已经写下来的结果。

例如“位置的 Z 值乘 2”可以一直只作为场存在。它在需要时才算。如果用 储存命名属性 把它以 高度 的名字存到点域,那么每个顶点就真有一格名为“高度”的数据。以后 命名属性 可以把它读出来。

场:现问现算
属性:提前写进几何的一张表

直接连接场通常更轻、更清晰。只有确实需要把结果跨步骤保留、提供给材质,或反复读取时,再把场存为属性。

第九站:域转换为什么一开始听起来很绕?

你的反馈

“什么玩意,没看明白。”

这是很正常的反应。域转换不应该先从术语开始讲,而应该先看一个共享关系。

两个面可以共用同一个顶点。假设左面有“红色”这个面数据,右面有“蓝色”这个面数据。现在下游节点要求“每个顶点一个颜色”。共用的顶点只有一份位置、只能拿一个结果;它无法原封不动同时保存红和蓝两份“每面数据”。Blender 因而需要把信息整理到点上。

这就是域转换最值得先记住的一件事:

当一种“每个什么一份”的信息,被交给另一种“每个什么一份”的操作时,数据的归属关系变了,结果可能需要合并、插值或重新选择。

现在并不需要背任何细节规则。做节点时只要发现“颜色混了”“本来一面一个的随机看起来不对”,再回头检查是不是从面域到了点域,或反过来即可。

第十站:最后该怎么自己读节点树?

所有概念最后都落在同一条检查路线:

1. 谁正在使用这个场?
2. 它在处理哪种组件?
3. 它按哪个域处理?
4. 因此场会对每个什么元素算结果?
5. 这是实例整体,还是实例内部网格?
6. 数据有没有从一个域交给另一个域?

你不需要在脑中背下 Blender 的所有域、所有节点或所有转换规则。真正要形成的是这个阅读习惯:先确定接收者,再确定组件和域,最后才解释场的结果。

当这条顺序变成反射动作,场、上下文、组件、域就不再是四个难记的名词,而是你用来读懂节点树的四个问题。