从“场”看懂几何节点
面向初学者的几何节点核心概念笔记。中文节点名后保留英文名,方便在 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),域 = 面
↓
每张面得到一个随机值
把随机值想成抽签机:放在顶点队列前,每个顶点抽一次;放在面队列前,每张面抽一次。抽签机没有改变,队列改变了。
读场的实战顺序
遇到复杂节点树时,不要先盯着场从哪里来。按下面四步读:
- 哪个节点正在使用这个场?
- 这个节点处理的是什么组件?
- 它按什么域处理?
- 因此,场会对每个什么元素给出结果?
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 的所有域、所有节点或所有转换规则。真正要形成的是这个阅读习惯:先确定接收者,再确定组件和域,最后才解释场的结果。
当这条顺序变成反射动作,场、上下文、组件、域就不再是四个难记的名词,而是你用来读懂节点树的四个问题。
