最近一直在折腾Blender里的向量场可视化,从几何节点到粒子系统,总算摸出一条能稳定复现的路。这篇博文是我完整的Blender学习笔记,从原理到实操,把制作向量场的流程和踩坑记录都整理出来了。
向量场说到底就是空间每个点都有一个方向向量。在Blender里,你很难像Houdini那样直接看到一条矢量箭头场,但通过Geometry Nodes我们可以把一个普通网格拆成点云,然后在每个点上实例化箭头,箭头的方向、长度和颜色都从某个向量源来。这个思路天然适合做数据可视化、程序化动画、力场研究,甚至还能把结果导出成网格给其他软件用。
如果你也想过:怎么在Blender里把流体速度、噪波方向或者自定义公式变成一个看得见、能动的场?这篇笔记基本能回答你。我尽量把原理和节点都讲透,不光是给你一个能抄的作业,而是让你知道哪些环节容易出问题、为什么出问题。
1. 为什么要在Blender里做向量场
1.1 向量场能干什么:从数据可视化到粒子控制
“向量场”听起来有点学术,但你在做流体模拟、粒子动画、磁场展示时,它其实就是“周围的风向数据”。假设你想做一片树叶随着风向飘动,那个风就是向量场;想让粒子在某个力场里绕圈,那个力就是向量场;想把论文里的电场强度分布画成一张图,那也是向量场。
在Blender里做向量场,常见有三类诉求。第一类是纯可视化,希望在每个采样点看到箭头或线段,直观展示方向和大小,适合科学插图或动态海报。第二类是让粒子、形变或其他物体跟随场运动,比如粒子沿着噪声场流动,或者物体在场里受“推力”扭动。第三类是把自己写的数学函数(比如螺旋场、涡流、双极磁场)变成一个可交互的3D场景,方便同学、同事或者甲方看清模型。
这里有一个关键认知:向量场不是一个单一的Blender功能,而是一种“数据映射”方法。你要做的是把空间坐标和向量数据对应起来,然后用几何节点或粒子系统把数据渲染成看得见的东西。理解这一点后,你需要学的不是某个“向量场按钮”,而是“点、向量、实例化”这条链路。
1.2 Blender里做向量场的三条技术路线
我在动手前把常见教程翻了一遍,发现做法大致分成三派。
第一派是粒子系统加力场。你给一个平面加Particle System,然后摆放Force Field,粒子就会沿力场方向运动。把粒子显示为路径线,就能看到类似流线的效果。优点是操作快、适合预览;缺点是方向精度低,基本没法精确控制单个箭头的朝向。
第二派是几何节点。它把每个采样点当成数据容器,在点上面实例化箭头、线段、立方体,能精确控制旋转和缩放,还能实时用时间和函数驱动。缺点是学习门槛稍高,节点层级一多容易绕晕。
第三派是材质着色器。利用Shader节点里的向量信息驱动颜色、发光、法线偏移,能做出非常漂亮的渲染图,但结果不产生真实几何体,没法导出模型,也没法和物理模拟交互。
三条路线各有优劣。如果只是一次性渲染一张“向量场示意图”,着色器最方便;如果要快速看风场流动,粒子系统最快;如果要长期做项目、要导出Mesh或者要精确表达“每个点方向不同”,几何节点绝对是最推荐的。
1.3 为什么我不建议一上来就做流体模拟
很多读者看到“向量场”会想到计算流体力学里的速度场,于是想在Blender里用流体模拟来做。我劝你别一上来就往这个方向钻。Blender的流体模拟流程比较重,要先建Domain、设Effector、再烘焙网格,一套流程下来少说十几分钟。而且模拟得到的向量数据很难直接导出成箭头,通常只能通过轨迹可视化,不方便做论文或教程配图。
几何节点做向量场的最大优点是即时反馈。你调整噪声参数、改一下向量公式,视口里的箭头马上跟着变。这种“所见即所得”的工作流,对初学阶段培养空间感特别重要。等你把几何节点这套玩熟了,再去碰流体模拟内部的速度场,会轻松得多。
2. 建场前的准备:几何节点操作面面观
2.1 从网格开始:一个平面的定位思路
先新建一个平面(Add > Mesh > Plane),然后给它加Geometry Nodes修改器,新建立方体节点组。这里有个细节:默认平面只有4个顶点,直接拿来做向量场采样点太稀疏了。我们要在节点组里用Grid节点重新生成一片区域,作为场的采样空间。
Grid节点的参数看起来很简单,Type选Grid,然后设置Size X、Size Y和Vertices X、Vertices Y。比如我想做一个边长2米的正方形场,把Size X和Size Y都设为2,Vertices都设为20,那么就会生成400个点。如果你想要圆形或球形场,也可以换成Mesh Circle或Ico Sphere,思路完全一样。
创建好Grid之后,不要直接把它送给Instance on Points。因为Grid本身是一个二维网格,它的点虽然带位置,但你最好显式地把它转成“点云”,这样后面用起来更顺手。推荐在Grid后面接一个Mesh to Points(或者Distribute Points on Faces),模式选Faces。这样每个采样点会带上对应的法线方向,后续如果想让箭头始终朝向平面法线,可以直接用法线作为基础向量,不需要额外计算。
还要注意一下Grid的位置。默认生成的Grid中心在原点,Z轴朝上。如果你打算让向量场围绕场景中的某个空物体旋转,可以在Grid前面加一个Transform节点,把Grid放到指定的位置。但我个人习惯是把Grid物体的原点放在场中心,这样后续的Noise采样坐标和视口位置都能对得上,排查问题时好理解。
2.2 噪波纹理作为向量源
向量场的“源”很重要。最方便的来源就是Noise Texture节点,在Geometry Node编辑器里可以直接添加。Blender的Noise Texture默认输出Fac(灰度值)和Color(RGB颜色)。很多新手直接把Color接到后面的方向向量,结果箭头老是朝一个大致方向偏,因为Color的分量范围是0到1,不是-1到1。
要让向量能朝任意方向,必须做一次映射。我的做法是把Color输出连到Map Range节点,From Min设0,From Max设1,To Min设-1,To Max设1,让三个通道都从0-1映射到-1-1。这样向量的分量可能是负值,箭头才会出现左右、上下、前后各种角度。
如果你不想用噪波,也可以直接用Combine XYZ节点,手动写向量函数。例如做一个沿Y轴方向、强度随Z轴衰减的场:
- X分量:0
- Y分量:1
- Z分量:0 然后用Math节点乘上一个随高度变化的系数。
更进阶一点的做法是,用Separate XYZ把Position坐标拆开,分别驱动X、Y、Z分量。比如让向量围绕一个圆环旋转,可以写X = sin(x),Y = cos(y),Z = 0,这样能做出漩涡效果。对刚入门的朋友来说,用噪波是最好出效果的,因为不用一开始就死磕数学公式。
2.3 矢量运算与坐标空间
这一节是最容易踩坑的,很多同学做好箭头后旋转90度,或者位置对不上,都是坐标空间的问题。
Blender里每个物体都有自己的本地坐标(Object Space),而场景还有一个世界坐标(World Space)。Grid生成的采样点,它的Position是物体本地坐标。假如你把Grid物体在场景里旋转了90度,本地坐标的Z轴其实已经不再指向世界Z轴。此时直接用Position去采样Noise,得到的噪声场会跟你的视觉空间错位,箭头看起来就像“发疯”一样乱甩。
解决办法有两个。第一个是用Vector Transform节点,把Position从Object Space转换到World Space,用转换后的坐标去采样Noise,处理完后再用Vector Transform转回Object Space。第二个更简单:干脆别旋转Grid,把旋转操作放在Grid之前的三维变换节点里。也就是说,先用Transform把网格位置摆好,然后后面所有的向量计算都基于没有旋转的本地坐标。我强烈建议用第二个方案,因为省去多次坐标变换,节点图更清晰,也更容易调试。
如果你非要用空物体来控制向量场的中心,可以用Object Info节点获取空物体的位置,然后让Position减去这个位置,得到一个相对向量。这样做出来的场随空物体移动而移动,但方向不会随空物体旋转而旋转。如果需要跟随旋转,那就必须引入Vector Transform做完整的变换。
3. 核心实操:用几何节点把向量场“画”出来
3.1 实例化箭头:对齐向量与欧拉旋转的换算
万事俱备,终于到最核心的一步:把每个采样点实例化成箭头,并且让箭头方向跟向量方向一致。我通常用Cone节点来生成箭头头部,再用一个Cylinder节点作为箭杆。不过为了省事,也可以直接用Cone,设置Radius Top为0,Radius Bottom为0.02,Depth为0.1,这样就是一个锥形。
关键是怎么旋转。Instance on Points的Rotation输入要求是欧拉旋转,而我们得到的向量是一个三维向量,不能直接接线。必须通过Align Euler to Vector节点,把一个参考轴(默认是Z轴)旋转到目标向量方向。由于Blender的Cone默认尖端朝向+Z,所以Align Euler to Vector的Local Axis保持默认Z轴,旋转后尖端会精确指向向量方向。
连接逻辑大概是这样:
- Grid采样点接Instance on Points的Points。
- 向量源(经过Map Range的Color)接到Align Euler to Vector的Vector。
- Align Euler to Vector的Rotation接到Instance on Points的Rotation。
- 再把一个“箭头”的几何体接到Instance on Points的Instance。
如果你发现箭头尖端朝反方向,通常是因为你的向量源数值整体为负,或者Cone方向约定不同。解决办法是在Align Euler to Vector之前给向量乘一个-1,或者把Align Euler to Vector的Pivot和Local Axis调到-Z。别怕试,调一次就能记住。
3.2 调出向量场特征:缩放、颜色、裁剪
箭头实例化出来以后,默认大小通常不合适。特别是有400个点时,密密麻麻全是箭头,影响观察。我们可以通过向量的长度来控制箭头大小,向量长的地方箭头长一点,向量短的地方箭头短一点,这样整个场有强弱对比,视觉上更专业。
方法是在向量源后面接一个Vector Math节点,操作选Length,得到标量。再把这个标量接到Map Range,映射到0.05到0.3之间,作为Scale输入。注意映射的最小值最好大于0,否则箭头会完全消失。
颜色部分同样重要。为了让渲染图清晰表达方向性和强度,我建议把向量长度或向量分量值存成属性,然后用材质读取。更简便的方法是在几何节点里用Set Color节点直接给几何体顶点色赋值。把向量Length接到“Channel”的V值,或者用RGB三个通道分别映射XYZ分量,这样箭头表面就会根据朝向不同出现红绿蓝渐变。
如果场景里箭头太多,可以加一个Delete Geometry节点,用向量长度作为筛选条件。比如只保留长度大于0.5的箭头,这样密度大幅降低,画面更干净。也可以反向操作:删除长度很短的箭头,避免大量微小的杂点分散注意力。
3.3 把静态向量场变成动态流线
静态箭头只能显示某一时刻的场,不够活泼。Blender 3.0之后,几何节点支持实时读取时间,这让动态向量场变得非常简单。添加Scene Time节点,输出秒数。把这个秒数输入到Noise Texture的W端口,噪波就会随时间连续变化,向量场的指向也随之运动。
我习惯在Scene Time和W端口之间加一个Math节点,Mode选Multiply,倍率设为0.1到0.5。倍率不要太大,否则噪声变化过于剧烈,箭头疯狂抖动,视觉上像出错了一样。倍率设为0.3左右时,箭头会像风轻轻吹过一样缓慢旋转。
如果要生成真正的流线,而不是动态箭头,思路略复杂:让每个点沿着向量方向步进,每次步长用向量大小控制,多次步进后把这些点用曲线连接。几何节点目前没有原生For Loop,需要用“Repeat Zone”或者手动做几个步进节点。如果你的Blender版本没有Repeat Zone,可以只做两三个步进,效果也够用。将步进后的点升维成曲线,再用Profile Curve给曲线加半径,就能得到管状流线。
4. 用粒子系统做另一种向量场表现
4.1 粒子发射与力场关联
几何节点虽然强大,但有些场景用粒子系统更快。比如你想让大量粒子沿着力场方向飞驰,并显示出轨迹,粒子系统是天然的选择。
操作方法:新建一个平面,在Particle Properties里添加Particle System。类型选择Hair,这样粒子会产生路径。切换到Physical面板,把Field Weight里的Turbulence或Force调高。再到场景里添加一个力场(Force Field),比如Turbulence、Wind、Vortex。粒子会朝力场方向运动,并留下轨迹线。
为了更像向量场,把粒子显示方式改为Path,并设置Path Steps。Path Steps越高,轨迹越平滑,但占用内存也越大。我喜欢把轨迹线做细一点,加一个Bevel,让它看起来像流线。如果觉得粒子发射后太乱,可以限制发射数量,并将粒子的生命周期设短一些,这样只留下局部范围内的一段弧线。
4.2 用粒子实例化箭头
另外一种粒子思路是可以让粒子本身显示成箭头。在粒子系统的Render面板,选择“Object”,然后指定一个Cone作为实例物体。接着在Rotation栏设置方向来源为“Velocity”——粒子的速度方向。这样每个粒子不仅位置随力场运动,它的箭头方向也会自动指向速度方向,非常直观。
这个方法唯一的坑是速度突变时箭头会剧烈抖动。解决方法是给粒子增加Damping参数,让速度变化平滑。也可以在Cone上添加一个Soft Body约束,让箭头旋转具有惯性,但那样性能开销较大,一般不建议。
用粒子系统做向量场的好处是天然支持物理力场,适合表现真实世界的风场、引力场;坏处是可控性不如几何节点。如果你只想做一个静态的、准确可控的场,还是用几何节点;如果想快速生成动态轨迹,可以考虑粒子系统。
5. 制作中常踩的坑
5.1 摄像头框框不见了:视图导航问题
这个热搜词我太有共鸣了。做几何节点时容易手滑按到N键、Home键,或者误把视图改成局部视图,相机边框和网格地面就“消失”了。解决办法是:按N键打开右侧Sidebar,在View面板里勾选Camera和Grid Floor。如果整个场景都找不到了,按Home键重置视图到所有物体范围。也可以按0键切回相机视角,再按Tab键切换编辑模式,一般都能找回视图。
别小看这个问题,很多新手卡在这里半小时,以为Blender坏了。其实只是显示设置问题。
5.2 布尔运算和修改器顺序的影响
在制作向量场时,有时为了造型方便会加布尔运算修改器,例如用布尔切割出一个小洞。这时候如果把几何节点放在布尔运算之后,容易出问题,因为几何节点生成的点云和箭头没有闭合体积,布尔运算识别不了,结果可能直接消失或破面。
我的经验是:把几何节点修改器放在最上层(也就是最后执行),布尔运算放在几何节点之前。也就是说,先执行布尔切割,再应用几何节点生成向量场。如果非要几何节点之后再布尔,需要先应用几何节点,让它变成真正的网格,再添加布尔。这个顺序问题记牢,能省很多排查时间。
5.3 为什么我的节点没有实时更新
你调整了参数但视口里箭头没反应,原因不外乎三种:节点被Mute(Ctrl+M)了、视口显示被隐藏、或者修改器缓存没有刷新。我遇到最多的是Grid的Vertices改变后,箭头数量没变——这是因为你用了Distribute Points on Faces,且Density为0。把Density调成1,或者改用Mesh to Points,问题就解决了。
还有一个隐蔽原因:你在节点组里引用了外部物体,但那个物体被隐藏了。几何节点默认不显示隐藏物体的数据,需要把物体的Outliner里“显示在渲染视图”和“显示在视口”两个开关都打开。
5.4 导出FBX时转换失败的注意点
热搜词里那条“could not convert the .blend file to fbx file”我在导出向量场模型时也遇到过。原因很简单:FBX导出器不认识带有Geometry Nodes修改器的临时几何体,它尝试读取网格时发现是空的,于是报错。解决方法是先把几何节点修改器应用掉(右键模型 > Apply All Modifiers),使模型变成真正的Mesh。应用后,网格上会保留实例化后的箭头,面数会变大,导出前最好用Decimate修改器减一次面,让文件不至于太大。
如果你需要保留节点参数供后续调整,可以复制一份模型再应用导出,原文件保留节点组。这样既不影响工程,也能顺利导出。
6. 从向量场到作品:扩展思路
6.1 把向量场和MCP辅助结合
最近常看到“blender mcp 使用教程”,很多人用AI辅助生成Python脚本控制Blender。其实对于向量场这种高度流程化的事,AI辅助确实可行。你可以把“创建Grid、噪波映射、实例化箭头”这套流程交给AI生成一段Python脚本,然后在Blender里通过Scripting workspace运行。这样做可以快速调整参数量,甚至批量生成不同参数下的多组向量场。
不过要提醒一句,AI生成的节点脚本有时依赖特定Blender版本,运行前建议先备份工程。我目前更多用MCP来做重复性操作,比如批量修改材质名、批量导出PNG,真正复杂节点还是手动搭,因为可见性更好,出了问题好排查。
6.2 用几何节点组复用
当你花半小时调出一个满意的箭头向量场后,一定要把核心节点打包成Node Group。选中从向量源到实例化输出的一整段节点,按Ctrl+G打包,然后把向量类型、箭头大小、Grid密度设成Group Input参数。以后在其他项目里只需要拖出这个节点组,改改参数就能用。
我自己的项目中,这个向量场组成了基础库的一部分。做粒子发射时直接把箭头组替换成“点”发射器;做受力变形时,用向量场的值作为偏移量,驱动网格顶点位移。一种基础场结构,能衍生出很多玩法。
6.3 渲染成科学可视化风格
最后聊聊渲染。如果你要把向量场输出成一张论文配图或课程海报,试试这样的套路:背景用全黑或深蓝渐变,箭头材质用半透明高光材质,颜色用渐变映射。在几何节点里把向量Length映射到ColorRamp,生成从蓝到黄的渐变,然后通过Set Color存成顶点色;材质里用Attribute节点读取顶点色并连接到Base Color和Emission。
灯光方面不需要复杂设置,一盏参数默认的Area Light从顶部打下来就行,突出模型的立体感。渲染时开启Mist通道,后期用合成器添加一点辉光(Glare),箭头看起来会更精致。如果想让图片信息更丰富,可以把Grid线框也渲染出来,用线框材质作为底图,箭头叠加在上面,科学感立刻拉满。
我做向量场最大的体会是:不要被“向量场”这个名字吓住。Blender里只要理解了“点有位置、向量定方向、实例化把它显示出来”这一连串关系,剩下的事就是把节点一个个接起来。最后再分享一个小技巧:如果发现箭头旋转方向不对,不要急着改一堆节点参数,先选中物体按Tab键切换Global/Local坐标系,观察一下坐标轴的朝向,很多空间问题当场就暴露了。希望这份Blender学习笔记对你有帮助,也欢迎有更好的向量场可视化思路一起来交流。