引子:一个看似简单的阵列,让我加班到凌晨三点
上个月接了个私活,给一家酒店做大堂的装饰灯罩。甲方给的需求很明确:一个直径一米二的圆形吊灯,灯罩由若干片半透明的亚克力叶片组成,每片叶片大小、形状完全一样,但要绕着中心轴均匀分布,形成一种旋转的韵律感。叶片是双曲面,我准备用Rhino直接建模。
当时我心想,这不就是个Array Polar(旋转阵列)嘛,一分钟搞定的事。结果,从下午六点开始,我在这上面栽了三个大跟头,直到凌晨三点才把模型交付出去。今天把这个过程完整复盘一遍,把里面的坑和底层的原理都讲透,希望你别再走我的弯路。

需求拆解:从效果图反推阵列参数
甲方发来的参考图是那种叶片微微扭转,像被风吹散的花瓣一样层层叠叠的效果。我第一反应是:每片叶子在圆周上均匀分布,同时自身还要绕径向轴旋转一定角度,这样叠起来才有层次感。于是我把需求拆成三个核心参数:
- 阵列数量N:影响叶片的密度和最终的光影效果,甲方希望大约30片左右。
- 阵列半径R:决定了吊灯的整体尺寸,这里R=600mm。
- 叶片自身的扭转角度θ:这是实现“旋转感”的关键,每片叶子相对前一片要绕自身长轴多转一个角度。
技术选型上,我毫不犹豫选择了Array Polar(旋转阵列)命令,因为它专门用于在圆周上等距复制对象,支持围绕指定轴旋转,而且能同时调整每个副本的自身旋转。后面你会发现,这个“自身旋转”的细节,成了最大的坑。
第一版方案:直接Array Polar,翻车了
我先建了一片叶子:一个用Rhino的双轨扫掠(Sweep 2 Rails)做出来的双曲面,厚度2mm。然后执行:
命令:ArrayPolar
选择要阵列的物体:选中叶片
阵列中心点:0,0,0
项目数:30
要填充的角度:360
旋转复制的对象?:是(这个选项决定每个副本是否绕阵列中心旋转)
结果一出来,我差点把咖啡喷屏幕上。叶片是均匀分布在圆周上了,但每片叶子都垂直于圆周切线,而且全部朝着圆心方向,像一片片百叶窗一样,完全不是效果图里那种扭转的堆积感。问题出在哪?
Array Polar的“旋转复制对象”选项,默认是让每个副本绕着阵列中心轴旋转,也就是说,每个叶子自身的朝向会跟随圆周位置的变化而改变,始终保持和原来一样的相对角度。但这里我需要的不是“朝向圆心的旋转”,而是“每个叶片绕自身长轴的额外扭转”。这个额外的自由度,Array Polar的默认选项根本给不了。
这就是典型的没有搞清楚阵列的坐标系和旋转基准导致的翻车。Array Polar本质上是把物体在极坐标下进行平移和旋转的组合,它只负责“绕着中心转”,至于每个物体“自转”多少,需要额外的变换。

第二版方案:分组阵列+自转,终于对了
既然Array Polar做不了自转,我改用分组阵列的思路:
- 先把一片叶子复制一份,用Rotate3D命令绕叶片自身的长轴(Y轴)旋转一个角度θ(比如12度),得到“已经扭转过的叶子”。
- 然后选中这两片叶子,一起执行Array Polar,数量30,角度360,旋转复制对象选择“否”。
- 这样,每组叶子在圆周上均匀分布,但每组内部的两片叶子已经有了相对扭转,整体看起来就有旋转韵律了。
但问题又来了:30组,每组2片,一共60个物体,整个模型瞬间变得很重。而且更关键的是,叶片的扭转角度在圆周方向上并没有过渡,每一组都是同样的12度,看起来是“重复”而不是“旋转”。
我需要的是:第1片叶子扭转0度,第2片扭转12度,第3片扭转24度……也就是扭转角度随阵列序号递增。这才是真正的“旋转阵列”该有的样子。
终极方案:Grasshopper参数化阵列
到了这一步,我意识到如果继续用Rhino传统命令,要么手动一个个摆,要么写脚本。手动摆60个叶片,每个都要计算角度和位置,不现实。所以我果断切换到Grasshopper(Rhino内置的参数化设计插件)。
核心思路是:把阵列变成一个数学映射:每个叶片的圆心坐标 = (R*cos(θ), R*sin(θ), 0),而叶片的自身旋转角度 = θ * k,其中θ是从0到360度均匀分布的等分数,k是一个倍数系数。
在Grasshopper里,我用了这几个关键运算器:
- Series:生成从0到N-1的序号序列i。
- Range/Divide Curve:把0~360度分成N份,得到每个叶片对应的极角angle = i * (360/N)。
- Point Polar:根据半径R和角度angle,计算出每个叶片的圆心坐标。
- Rotate Axis:把原始的叶片几何体,绕自己的长轴旋转 angle * k 度。
- Move:把旋转后的叶片平移到对应的圆心位置。
这样,每个叶片都是独立的,但它们的扭转角度是连续的、渐变的,形成了真正的“旋转阵列”效果。而且因为是参数化的,我改一个k值,整个模型的韵律立刻变化,甲方要是想调,我几秒钟就能出方案。
技巧提示:如果你不想用Grasshopper,纯Rhino也能实现渐变的自身旋转——用“Array Along Curve”配合“Twist”命令,但控制精度远不如GH。对于这种参数关联强的阵列,GH是正解。
持续踩坑:阵列中心、法线方向、渲染问题
用GH做出来后,我又发现了几个新坑:
坑1:阵列中心点不在原点。因为我的叶片是放在世界坐标原点建的模,阵列后所有叶片都堆在原点上,需要把整个阵列的圆心平移到设计位置。这个简单,加一个Move就行。
坑2:叶片的法线方向不统一。双轨扫掠出来的曲面,法线方向可能朝里也可能朝外,阵列后有的叶片能透过光,有的不能,渲染时会出现明暗不均。解决方法是:在建模时统一翻转所有曲面的法线方向,用Dir命令检查并反转。
坑3:渲染时的光影闪烁。叶片厚度只有2mm,而且边缘是锐利的,阵列后相邻叶片边缘距离很近,渲染时容易出现锯齿或闪烁。解决方法是:给叶片加一个轻微的倒角(FilletEdge),半径为0.1mm,既不影响外观,又能显著改善渲染质量。
注意:阵列是批量复制操作,所有副本共享原始物体的属性。如果你在阵列后修改了原始物体,所有副本都会跟着变(除非你使用“Block”或“Instance”)。在GH里,这反而成了优势——改一个基础叶片,全部更新。
交付与拆解:参数化带来的议价能力
最终,我交付给甲方的方案包含:30片叶片,扭转角度从0到348度线性递增,整体形成螺旋上升的视觉感。甲方非常满意,甚至要求我再出两个变体:一个是扭转角度为2倍的,一个是反方向的。这在传统建模流程里几乎等于重新做,但对我来说只是改两个数字的事。
这次经历让我深刻体会到:旋转阵列的本质是极坐标下的刚体变换,而Array Polar只是这个变换的一个特例——固定旋转轴、固定旋转角速度。当你需要更复杂的规律,比如渐变、双向、甚至随机的阵列,就必须借助参数化工具,把“复制”变成“生成”。

这也是我现在在火星人教育的工业设计课上,总是强调“建模思维”而不是“命令操作”的原因。命令是死的,思维是活的。
如果你也想系统地掌握Rhino和Grasshopper,真正学会用参数化思维解决实际项目中的复杂建模问题,欢迎来火星人教育和我面对面交流。火星人教育创办24年来,一直专注数字艺术与AIGC实战职业技能培训。我们开设的课程包括AI漫剧创作、AIGC视觉设计、UE5游戏特效、室内全屋定制、MAYA三维动画、C4D动态设计、工业设计、NUKE影视后期、摄影摄像实训等。
我们在北京、深圳设有双校区,开设线下面授班,面向美术生、在校大学生及意向转行的职场人群,采用项目化实训教学,让你在真实项目中夯实技能,助力就业与职业提升。如果你也对工业设计或数字艺术感兴趣,欢迎拨打咨询电话:010-65918670,和我们一起把设计做成艺术,把技术变成能力。








评论(0)