🏗️ Grasshopper 进阶课 · 二维参数化建模

随机网格城市
二维参数化摩天楼矩阵

从一维数列到二维网格,用随机数生成一片高低错落的建筑森林

📚 适合:初一及以上(已学一维数字城市) ⏱️ 教师时长:45分钟 🔧 环境:Rhino + Grasshopper

🎯 一、教学目标

📌 教师注意:本课是“一维数列城市”的升级版。学生已熟悉 Series、Extrude 和 Move 的基本操作。本课关键难点是二维网格的生成方式以及随机数列表与网格单元的一一对应。建议先快速回顾一维案例(2分钟),再引入二维概念。

⚠️ 二、教学重难点

重点:利用 Square Grid 生成网格点阵,将随机数列表连接到 Extrude 的高度输入端,实现“一个随机数对应一个方块高度”。

难点:理解二维网格中点的数量计算(X方向数量 × Y方向数量),以及如何确保 Random 生成的随机数个数与网格点总数严格相等

💡 常见误区:学生容易忘记将网格点的X/Y数量与随机数个数关联。务必强调“多少个点就需要多少个高度值”,可用 List Length 检查。

📋 三、教学准备

🏙️ 参考图:网格状城市(曼哈顿航拍 / 体块模型) 建议宽幅图片,展示整齐的街区网格,用于情境导入 pika.jpg 机器狗示意图

📖 四、教学过程

1. 情境导入(5分钟)——“从一条街到一座城”

展示一维数字城市的图片:“上节课我们让一行数字变成了一条街。但真正的城市是二维的——有街区、有网格,比如纽约曼哈顿。”

展示曼哈顿航拍图:“如果我们把上节课的一排楼复制很多排,会变成什么?一个建筑矩阵。”

提问:“如果我们要做一个 5×5 的网格城市,每个格子里有一座高度随机的楼,需要多少个高度值?这些高度值从哪来?”

引出本课主题:用 Square Grid 生成网格点,用 Random 生成随机高度,构建一座随机城市。

2. 数学连接(3分钟)——“网格与随机数”

教师在黑板上画 3×4 的网格,共12个交点。“每一个交点就是一座楼的位置。我们需要12个随机高度值。”

引入 Random 电池:需要指定范围(最小高度、最大高度)和数量(等于网格点数)。

🔑 关键公式:网格点数 = X方向数量 × Y方向数量 = 随机数个数

“上节课我们用等差数列控制高度,规律可预测;今天用随机数,每座楼高度不确定——这就是‘随机城市’的魅力。”

3. Grasshopper 实操(24分钟)

1 生成二维网格点(6分钟)

方法A(推荐入门):使用 Square Grid 电池。

输出端 P 即网格中心点列表(共64个点)。悬停查看数据数量。

方法B(进阶/复习):用两个 Series + Move 组合手动构建二维阵列(适合想深入理解数据结构的班级)。

📌 教学建议:若学生基础较好,可展示方法B并讲解 Graft 操作,否则用 Square Grid 快速获得点阵即可。
🔲 步骤1截图:Square Grid电池生成网格点 显示Square Grid电池、四个滑块,以及Rhino视口中的点阵 img_step1_squaregrid.jpg
2 在每个网格点放置地基(6分钟)

我们需要在每个网格点放置一个矩形(地基)。

观察 Rhino:每个网格点都出现了一个正方形地基。

⚡ 小技巧:如果矩形不在网格点上,检查 Rectangle 的 P 端是否在原点上,并确保 Move 的 T 端接收的是点坐标列表。
🧱 步骤2截图:Move将矩形阵列到网格点 显示Rectangle、Move电池,Square Grid的P端连到Move的T端 img_step2_move_grid.jpg
3 生成随机高度数列(5分钟)

我们需要与网格点数量相同的随机高度值。

如何获得网格点总数?

悬停 Random 输出端,确认输出64个随机小数(在0.5~8之间)。

🎲 步骤3截图:Random电池生成随机高度列表 显示Random电池、Construct Domain、Multiplication(或List Length)连线 img_step3_random.jpg
4 随机拉伸——数字变矩阵城市(5分钟)

观察 Rhino:64个方柱高低错落,形成一片随机建筑森林!🎉

📌 强调:再次提醒学生,Random输出列表的长度与网格点数严格一致,这是数据配对成功的关键。
🏗️ ⭐ 步骤4截图:Extrude连接随机高度——关键连线! 重点显示Extrude的T端连接Random输出,以及Rhino视口中的随机方块矩阵 img_step4_extrude_random.jpg
5 美化与动态观察(2分钟)

🧪 五、互动探索——调参与观察(8分钟)

学生拖动滑块,观察城市变化,并尝试描述:

🌆 挑战 1

X/Y方向数量改为 15×15

观察:城市变得更密集还是更稀疏?随机数个数自动变化了吗?

📏 挑战 2

最大高度改为 15,最小高度改为 0.2

观察:城市轮廓起伏更大了吗?

🔄 挑战 3

右键 Random → Recompute 多次

观察:每次城市都不同——这就是随机设计的魅力。

🎯 挑战 4(进阶)

尝试把 Random 替换为 Series,看看会怎样?

观察:又变回了可预测的梯度城市,但现在是二维的斜坡!

🖼️ 挑战结果对比图(可选) 展示不同数量、不同高度范围、不同随机种子下的城市形态 img_challenge_random_examples.jpg

💡 六、总结与延伸

课堂小结

今天我们完成了一次维度升级:从一维线型城市跃迁到二维网格城市。核心变化是:用 Square Grid 生成位置点阵,用 Random 生成随机高度。数据量必须严格匹配网格点数

🏛️ 参数化思维进阶:
一维数列 → 二维网格 → 随机数据驱动。
你的城市不再是一条街,而是一片每一次重新计算都独一无二的摩天楼矩阵

延伸思考与作业

📅 下节课预告

我们将引入图像采样——用一张黑白图片的灰度值,驱动二维网格上的建筑高度,打造“数据肖像城市”。

🗺️ 七、电池连线拓扑图(供教师参考)

[XY Plane] → (P) Square Grid (P) → 网格点列表 ──→ (T) Move (G) → (B) Extrude (E) → 随机城市 [间距Sx] → (Sx) ↑ (Ex) ← [X数量] ↑ (G) ← Rectangle (R) ↑ (D) ← [Unit Z] [间距Sy] → (Sy) ↑ (Ey) ← [Y数量] ↑ (T) ← 随机高度列表 [X数量] ──→ (A) Multiplication (Result) → (N) Random (R) → 随机高度列表 [Y数量] ──→ (B) ↑ (R) ← Construct Domain (min, max)
📊 完整电池连线截图(高清,标注关键端口) 建议在Grasshopper画布中整理后截图,分辨率不低于1200px,用于打印或投影 img_topology_random_grid.jpg

📝 八、课后反思(教师记录用)