一条曲线可以直接变成一排朝向一致、间距可控的实例:Curve to Points 负责取样,Instance on Points 负责摆放,必要时再用 Realize Instances 把实例变成可编辑的真实几何。

曲线取样并实例化的几何节点示意图

这套节点适合做路径灯、围栏、树列、散布的模块化建筑,或任何“沿线重复出现”的元素。关键不在节点数量,而在分清三件事:点从哪里来、实例怎么朝向、什么时候需要实化。

最小可用节点树

先准备两件物体:一条曲线作为路径,一个小立方体(或任意模型)作为实例原型。把曲线添加 Geometry Nodes 修改器,然后搭出下面的链路:

Group Input(曲线)
  → Curve to Points
  → Instance on Points
  → Group Output

Object Info(实例原型)
  └──────────────→ Instance on Points 的 Instance

Curve to PointsPoints 输出提供实例位置;把 Object InfoGeometry 接到 Instance 输入。将模式切到 Length,并设置 Length = 0.6 m,就得到每 0.6 米一个实例的初始效果。

官方手册将 Curve to Points 定义为把曲线转换为点;节点同时提供每个点的旋转信息。Instance on Points 则在输入点上创建实例,并把点的旋转作为默认实例旋转。Curve to Points 文档 · Instance on Points 文档

间距:先选 Length,再考虑 Count

做路径灯、栅栏这类“物理间距明确”的资产时,优先使用 Curve to PointsLength 模式。改变曲线长度时,节点会增加或减少点数,间距仍接近设定值。

Count 模式适合另一种需求:无论曲线多长,都只要固定数量的对象。它会保持总数,因而曲线拉长后,实例之间也会被拉开。

一个实用判断:

  • 关注“每隔多少米出现一个”时,用 Length
  • 关注“整条曲线总共出现多少个”时,用 Count
  • 末端不够整齐时,先检查曲线的首尾长度与 Length 值是否匹配,而不是急着加随机偏移。

朝向:先利用曲线给出的 Rotation

许多“实例横着躺”或“正面不沿路径”的问题,并不是曲线出错,而是原型物体的本地坐标轴和曲线切线不一致。

最简单的检查方式是:先不要接 Rotation,确认间距正确;再将 Curve to PointsRotation 接到 Instance on PointsRotation。若朝向整体偏转 90 度,在两者之间插入 Rotate Rotation,只给原型补一个固定的欧拉角偏移。例如,原型的正面应沿本地 X 轴时,常见做法是在 Z 轴上补 ±90°;具体方向应以模型的本地轴为准。

不要用逐点随机旋转来掩盖轴向错误。固定校正应该在前,随机变化应该在后。

加一点变化,但让变化可复现

Instance on PointsScale 输入前接一个 Random Value:数据类型选 Vector,最小值设为 (0.85, 0.85, 0.85),最大值设为 (1.15, 1.15, 1.15)。这样每个实例会有轻微、均匀的尺度差异。

如果需要更可控的节奏,不要只调随机种子。可以用 Spline Parameter 的 Factor 接 Map Range,让实例从曲线起点到终点逐渐变大或变小;这比纯随机更适合做道路灯带、队列或生长动画。

Realize Instances 什么时候接

实例很省内存,也能让节点树保持轻。只有当下游节点必须逐个处理真实网格时,才加 Realize Instances

  • 要对每个实例单独布尔、焊接或挤出;
  • 要把结果导出为普通网格;
  • 下游操作没有按实例域生效。

如果只是渲染、变换、复制或继续按实例处理,就先保持实例状态。过早实化会让后续计算面对大量重复网格,既慢,也失去实例化的好处。

一次排错顺序

看不到实例时,按这个顺序检查:

  1. Object Info 是否指向了正确的原型物体;
  2. Curve to Points 是否真的输出了点;
  3. Instance on PointsPointsInstance 两个输入是否都已连接;
  4. 原型是否被缩得太小,或被局部坐标轴旋转到意外方向;
  5. 是否在不必要的地方提前接了 Realize Instances

先把“曲线 → 点 → 实例”这条链跑通,再添加随机、选择和材质。它是几何节点里最可靠的一类基础组合:路径负责结构,点负责分布,实例负责重复,后续变化都可以插在这三个职责之间。