在这个使用 Blender 3.3 创建的教程中,我们将学习如何制作一些红细胞在血管内部运动的动画。
本教程的视频版本目前尚未提供该语言版本。英文版视频可通过以下链接观看:
视频文字稿
大家好!
在这个使用 Blender 3.3 创建的教程中,我们将学习如何制作一些红细胞在血管内部运动的动画。

在本教程中,我们将学习如何建模血管和红细胞,如何使用 Emitter 类型的粒子系统生成红细胞,以及如何通过 Force Field 让它们沿着血管路径运动。
我们从一个完全空的场景开始,对血管进行建模。
首先,在顶视图中,最好使用正交视图,我们插入一条 Bezier 曲线,并在 Edit Mode 中通过添加和移动几个控制点来对它进行建模。
这条曲线表示血管的路径。对于我们的需求来说,可以将它保持在 2D 平面中。这也是为什么我从上方以正交视图来构图。

在路径建模完成后,我们回到 Object Mode,并在场景中插入一个 Bezier Circle。它将代表路径的截面轮廓,我们会保持它为圆形。稍后会使用 Displace 修改器来扰动路径的内壁。

为了将 Bezier Circle 设置为 Bezier Curve 的截面轮廓,我们需要先选中 Bezier Curve,并将其重命名为 Vessel Path 以便区分。然后在 Properties 编辑器中打开 Object Data 选项卡,进入 Geometry - Bevel - Object 部分,将刚创建的 Bezier Circle 指定为 Bevel 对象。

如果轮廓看起来过大或过小,只需对 Bezier Circle 进行缩放即可。如前所述,没有必要在 Edit Mode 中修改 Bezier Circle 的轮廓,因为圆形截面已经完全合适。
在我的情况下,从内部查看时血管似乎是不可见的。这是因为在 Viewport Shading 菜单中启用了 Backface Culling 选项。
该选项会隐藏法线未朝向观察者的面。在某些情况下它很有用,但在这里并不适合,因此我将其关闭。

接下来,我们复制一份路径(SHIFT+D 然后 Enter),并将其命名为 Path Copy,同时暂时将其隐藏。这份副本有两个用途:
-
第一,作为安全备份,因为我们很快会将原始路径从 Curve 转换为 Mesh;
-
第二,作为原始曲线的副本,之后可以用它作为红细胞跟随的路径。

路径需要被转换为 Mesh,这样我们才能对其应用 Displace 修改器,从而扰动血管壁,使其在视觉上更加有趣。
可以通过右键并选择 Convert To Mesh 来完成转换。但我想指出一点:在我的情况下,圆形截面的顶点密度远高于构成路径的段数。

由于我更希望面尽可能接近正方形,我在 Object Mode 中撤销了转换操作(CTRL+Z),然后在原始控制点之间距离过大、手柄过长的位置插入一些中间控制点,因为这些位置会生成矩形的面。

然后,如前所述,我通过右键并选择 Convert To Mesh,将对象转换为 Mesh。
接下来,我为该对象添加一个 Displace 修改器,并为其指定一个 Clouds 纹理,同时将 Scale 设置得较低,以引入大量的扰动。

不过,这个效果并不理想。这是因为转换后得到的网格不够“密集”,也就是说,可用于变形的顶点和面数量太少。为了解决这个问题,我为对象添加一个 Subdivision Surface 修改器,并将细分级别至少设置为 2。
Subdivision Surface 修改器需要放在 Displace 修改器的上方。修改器的顺序非常重要,因为网格必须先通过 Subdivision Surface 进行细分,然后再由 Displace 进行扰动。

接下来,我们调整 Texture 的 Size 数值以及 Displace 修改器的 Strength,直到得到一个令人满意的效果。如果有需要,也可以尝试为 Displace 使用不同的纹理,或者在修改器堆栈的最后再添加一个 Smooth 修改器,用来稍微柔化这些扰动,从而完成血管的建模阶段。

完成这些操作后,我们为血管指定一个材质。在我的示例中,为了获得你在教程预览中看到的效果,我使用了一个红色的 Velvet 材质。这个材质以一种特殊的方式反射光线。在这里,结果并不需要达到照片级真实感,因此稍微柔和、模糊一些的效果是完全可以接受的。

不过,在预览最终效果之前,我们还需要完成两个步骤:
-
将虚拟世界的背景设置为黑色,在 World - Background - RGB Color 中进行设置;
-
并在血管内部至少放置两个 Point Light 光源。

从顶视正交视图中插入 Point Light 会非常方便。我建议先将光源放置在靠近曲线的位置,并且一开始只创建一个光源,然后使用 ALT+D 复制它,生成链接副本。这样做的好处是,这些副本会共享第一个光源的参数。因为在初期我们并不清楚光源应有的强度,需要不断尝试,而使用链接副本时,只需修改一个光源的强度和颜色,其余副本也会同步应用相同的设置。

在血管入口处也放置一个光源的链接副本,否则红细胞在刚进入时会显得过暗。

最后,我们可以在 3D Viewport 中按 Z 并选择 Rendered 来查看渲染预览,从而调整光源参数,直到获得理想的效果。

在这个阶段,我们还可以插入并摆放稍后用于渲染的摄像机。具体来说,在 Object Mode 中使用 SHIFT+A 并选择 Camera,将一个 Camera 对象插入到场景中。然后在 3D Viewport 中调整视角以确定序列的初始构图,接着打开 Blender 的搜索框(在我的设置中可以通过空格键调用),搜索 Align Camera to View 这个选项(快捷键是 CTRL ALT NUMPAD 0)。

调整摄像机的位置,如有需要,还可以在 Object Data 选项卡中修改它的焦距,例如降低焦距数值,以获得更宽广的广角构图效果。

当材质、灯光和摄像机的设置都完成后,切换回 3D 场景的 Solid 视图模式,并移动到一个空区域来建模红细胞的原型。
红细胞的建模方式有很多种,选择非常灵活。在我的示例中,我创建了一个 UV Sphere,将其在两极方向压扁;然后删除极点的顶点,并在 Edit Mode 中使用 GRID FILL 填充由此产生的空环。

我之所以进行这些操作,是因为我也打算对红细胞应用一个 Displace 修改器。不过在此之前,我先在 Object Mode 中将着色方式改为 Shade Smooth,因为默认的 Flat 着色看起来棱角太明显了。

接下来我进一步对红细胞进行建模,在靠近两极的位置将其压扁。我通过选择需要调整的顶点,然后沿 Z 轴(垂直方向)移动或缩放它们,直到获得理想的形状。

关于几何形变的处理,操作方式与血管类似,也就是添加并设置 Subdivision Surface 和 Displace 修改器。不同的是,这一次 Subdivision Surface 很可能只需要 1 级细分就足够了。
如果即使大幅调整 Texture 的 Size 参数,Displace 引入的形变仍然不明显(或者相反,效果过强),可以尝试使用 CTRL+A 并选择 Apply Scale 来应用对象的缩放变换,尤其是在你对对象进行过缩放的情况下。这个注意事项同样适用于血管对象。

当建模阶段完成后,为这个红细胞原型指定一个材质。在这个阶段,可以暂时将红细胞原型移动到血管内部一个光照良好的位置,在 Rendered 视图模式下预览最终效果。
这一次,我选择使用一个 Principled BSDF 材质,颜色为稍微偏深的红色,并将 Roughness 设置在大约 0.6 左右,以在物体表面产生柔和的高光反射。

完成这一步后,将红细胞移回血管外部,并切换回 Solid 视图模式,专注于创建用于发射红细胞的粒子系统。
要将红细胞作为粒子系统的粒子进行发射,我们首先需要一个发射器对象。
在我们的案例中,一个 Plane 就完全够用。因此,将一个 Plane 插入到场景中,并且最重要的是,将它的上表面朝向血管入口的方向,因为这正是我们希望红细胞被发射的方向。

为了将粒子系统关联到新创建的 Plane 上,打开该对象的 Particle Properties 选项卡,然后点击 “+” 按钮。
默认情况下,新创建的粒子系统类型就是 Emitter,这正是我们所需要的。

我们不希望创建过多的粒子,但要确保它们是红细胞原型的实例,具有随机旋转,在整个动画时长内持续发射,并且一直存在到动画结束。
最后一点需要说明一下,因为正如我们将看到的,粒子是有生命周期的,我们会相应地进行设置。
至于粒子的数量,我们会在评估动画效果时进行测试,但现在先在粒子系统面板的 Number 字段中将其设置为 100。

关于动画的时长,我保留 Blender 默认的 250 帧(在每秒 25 帧的情况下相当于 10 秒的视频),因此可以设置为:
-
Frame Start 0
-
End Frame 250
-
Lifetime 250
为了让新生成的粒子成为红细胞原型的实例,打开粒子系统的 Render 选项卡,将 Render As 从 Halo 改为 Object,然后在下方的 Instance Object 中指定红细胞对象。

现在,当我们开始播放动画时,会注意到生成的粒子存在一些需要修正的问题:
-
它们的尺寸不合适;
-
它们会掉入虚空;
-
它们的朝向完全相同;
-
它们并没有朝向血管方向发射。


我们将逐一解决这些问题,先从最简单的开始:移除重力。
打开粒子系统的 Field Weights 选项卡,将 Gravity 的值设置为 0.0。现在粒子将不再掉入虚空。我们可以将时间轴定位到第 1 帧,然后再次播放动画来确认这一点。

粒子的尺寸可以在粒子系统的 Render 选项卡中,通过调整 Scale 参数来修改。我不确定红细胞是否会有不同的尺寸,因此我将引入随机尺寸变化的 Scale Random 值保持为 0.0。

请注意,我们仍然可以在 Object Mode 和 Edit Mode 中修改红细胞原型,同时也能在粒子上看到这些变化,因为这些粒子都是该原型的实例。
至于粒子的旋转,我们可以为其设置一个初始的随机旋转方式。方法是先启用粒子系统中的 Rotation 部分,然后在该面板中的 Randomize 字段里设置一个大于 0.0 的数值。

回到时间轴的第一帧并再次播放动画,就可以观察到具有随机朝向的粒子生成效果。
最后一个需要解决的问题,是让粒子沿着血管运动。
还记得那条作为副本的血管路径吗?也就是那条名为 Path Copy、类型为 Bezier Curve、被隐藏并与血管(已转换为 Mesh)重叠的曲线。现在正是使用它作为粒子路径的时候。
选中 Path Copy,在 Properties 编辑器中打开 Physics 选项卡,并为其添加一个 Force Field。

将 Force Field 的类型从 Force 改为 Curve Guide。此时我们不会注意到什么明显变化,这也与 Path Copy 当前是不可见的有关。因此先将它重新显示出来,并在血管入口处寻找一个虚线圆圈。
这个圆圈表示粒子系统的作用范围。当粒子进入该区域时,就会受到 Force Field 的影响。

接下来,我们需要将 Plane 移动到更靠近这个作用区域的位置,并且最重要的是,将这个区域放大,以便包含生成的粒子。为此,我们在 Force Field 选项卡中修改 Minimum Distance 参数的数值。

回到时间轴的第 1 帧并开始播放动画,观察结果。
如果粒子沿着的路径与曲线并不一致,原因可能在于 Bezier 曲线是有起点和终点的。很可能我们认为是血管入口的位置,在实际曲线中却是终点。
为了解决这个问题,我们切换到 Edit Mode,选中曲线的所有控制点,然后在 Blender 的搜索框中查找并执行 Switch Direction 命令,以反转曲线方向。

返回 Object Mode,将时间轴重新定位到动画的第 1 帧,然后点击播放按钮,观察最终效果。
如果结果符合预期,就可以再次隐藏 Path Copy 对象。

现在,我们也可以从虚拟摄像机的视角来预览动画,并根据需要调整粒子系统生成的红细胞数量,或者其他参数,比如 Displace 效果的强度或物体的尺寸等。
最后,我们还可以为虚拟摄像机制作运动动画。这一步可以很容易完成:在 Top Ortho 视图中观察场景,在血管内部为摄像机的位置和旋转插入关键帧,具体取决于你希望实现的动画效果,并在 3D View 中从摄像机视角检查结果……

……然后我们会发现一个问题。如果在 250 帧的动画中,我们让摄像机移动并覆盖了血管的大部分区域,那么我们将永远看不到粒子,因为它们会始终位于摄像机后方。

有多种方法可以解决这个问题。其中一种方法是在动画开始之前就发射粒子,例如在粒子系统的 Frame Start 字段中设置为 -100。但要注意,在这种情况下,Lifetime 必须设置为 350,否则粒子会在时间轴的第 150 帧消失。
完成这些修改后,在 3D Viewport 中重新检查动画,确保这次一切正常。最后,我们就可以开始渲染动画了。

在结束本教程之前,关于粒子系统的缓存以及在渲染过程中可能出现的一些问题,我想做一个简短的说明。尤其是在你为了展示场景在不同阶段的状态而进行了多次中间渲染预览之后,再继续进行最终动画渲染时,这些问题更容易出现。
在这些情况下,你可能会注意到时间轴底部出现一条红线,这表示 Blender 已经计算并缓存了动画到该位置为止。

最糟糕的是,有时在多次在 3D View 中进行渲染预览之后,这条红线可能会以“块状”或“分段”的形式出现。

问题在于,在这种情况下,Blender 会对一部分帧使用正确的缓存结果,而对另一部分帧重新进行不同方式的计算,从而产生错误的结果。于是,在某些帧中,你会看到粒子处在正确的位置,而在另一些帧中,粒子要么出现在错误的位置,要么干脆完全消失。

因此,在开始最终动画渲染之前,你需要执行以下操作:
-
返回到动画的第一帧;
-
打开粒子发射器对象的 Particle System 中的 Cache 选项卡,在这里你可以看到当前缓存中的帧信息;
-
点击 “+” 按钮添加一个新的缓存(它一开始是空的),然后点击 “-” 按钮删除之前的缓存;
-
最后,点击 Bake 按钮,重新计算并缓存整个正确的粒子模拟。


此时,红色条应该覆盖整个时间轴,这表示所有帧都已经被计算并正确地存储在内存中。

现在,通过 Render - Animation 开始渲染动画时,生成的文件就不应该再出现任何令人头疼的问题了……
……不过,在最后再提醒一点,请记得在 Render Properties 选项卡中启用 Denoise for Rendering。在这种材质和灯光设置下,这个选项非常有用,它可以让你在使用较少 Samples 的情况下完成渲染。在我的示例中,Samples 只设置为 100。

总结一下,在本教程中:
-
我们学习了如何建模血管路径和红细胞;
-
我们为对象设置了基础材质,并为场景添加了简单的灯光;
-
我们了解了如何使用 Particle System 生成红细胞实例
-
我们还学习了如何让红细胞沿着血管内部的路径运动。
希望这个教程对你有所帮助!
我们下次再见!