在这个使用 Blender 4.3 制作的建模教程中,我们将学习如何创建一条链条,并让它沿着由 Curve 对象定义的路径和长度进行分布。
本教程的视频版本目前尚未提供该语言版本。您可以在下方观看带字幕的英文版视频;视频下方提供了翻译成中文的文字稿。
视频文字稿
大家好!在这个使用 Blender 4.3 制作的建模教程中,我们将学习如何创建一条链条,并让它沿着由 Curve 对象定义的路径和长度进行分布。更广泛地说,利用这里展示的方法,我们还可以建模并制作动画,让对象沿着任意路径自动复制排列。

首先,我先创建链条的第一个元素。创建这种对象的方法有很多。我这里从一个 Torus 开始,并减少它的顶点数量,因为默认数量实在太高了。我旋转这个圆环,让两个 Edge Loop 沿着 Y 轴对齐,然后使用 Loop Cut 工具在 Y 轴中间位置再添加两个 Edge Loop,并沿着 X 轴移动整个右半部分。这样就得到了链环的基本形状。在 Edit Mode 中,我把对象重新放到场景中心,这样对象的 Origin 就位于物体中心。

在继续教程之前,我想说明一下,你可以轻松调整构成链环的 Edge Ring 大小。只需在 Edit Mode 中切换到 Edge 选择模式,选中一个 Edge Ring,将变换方向改为 Individual Origins,然后使用 Select Edge Rings 选中所有 Edge Ring,并进行缩放即可。即使链条完成后,你仍然可以应用这个变换来改变链环外观。完成后,我会把变换方向重置回 Median Point,以防万一。

现在我向场景添加一个 Curve。Curve 对象有不同类型,其中一种叫做 Path。不过 Path 属于 Nurbs 对象,它使用外部控制点和权重系统。所以我更喜欢使用 Bezier Curve,并正确设置其缩放和方向,使它的一个初始控制点与链环的 Origin 重合。

接下来我选中链环,并给它添加一个 Array 修改器。默认情况下,它会沿 X 轴偏移一个单位创建副本。我立刻注意到新副本没有和原对象对齐。这是因为我之前将 Torus 旋转了 10 度,而这个变换同样会应用到 Array 创建的新对象上。为了解决这个问题,我按 CTRL A,然后在菜单中选择 Rotation and Scale 来应用旋转变换。由于这个对象的缩放是均匀的,因为我没有在 Object Mode 中调整 Torus 大小,所以理论上不需要应用 Scale,不过这并不重要。


为了让第二个链环插入第一个链环内部,我只需要降低 Relative Offset 中的 Factor X 数值。不过这里有个问题,在 Array 设置中无法设置旋转因子,因此第二个以及后续链环无法在这里进行旋转。

为了解决这个问题,我需要向场景添加第三个对象,这次使用一个 Empty,并把它精确放到第一个链环的 Origin 位置,同时确保不要缩放它以免出现问题。然后我把这个 Empty 指定到 Array 修改器中的 Object Offset 字段。现在,只需将 Empty 沿 X 轴旋转 90 度,除了第一个元素之外的所有元素都会依次旋转 90 度。所以 Relative Offset 和 Object Offset 会同时生效。前者用于移动链环副本,后者用于旋转它们。提高 Array 修改器中的 Count 数值后,我们就能在 X 轴上得到一条链条。



接着,我把 Array 修改器中的 Fit Type 从 Fixed Count 改成 Fit Curve,并将 Bezier Curve 指定为用于长度计算的 Curve 对象。这样 Array 会自动创建足够数量的链环以匹配 Curve 对象长度,不过它仍然只是沿着一条直线,从第一个控制点延伸到最后一个控制点。

为了让 Array 创建的副本沿着曲线路径排列,我给 Torus 对象添加一个 Curve 修改器。修改器顺序很重要,尤其是 Curve 修改器必须位于 Array 修改器之后。不过即使已经选择了正确的变形轴,也就是 X 轴,目前结果依然不太正确。接下来修复几个导致这种情况的设置。

首先,Curve 对象的 Origin 位于实际曲线之外。为了获得正确结果,Origin 应该位于第一个控制点,并且与第一个链环的 Origin 重合。因此我进入 Edit Mode,选中第一个控制点,并使用 Cursor to Selected 工具,把 3D Cursor 放到那里。然后回到 Object Mode,使用 Origin to 3D Cursor 工具,将 Curve 对象的 Origin 移到那个位置。


效果已经好多了,不过我们立刻会发现,第一个链环实际上被放到了最后一个控制点位置,而链条从那里继续向曲线外部延伸。这说明还有另一个问题需要修复,也就是曲线方向。Curve 对象具有方向属性,可以在 Edit Mode 中通过 Curve Edit Mode Overlays 菜单启用 Normals 显示进行查看。


要反转曲线方向,交换起点和终点,我们需要在 Edit Mode 中选中曲线所有元素,然后在 Segments 菜单中使用 Switch Direction 工具。不过结果依然还不完全正确。


最后需要修正的是曲线的旋转。我之前沿 Y 轴旋转了 180 度来翻转曲线,这导致实际方向产生混乱。为了解决这个问题,我按 CTRL A 并选择 Apply Rotation。虽然此时曲线缩放系数不是 1,但这次我不会应用 Scale,因为这样还需要调整其他参数。保持现状会更方便。现在终于得到正确结果了。


现在我们可以选中 Curve 对象,进入 Edit Mode,通过移动、旋转或者挤出控制点来修改它,并观察这些变化如何作用到链条上。链环数量会根据曲线长度自动变化,而长度会随着控制点移动或挤出实时更新。


不过,如果移动我们用于实现这个效果的三个对象中的任意一个,一切都会出问题。变换 Empty 会影响 Array 修改器创建的所有副本,而移动 Curve 或 Torus 则会导致二者错位,从而使 Curve 修改器产生错误结果。

为了解决这个问题,最简单的方法是把 Curve 对象的第一个控制点,也就是第一个链环的位置,移动到 Empty 所在位置,然后将 Curve 和 Torus 都设为 Empty 的子对象。Parent 设置通过多选完成,最后选中的对象会成为其他对象的父对象。在这里,Empty 必须是最后选择的对象。

完成之后,只需要移动 Empty,就能设置整条链的起始位置。之后,你可以选择 Bezier Curve,进入 Edit Mode 来修改链条形状。

在结束教程之前,再送大家一个小技巧。如果你想制作曲线动画,可以使用一种叫 Hooking 的技术,把额外的 Empty 绑定到控制点上。操作方法是在 Edit Mode 中选中一个或多个控制点,然后使用 Hook to New Object 工具。例如,我这里只对 Curve 对象的最后一个控制点进行操作。新创建的对象也是一个 Empty,我会立即将它重命名为 Hook Empty,避免混淆。这个对象不一定需要设为其他对象的子对象。之后,你可以给这个新对象插入动画关键帧,并观察链条动画效果。



Array 修改器中的 Fit Type 当前设置为 Fit Curve,对于这种动画可能不是最佳选择,因此我建议尝试使用 Fixed Count。好了,本次教程就到这里。希望对你有所帮助,下次见!
