引言:转折格栅在现代设计中的重要性

转折格栅(Twisted Grille)或称为参数化格栅结构,是一种在建筑、产品设计和工业设计中广泛应用的复杂几何形态。它通过规则的网格单元在空间中的旋转、缩放和位移,创造出富有动感和视觉冲击力的表面图案。在Rhino(犀牛)这款强大的NURBS建模软件中,结合Grasshopper参数化插件,我们可以高效地创建和控制这类复杂结构。

本教程将带你从零基础开始,逐步掌握使用Rhino和Gr Grasshopper制作转折格栅的全过程。你将学习到:

  • 基础几何的创建与操作
  • 参数化思维的建立
  • 复杂曲面的处理技巧
  • 建模效率的提升方法

无论你是设计新手还是希望提升参数化技能的设计师,本教程都将提供实用且深入的指导。

第一部分:基础准备与环境设置

1.1 软件准备与界面熟悉

Rhino基础界面 Rhino是一个基于NURBS(非均匀有理B样条)的3D建模软件,其核心优势在于能够精确创建和编辑曲线与曲面。对于制作转折格栅,我们需要熟悉以下核心命令:

  • 曲线创建Line(直线)、Polyline(多段线)、Circle(圆)、Curve(自由曲线)
  • 曲面操作Loft(放样)、Sweep(扫掠)、NetworkSrf(网格曲面)
  • 实体操作Extrude(挤出)、Boolean(布尔运算)
  • 变换工具Rotate(旋转)、Scale(缩放)、Move(移动)

Grasshopper插件 Grasshopper是Rhino的可视化编程插件,是实现参数化设计的核心工具。安装后,通过Rhino命令行输入Grasshopper或点击工具栏图标启动。

Grasshopper界面主要分为:

  • 组件面板(左侧):包含所有可用的电池(组件)
  • 画布区域(中间):放置和连接组件的工作区
  • 属性面板(右侧):显示当前选中组件的参数设置
  • Rhino视图:实时显示Grasshopper生成的几何体

1.2 参数化设计思维建立

参数化设计的核心是关系驱动而非直接操作。传统建模是直接绘制最终形态,而参数化则是定义生成规则,通过调整参数来控制结果。

对于转折格栅,我们需要思考:

  • 格栅的基本单元是什么?(如:矩形、圆形、菱形)
  • 单元如何排列?(如:阵列、网格)
  • 转折如何实现?(如:旋转、扭曲、缩放)
  • 控制参数有哪些?(如:数量、角度、大小、间距)

这种思维方式将贯穿整个教程,帮助你构建灵活、可调整的模型。

第二部分:基础转折格栅的创建(零基础入门)

2.1 创建基础几何单元

首先,我们创建一个简单的矩形作为格栅单元。

在Rhino中:

  1. 打开Rhino,设置单位为毫米(mm)
  2. 使用Rectangle命令绘制一个10mm x 10mm的矩形
  3. 使用Offset命令向内偏移1mm,形成边框
  4. 使用TrimExplode后删除内部线条,保留边框
  5. 将完成的矩形边框移动到坐标原点(0,0,0)

在Grasshopper中(推荐方式):

# Grasshopper Python Script 组件代码
# 用于生成基础矩形单元

import Rhino.Geometry as rg

# 输入参数
width = 10  # 矩形宽度
height = 10  # 矩形高度
thickness = 1  # 边框厚度

# 创建外矩形
outer_rect = rg.Rectangle3d(rg.Plane.WorldXY, rg.Interval(-width/2, width/2), rg.Interval(-height/2, height/2))
outer_curve = outer_rect.ToNurbsCurve()

# 创建内矩形
inner_rect = rg.Rectangle3d(rg.Plane.WorldXY, 
                           rg.Interval(-width/2+thickness, width/2-thickness), 
                           rg.Interval(-height/2+thickness, height/2-thickness))
inner_curve = inner_rect.ToNurbsCurve()

# 创建边框(外矩形减去内矩形区域)
# 这里我们直接返回两个曲线用于后续放样或挤出
# 实际应用中可能需要更复杂的布尔运算

# 输出
a = outer_curve
b = inner_curve

更简单的Grasshopper方式(使用标准组件):

  1. 在Grasshopper中,使用Rectangle组件(Surface > Primitive > Rectangle)
  2. 设置Plane为WorldXY,X和Y区间为-5到5(10mm宽度)
  3. 使用Offset组件(Curve > Util > Offset)向内偏移1mm
  4. 使用Boundary Surfaces(Surface > Freeform > Boundary Surfaces)创建面
  5. 使用Extrude(Surface > Util > Extrude)挤出1mm厚度

2.2 创建基础网格阵列

现在将单个单元阵列成网格。

Grasshopper步骤:

  1. 使用Series组件(Math > Input > Series)生成序列:
    • Start = 0
    • Step = 12(单元间距)
    • Count = 10(每行/列数量)
  2. 使用Cross Reference(Math > Matrix > Cross Reference)或直接连接两个Series到…
  3. 使用Point组件(Vector > Point)创建网格点:
    • X = Series输出
    • Y = 第二个Series输出
  4. 使用Move组件(Transform > Euclidian > Move):
    • Geometry = 矩形
    • Translation = 网格点
  5. 使用Rotate组件(Transform > Euclidian > Rotate):
    • Geometry = 移动后的矩形
    • Angle = 角度参数(例如:0 to 90度渐变)
    • Center = 矩形中心点(使用Area组件获取)

完整Grasshopper脚本结构:

[Series] -> [Point] -> [Move] -> [Rotate] -> [Output]
   |           |           |
[Series]    [CrossRef]  [Rectangle]

2.3 实现转折效果

转折是转折格栅的核心。我们可以通过两种方式实现:

方式一:基于位置的旋转

# Grasshopper Python Script 组件代码
# 基于位置的转折控制

import Rhino.Geometry as rg
import math

# 输入
base_geometry = x  # 从Grasshopper输入的基础矩形
points = y  # 网格点列表
angle_factor = 0.5  # 角度系数(0-1)

# 存储结果
result = []

for i, pt in enumerate(points):
    # 计算基于位置的旋转角度
    # 例如:从左到右,角度从0度增加到90度
    normalized_x = pt.X / (max(p.X for p in points) + 1)
    rotation_angle = normalized_x * 90 * angle_factor
    
    # 获取矩形中心点
    rect_center = base_geometry.GetBoundingBox(True).Center
    
    # 创建旋转平面
    rotation_plane = rg.Plane(rect_center, rg.Vector3d.ZAxis)
    
    # 旋转几何体
    rotated_geo = rg.Geometry.Rotate(base_geometry, math.radians(rotation_angle), rotation_plane)
    
    result.append(rotated_geo)

# 输出
a = result

方式二:使用Grasshopper标准组件

  1. 使用Area组件获取每个矩形的中心点
  2. 使用Remap Numbers组件(Math > Util > Remap Numbers)将X坐标映射到0-1范围
  3. 使用Graph MapperMultiply组件将映射后的值乘以最大角度(如90度)
  4. 将角度值连接到Rotate组件的Angle输入端
  5. 将矩形中心点连接到Rotate的Center输入端

2.4 创建实体格栅

现在将平面的矩形框转换为3D实体。

Grasshopper步骤:

  1. 使用Boundary Surfaces(Surface > Freeform > Boundary Surfaces)将每个矩形框转换为面
  2. 使用Extrude(Surface > Util > Extrude):
    • Direction = Z轴(0,0,1)
    • Distance = 2mm(厚度)
  3. 使用Solid Union(Solid > Util > Solid Union)将所有实体合并(可选)
  4. 输出到Rhino(使用BrepMesh组件)

关键技巧:

  • 如果格栅需要悬空或复杂排列,可以使用Orient组件进行定向
  • 对于更复杂的转折,可以使用SweepLoft创建曲面实体

第三部分:参数化设计技巧进阶

3.1 动态参数控制

创建可调节的全局参数是参数化设计的核心。

推荐参数结构:

# 在Grasshopper中创建参数面板

# 1. 数值滑块(Number Slider)
#    - Grid_Count: 5-20(网格数量)
#    - Cell_Size: 5-20(单元尺寸)
#    - Twist_Angle: 0-90(最大扭转角度)
#    - Thickness: 0.5-5(厚度)
#    - Spacing: 1-5(间距)

# 2. 数据树管理
# 使用`Graft`和`Simplify`组件管理数据树结构
# 确保每个单元都有独立的参数控制

# 3. 条件控制
# 使用`Conditional`组件实现:
# - 边缘单元特殊处理
# - 对称模式开关
# - 渐变模式选择(线性/非线性)

具体实现:

  1. 创建所有参数滑块
  2. 使用Integer组件将Grid_Count转换为整数
  3. 使用Series生成网格坐标
  4. 使用Cross Reference创建二维网格
  5. 将参数连接到各个处理环节

3.2 曲面格栅(高级)

当基础平面格栅掌握后,可以尝试在曲面上创建转折格栅。

步骤:

  1. 创建或导入曲面:在Rhino中创建一个曲面(如使用SrfPtEdgeSrf
  2. UV参数化:使用Divide Surface(Surface > Util > Divide Surface)在曲面上生成UV网格点
  3. 局部坐标系:使用Frame组件(Vector > Frame)为每个点创建局部坐标系
  4. 单元适配:将基础单元根据局部坐标系定向并放置
  5. 转折处理:在局部坐标系中进行旋转

Grasshopper脚本示例:

# 曲面格栅生成代码

import Rhino.Geometry as rg
import math

# 输入
surface = x  # 目标曲面
u_count = 10  # U方向数量
v_count = 10  # V方向数量
cell_size = 5  # 单元尺寸
max_twist = 45  # 最大扭转角度

# 在曲面上生成UV点
u_params = [i / (u_count - 1) for i in range(u_count)]
v_params = [j / (v_count - 1) for j in range(v_count)]

result = []

for u in u_params:
    for v in v_params:
        # 获取曲面上的点和法线
        pt = surface.PointAt(u, v)
        normal = surface.NormalAt(u, v)
        
        # 创建局部坐标系
        frame = rg.Frame(pt, normal)
        
        # 创建基础矩形(在局部坐标系中)
        rect = rg.Rectangle3d(frame.Plane, 
                             rg.Interval(-cell_size/2, cell_size/2), 
                             rg.Interval(-cell_size/2, cell_size/2))
        
        # 基于UV位置计算扭转角度
        twist_angle = (u + v) / 2 * max_twist
        
        # 在局部平面内旋转
        rotated_rect = rg.Geometry.Rotate(rect, math.radians(twist_angle), frame.Plane.ZAxis)
        
        # 挤出厚度
        extruded = rg.Geometry.Extrude(rotated_rect, frame.Plane.ZAxis * 2)
        
        result.append(extruded)

# 输出
a = result

3.3 数据树(Data Tree)管理

复杂格栅会产生大量数据,数据树管理至关重要。

核心概念:

  • 路径(Path):如{0;0}表示第一行第一列
  • 分支(Branch):每个路径下的数据列表
  • 操作工具
    • Graft:将列表中的每个元素放入独立分支
    • Simplify:简化数据树结构
    • Flatten:将所有数据放入一个分支
    • Tree Branch:选择特定分支
    • Dispatch:根据条件分离数据

实际应用:

# 数据树操作示例

# 原始数据:10x10网格,100个矩形
# 数据树结构:{0;0}包含100个数据

# 1. 按行分离数据
# 使用`Tree Branch`或`Split Tree`组件
# 结果:10个分支,每个分支10个数据

# 2. 按奇偶处理
# 使用`Dispatch`组件,模式:True/False
# 奇数行和偶数行使用不同参数

# 3. 边缘识别
# 使用`Index`组件和条件判断
# 边缘单元使用特殊处理(如不旋转)

3.4 曲面连续性与衔接

当格栅跨越多个曲面时,需要确保连续性。

技巧:

  1. 使用Blend Surface:在两个曲面之间创建过渡格栅
  2. 使用NetworkSrf:创建更精确的曲面格栅
  3. 连续性控制:使用Set TangencySet Curvature设置连续性条件
  4. 边缘对齐:使用Align组件确保边缘单元对齐

第四部分:解决建模难题

4.1 几何冲突与布尔运算失败

问题:在创建复杂转折格栅时,单元之间可能重叠,导致布尔运算失败。

解决方案:

  1. 预处理:在布尔运算前检查几何体是否相交
# 检查相交的Grasshopper代码
import Rhino.Geometry as rg

def check_intersection(geo_list):
    clean_list = []
    for i, geo1 in enumerate(geo_list):
        is_valid = True
        for j, geo2 in enumerate(geo_list):
            if i != j:
                # 检查是否相交
                intersection = rg.Intersect.Intersection.BrepBrep(geo1, geo2, 0.01)
                if intersection[0]:  # 如果有交点
                    is_valid = False
                    break
        if is_valid:
            clean_list.append(geo1)
    return clean_list

a = check_intersection(x)
  1. 使用Solid Union替代Boolean Union:Grasshopper的Solid Union更稳定
  2. 分离处理:将重叠区域单独处理,先创建基础形态再合并
  3. 增加间隙:在参数中增加微小间隙(0.01mm)避免重叠

4.2 曲面扭曲与变形

问题:在曲面上创建格栅时,单元可能扭曲严重。

解决方案:

  1. 使用Evaluate Surface替代Divide Surface:更精确控制点分布
  2. 限制扭转角度:根据曲面曲率动态调整最大扭转角度
  3. 使用Orient组件:基于局部坐标系而非全局坐标系
  4. 分块处理:将复杂曲面分解为多个简单曲面分别处理

4.3 性能优化

问题:大型格栅(>1000个单元)导致Rhino卡顿。

解决方案:

  1. 使用Mesh替代Brep:Mesh计算更快,适合大型阵列
# Brep转Mesh优化
import Rhino.Geometry as rg

# 输入:Brep列表
# 输出:Mesh列表

mesh_params = rg.MeshingParameters.FastRenderMesh
mesh_list = []

for brep in x:
    mesh = rg.Mesh.CreateFromBrep(brep, mesh_params)
    mesh_list.extend(mesh)

a = mesh_list
  1. 使用Display组件:在Grasshopper中只显示部分几何体
  2. 数据压缩:使用SimplifyFlatten减少数据树复杂度
  3. 分阶段生成:先生成低精度预览,确认后再生成高精度模型

4.4 参数联动与错误处理

问题:参数调整时出现错误(如负数尺寸)。

解决方案:

  1. 使用Absolute组件:确保数值为正
  2. 使用Clamp组件:限制参数范围
  3. 使用Conditional组件:设置参数依赖关系
  4. 错误反馈:使用Panel组件显示警告信息

第五部分:提升设计效率的技巧

5.1 自定义Grasshopper组件(Cluster)

创建Cluster的步骤:

  1. 选择相关组件(如:矩形生成、阵列、旋转)
  2. 右键选择Group并命名为”格栅生成器”
  3. 右键选择Create Cluster
  4. 定义输入输出端口
  5. 保存为.ghcluster文件

示例Cluster:

  • 输入:尺寸、数量、角度、厚度
  • 输出:实体格栅
  • 内部:包含完整的生成逻辑

5.2 使用Human插件扩展功能

Human是Grasshopper的扩展插件,提供更高级的工具:

安装与使用:

  1. 从Food4Rhino下载Human插件
  2. 使用Human.Brep组件进行高级Brep操作
  3. 使用Human.Mesh进行网格优化
  4. 使用Human.File进行文件I/O操作

5.3 数据驱动设计

使用Excel/CSV驱动参数:

# 使用Grasshopper的`Data Input`组件
# 或使用Python Script读取外部数据

import csv

def read_csv(file_path):
    data = []
    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            data.append([float(val) for val in row])
    return data

# 将CSV数据映射到格栅参数
# 例如:每行数据控制一列格栅的参数

5.4 批量处理与自动化

使用Grasshopper Player:

  1. 将Grasshopper定义保存为.gh文件
  2. 在Rhino命令行输入GrasshopperPlayer
  3. 选择.gh文件并运行
  4. 可以快速生成多个变体

5.5 版本控制与协作

最佳实践:

  1. 命名规范:组件命名清晰,参数命名统一
  2. 注释:使用Note组件添加说明
  3. 版本管理:使用Git管理Grasshopper文件(需转换为JSON格式)
  4. 模块化:将复杂定义分解为多个小文件

第六部分:完整项目实战

6.1 项目:建筑立面转折格栅

项目要求:

  • 尺寸:5m x 3m的立面
  • 单元:30mm x 30mm矩形框
  • 转折:从左到右0-90度渐变
  • 厚度:3mm
  • 间距:5mm

完整Grasshopper定义:

[参数面板]
├─ Width = 5000
├─ Height = 3000
├─ Cell_Size = 30
├─ Spacing = 5
├─ Thickness = 3
├─ Max_Angle = 90
└─ Grid_Count_X = 166 (计算:5000/(30+5))
└─ Grid_Count_Y = 85 (计算:3000/(30+5))

[几何生成]
1. Series (X) → Start=0, Step=35, Count=166
2. Series (Y) → Start=0, Step=35, Count=85
3. Cross Reference → 连接两个Series
4. Point → 生成网格点
5. Rectangle → 创建基础矩形(-15到15)
6. Move → 将矩形移动到网格点
7. Area → 获取每个矩形中心点
8. Remap Numbers → 将X坐标映射到0-1
9. Multiply → 乘以Max_Angle
10. Rotate → 旋转矩形
11. Boundary Surfaces → 创建面
12. Extrude → 挤出Thickness
13. Solid Union → 合并所有实体

Python Script整合版:

# 完整的Python Script组件
import Rhino.Geometry as rg
import math

# 参数
width = 5000
height = 3000
cell_size = 30
spacing = 5
thickness = 3
max_angle = 90

# 计算数量
count_x = int(width / (cell_size + spacing))
count_y = int(height / (cell_size + spacing))

# 生成网格点
points = []
for i in range(count_x):
    for j in range(count_y):
        x = i * (cell_size + spacing)
        y = j * (cell_size + spacing)
        points.append(rg.Point3d(x, y, 0))

# 创建基础矩形
base_rect = rg.Rectangle3d(rg.Plane.WorldXY, 
                          rg.Interval(-cell_size/2, cell_size/2), 
                          rg.Interval(-cell_size/2, cell_size/2))
base_curve = base_rect.ToNurbsCurve()

# 生成格栅
result = []
for pt in points:
    # 计算旋转角度(基于X位置)
    rotation_angle = (pt.X / width) * max_angle
    
    # 移动
    moved = rg.Geometry.Translate(base_curve, pt - rg.Point3d.Origin)
    
    # 旋转
    center = moved.GetBoundingBox(True).Center
    plane = rg.Plane(center, rg.Vector3d.ZAxis)
    rotated = rg.Geometry.Rotate(moved, math.radians(rotation_angle), plane.ZAxis)
    
    # 创建面并挤出
    boundary = rg.Curve.CreatePlanarClosedCurve(rotated)
    if boundary:
        surface = rg.Surface.CreateExtrusion(boundary, rg.Vector3d(0, 0, thickness))
        if surface:
            result.append(surface)

# 输出
a = result

6.2 模型导出与后续处理

导出选项:

  1. STEP格式:用于CAD软件交互
  2. OBJ格式:用于3D打印或渲染
  3. DWG格式:用于工程制图
  4. 3DM格式:保留Rhino原生数据

优化导出:

  • 使用Mesh组件转换为网格
  • 设置合适的网格精度(Meshing Parameters
  • 使用Reduce Mesh减少面数(如果需要)
  • 棶查并修复几何错误(Check命令)

第七部分:常见问题解答

Q1: 为什么我的格栅在曲面上扭曲严重? A: 可能是因为使用了全局坐标系而非局部坐标系。确保使用Frame组件获取每个点的局部坐标系,并在该坐标系中创建和旋转单元。

Q2: 如何让格栅在边缘处平滑过渡? A: 使用Blend组件或在边缘区域使用渐变的旋转角度。也可以创建一个”边界区域”,在其中使用特殊的参数设置。

Q3: 大型格栅导致Rhino崩溃怎么办? A: 1) 使用Mesh替代Brep;2) 减少显示精度;3) 使用Display组件分批显示;4) 增加内存或使用Rhino 7的64位版本。

Q4: 如何实现非线性的转折? A: 使用Graph Mapper组件,选择正弦、多项式或其他曲线来定义角度变化规律。

Q5: 能否导出到Revit或ArchiCAD? A: 可以,但需要先转换为合适的格式。对于Revit,可以使用Rhino.Inside.Revit插件直接导入。对于ArchiCAD,可以导出IFC或DWG格式。

结语

掌握Rhino和Grasshopper制作转折格栅是一个循序渐进的过程。从基础几何创建到复杂的参数化控制,每一步都需要理解其背后的逻辑。关键在于:

  1. 建立参数化思维:思考关系而非结果
  2. 熟练掌握工具:理解每个组件的功能
  3. 解决实际问题:在项目中应用所学知识
  4. 持续优化:不断改进工作流程

通过本教程的学习,你应该能够独立创建复杂的转折格栅模型,并根据项目需求灵活调整参数。记住,参数化设计的魅力在于其灵活性和可探索性,多尝试不同的参数组合,你会发现无限的设计可能性。

继续练习和探索,你将从零基础走向精通,真正掌握参数化设计的精髓。# 犀牛制作转折格栅教程 从零基础到精通 掌握参数化设计技巧 解决建模难题 提升设计效率

引言:转折格栅在现代设计中的重要性

转折格栅(Twisted Grille)或称为参数化格栅结构,是一种在建筑、产品设计和工业设计中广泛应用的复杂几何形态。它通过规则的网格单元在空间中的旋转、缩放和位移,创造出富有动感和视觉冲击力的表面图案。在Rhino(犀牛)这款强大的NURBS建模软件中,结合Grasshopper参数化插件,我们可以高效地创建和控制这类复杂结构。

本教程将带你从零基础开始,逐步掌握使用Rhino和Grasshopper制作转折格栅的全过程。你将学习到:

  • 基础几何的创建与操作
  • 参数化思维的建立
  • 复杂曲面的处理技巧
  • 建模效率的提升方法

无论你是设计新手还是希望提升参数化技能的设计师,本教程都将提供实用且深入的指导。

第一部分:基础准备与环境设置

1.1 软件准备与界面熟悉

Rhino基础界面 Rhino是一个基于NURBS(非均匀有理B样条)的3D建模软件,其核心优势在于能够精确创建和编辑曲线与曲面。对于制作转折格栅,我们需要熟悉以下核心命令:

  • 曲线创建Line(直线)、Polyline(多段线)、Circle(圆)、Curve(自由曲线)
  • 曲面操作Loft(放样)、Sweep(扫掠)、NetworkSrf(网格曲面)
  • 实体操作Extrude(挤出)、Boolean(布尔运算)
  • 变换工具Rotate(旋转)、Scale(缩放)、Move(移动)

Grasshopper插件 Grasshopper是Rhino的可视化编程插件,是实现参数化设计的核心工具。安装后,通过Rhino命令行输入Grasshopper或点击工具栏图标启动。

Grasshopper界面主要分为:

  • 组件面板(左侧):包含所有可用的电池(组件)
  • 画布区域(中间):放置和连接组件的工作区
  • 属性面板(右侧):显示当前选中组件的参数设置
  • Rhino视图:实时显示Grasshopper生成的几何体

1.2 参数化设计思维建立

参数化设计的核心是关系驱动而非直接操作。传统建模是直接绘制最终形态,而参数化则是定义生成规则,通过调整参数来控制结果。

对于转折格栅,我们需要思考:

  • 格栅的基本单元是什么?(如:矩形、圆形、菱形)
  • 单元如何排列?(如:阵列、网格)
  • 转折如何实现?(如:旋转、扭曲、缩放)
  • 控制参数有哪些?(如:数量、角度、大小、间距)

这种思维方式将贯穿整个教程,帮助你构建灵活、可调整的模型。

第二部分:基础转折格栅的创建(零基础入门)

2.1 创建基础几何单元

首先,我们创建一个简单的矩形作为格栅单元。

在Rhino中:

  1. 打开Rhino,设置单位为毫米(mm)
  2. 使用Rectangle命令绘制一个10mm x 10mm的矩形
  3. 使用Offset命令向内偏移1mm,形成边框
  4. 使用TrimExplode后删除内部线条,保留边框
  5. 将完成的矩形边框移动到坐标原点(0,0,0)

在Grasshopper中(推荐方式):

# Grasshopper Python Script 组件代码
# 用于生成基础矩形单元

import Rhino.Geometry as rg

# 输入参数
width = 10  # 矩形宽度
height = 10  # 矩形高度
thickness = 1  # 边框厚度

# 创建外矩形
outer_rect = rg.Rectangle3d(rg.Plane.WorldXY, rg.Interval(-width/2, width/2), rg.Interval(-height/2, height/2))
outer_curve = outer_rect.ToNurbsCurve()

# 创建内矩形
inner_rect = rg.Rectangle3d(rg.Plane.WorldXY, 
                           rg.Interval(-width/2+thickness, width/2-thickness), 
                           rg.Interval(-height/2+thickness, height/2-thickness))
inner_curve = inner_rect.ToNurbsCurve()

# 创建边框(外矩形减去内矩形区域)
# 这里我们直接返回两个曲线用于后续放样或挤出
# 实际应用中可能需要更复杂的布尔运算

# 输出
a = outer_curve
b = inner_curve

更简单的Grasshopper方式(使用标准组件):

  1. 在Grasshopper中,使用Rectangle组件(Surface > Primitive > Rectangle)
  2. 设置Plane为WorldXY,X和Y区间为-5到5(10mm宽度)
  3. 使用Offset组件(Curve > Util > Offset)向内偏移1mm
  4. 使用Boundary Surfaces(Surface > Freeform > Boundary Surfaces)创建面
  5. 使用Extrude(Surface > Util > Extrude)挤出1mm厚度

2.2 创建基础网格阵列

现在将单个单元阵列成网格。

Grasshopper步骤:

  1. 使用Series组件(Math > Input > Series)生成序列:
    • Start = 0
    • Step = 12(单元间距)
    • Count = 10(每行/列数量)
  2. 使用Cross Reference(Math > Matrix > Cross Reference)或直接连接两个Series到…
  3. 使用Point组件(Vector > Point)创建网格点:
    • X = Series输出
    • Y = 第二个Series输出
  4. 使用Move组件(Transform > Euclidian > Move):
    • Geometry = 矩形
    • Translation = 网格点
  5. 使用Rotate组件(Transform > Euclidian > Rotate):
    • Geometry = 移动后的矩形
    • Angle = 角度参数(例如:0 to 90度渐变)
    • Center = 矩形中心点(使用Area组件获取)

完整Grasshopper脚本结构:

[Series] -> [Point] -> [Move] -> [Rotate] -> [Output]
   |           |           |
[Series]    [CrossRef]  [Rectangle]

2.3 实现转折效果

转折是转折格栅的核心。我们可以通过两种方式实现:

方式一:基于位置的旋转

# Grasshopper Python Script 组件代码
# 基于位置的转折控制

import Rhino.Geometry as rg
import math

# 输入
base_geometry = x  # 从Grasshopper输入的基础矩形
points = y  # 网格点列表
angle_factor = 0.5  # 角度系数(0-1)

# 存储结果
result = []

for i, pt in enumerate(points):
    # 计算基于位置的旋转角度
    # 例如:从左到右,角度从0度增加到90度
    normalized_x = pt.X / (max(p.X for p in points) + 1)
    rotation_angle = normalized_x * 90 * angle_factor
    
    # 获取矩形中心点
    rect_center = base_geometry.GetBoundingBox(True).Center
    
    # 创建旋转平面
    rotation_plane = rg.Plane(rect_center, rg.Vector3d.ZAxis)
    
    # 旋转几何体
    rotated_geo = rg.Geometry.Rotate(base_geometry, math.radians(rotation_angle), rotation_plane)
    
    result.append(rotated_geo)

# 输出
a = result

方式二:使用Grasshopper标准组件

  1. 使用Area组件获取每个矩形的中心点
  2. 使用Remap Numbers组件(Math > Util > Remap Numbers)将X坐标映射到0-1范围
  3. 使用Graph MapperMultiply组件将映射后的值乘以最大角度(如90度)
  4. 将角度值连接到Rotate组件的Angle输入端
  5. 将矩形中心点连接到Rotate的Center输入端

2.4 创建实体格栅

现在将平面的矩形框转换为3D实体。

Grasshopper步骤:

  1. 使用Boundary Surfaces(Surface > Freeform > Boundary Surfaces)将每个矩形框转换为面
  2. 使用Extrude(Surface > Util > Extrude):
    • Direction = Z轴(0,0,1)
    • Distance = 2mm(厚度)
  3. 使用Solid Union(Solid > Util > Solid Union)将所有实体合并(可选)
  4. 输出到Rhino(使用BrepMesh组件)

关键技巧:

  • 如果格栅需要悬空或复杂排列,可以使用Orient组件进行定向
  • 对于更复杂的转折,可以使用SweepLoft创建曲面实体

第三部分:参数化设计技巧进阶

3.1 动态参数控制

创建可调节的全局参数是参数化设计的核心。

推荐参数结构:

# 在Grasshopper中创建参数面板

# 1. 数值滑块(Number Slider)
#    - Grid_Count: 5-20(网格数量)
#    - Cell_Size: 5-20(单元尺寸)
#    - Twist_Angle: 0-90(最大扭转角度)
#    - Thickness: 0.5-5(厚度)
#    - Spacing: 1-5(间距)

# 2. 数据树管理
# 使用`Graft`和`Simplify`组件管理数据树结构
# 确保每个单元都有独立的参数控制

# 3. 条件控制
# 使用`Conditional`组件实现:
# - 边缘单元特殊处理
# - 对称模式开关
# - 渐变模式选择(线性/非线性)

具体实现:

  1. 创建所有参数滑块
  2. 使用Integer组件将Grid_Count转换为整数
  3. 使用Series生成网格坐标
  4. 使用Cross Reference创建二维网格
  5. 将参数连接到各个处理环节

3.2 曲面格栅(高级)

当基础平面格栅掌握后,可以尝试在曲面上创建转折格栅。

步骤:

  1. 创建或导入曲面:在Rhino中创建一个曲面(如使用SrfPtEdgeSrf
  2. UV参数化:使用Divide Surface(Surface > Util > Divide Surface)在曲面上生成UV网格点
  3. 局部坐标系:使用Frame组件(Vector > Frame)为每个点创建局部坐标系
  4. 单元适配:将基础单元根据局部坐标系定向并放置
  5. 转折处理:在局部坐标系中进行旋转

Grasshopper脚本示例:

# 曲面格栅生成代码

import Rhino.Geometry as rg
import math

# 输入
surface = x  # 目标曲面
u_count = 10  # U方向数量
v_count = 10  # V方向数量
cell_size = 5  # 单元尺寸
max_twist = 45  # 最大扭转角度

# 在曲面上生成UV点
u_params = [i / (u_count - 1) for i in range(u_count)]
v_params = [j / (v_count - 1) for j in range(v_count)]

result = []

for u in u_params:
    for v in v_params:
        # 获取曲面上的点和法线
        pt = surface.PointAt(u, v)
        normal = surface.NormalAt(u, v)
        
        # 创建局部坐标系
        frame = rg.Frame(pt, normal)
        
        # 创建基础矩形(在局部坐标系中)
        rect = rg.Rectangle3d(frame.Plane, 
                             rg.Interval(-cell_size/2, cell_size/2), 
                             rg.Interval(-cell_size/2, cell_size/2))
        
        # 基于UV位置计算扭转角度
        twist_angle = (u + v) / 2 * max_twist
        
        # 在局部平面内旋转
        rotated_rect = rg.Geometry.Rotate(rect, math.radians(twist_angle), frame.Plane.ZAxis)
        
        # 挤出厚度
        extruded = rg.Geometry.Extrude(rotated_rect, frame.Plane.ZAxis * 2)
        
        result.append(extruded)

# 输出
a = result

3.3 数据树(Data Tree)管理

复杂格栅会产生大量数据,数据树管理至关重要。

核心概念:

  • 路径(Path):如{0;0}表示第一行第一列
  • 分支(Branch):每个路径下的数据列表
  • 操作工具
    • Graft:将列表中的每个元素放入独立分支
    • Simplify:简化数据树结构
    • Flatten:将所有数据放入一个分支
    • Tree Branch:选择特定分支
    • Dispatch:根据条件分离数据

实际应用:

# 数据树操作示例

# 原始数据:10x10网格,100个矩形
# 数据树结构:{0;0}包含100个数据

# 1. 按行分离数据
# 使用`Tree Branch`或`Split Tree`组件
# 结果:10个分支,每个分支10个数据

# 2. 按奇偶处理
# 使用`Dispatch`组件,模式:True/False
# 奇数行和偶数行使用不同参数

# 3. 边缘识别
# 使用`Index`组件和条件判断
# 边缘单元使用特殊处理(如不旋转)

3.4 曲面连续性与衔接

当格栅跨越多个曲面时,需要确保连续性。

技巧:

  1. 使用Blend Surface:在两个曲面之间创建过渡格栅
  2. 使用NetworkSrf:创建更精确的曲面格栅
  3. 连续性控制:使用Set TangencySet Curvature设置连续性条件
  4. 边缘对齐:使用Align组件确保边缘单元对齐

第四部分:解决建模难题

4.1 几何冲突与布尔运算失败

问题:在创建复杂转折格栅时,单元之间可能重叠,导致布尔运算失败。

解决方案:

  1. 预处理:在布尔运算前检查几何体是否相交
# 检查相交的Grasshopper代码
import Rhino.Geometry as rg

def check_intersection(geo_list):
    clean_list = []
    for i, geo1 in enumerate(geo_list):
        is_valid = True
        for j, geo2 in enumerate(geo_list):
            if i != j:
                # 检查是否相交
                intersection = rg.Intersect.Intersection.BrepBrep(geo1, geo2, 0.01)
                if intersection[0]:  # 如果有交点
                    is_valid = False
                    break
        if is_valid:
            clean_list.append(geo1)
    return clean_list

a = check_intersection(x)
  1. 使用Solid Union替代Boolean Union:Grasshopper的Solid Union更稳定
  2. 分离处理:将重叠区域单独处理,先创建基础形态再合并
  3. 增加间隙:在参数中增加微小间隙(0.01mm)避免重叠

4.2 曲面扭曲与变形

问题:在曲面上创建格栅时,单元可能扭曲严重。

解决方案:

  1. 使用Evaluate Surface替代Divide Surface:更精确控制点分布
  2. 限制扭转角度:根据曲面曲率动态调整最大扭转角度
  3. 使用Orient组件:基于局部坐标系而非全局坐标系
  4. 分块处理:将复杂曲面分解为多个简单曲面分别处理

4.3 性能优化

问题:大型格栅(>1000个单元)导致Rhino卡顿。

解决方案:

  1. 使用Mesh替代Brep:Mesh计算更快,适合大型阵列
# Brep转Mesh优化
import Rhino.Geometry as rg

# 输入:Brep列表
# 输出:Mesh列表

mesh_params = rg.MeshingParameters.FastRenderMesh
mesh_list = []

for brep in x:
    mesh = rg.Mesh.CreateFromBrep(brep, mesh_params)
    mesh_list.extend(mesh)

a = mesh_list
  1. 使用Display组件:在Grasshopper中只显示部分几何体
  2. 数据压缩:使用SimplifyFlatten减少数据树复杂度
  3. 分阶段生成:先生成低精度预览,确认后再生成高精度模型

4.4 参数联动与错误处理

问题:参数调整时出现错误(如负数尺寸)。

解决方案:

  1. 使用Absolute组件:确保数值为正
  2. 使用Clamp组件:限制参数范围
  3. 使用Conditional组件:设置参数依赖关系
  4. 错误反馈:使用Panel组件显示警告信息

第五部分:提升设计效率的技巧

5.1 自定义Grasshopper组件(Cluster)

创建Cluster的步骤:

  1. 选择相关组件(如:矩形生成、阵列、旋转)
  2. 右键选择Group并命名为”格栅生成器”
  3. 右键选择Create Cluster
  4. 定义输入输出端口
  5. 保存为.ghcluster文件

示例Cluster:

  • 输入:尺寸、数量、角度、厚度
  • 输出:实体格栅
  • 内部:包含完整的生成逻辑

5.2 使用Human插件扩展功能

Human是Grasshopper的扩展插件,提供更高级的工具:

安装与使用:

  1. 从Food4Rhino下载Human插件
  2. 使用Human.Brep组件进行高级Brep操作
  3. 使用Human.Mesh进行网格优化
  4. 使用Human.File进行文件I/O操作

5.3 数据驱动设计

使用Excel/CSV驱动参数:

# 使用Grasshopper的`Data Input`组件
# 或使用Python Script读取外部数据

import csv

def read_csv(file_path):
    data = []
    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        for row in reader:
            data.append([float(val) for val in row])
    return data

# 将CSV数据映射到格栅参数
# 例如:每行数据控制一列格栅的参数

5.4 批量处理与自动化

使用Grasshopper Player:

  1. 将Grasshopper定义保存为.gh文件
  2. 在Rhino命令行输入GrasshopperPlayer
  3. 选择.gh文件并运行
  4. 可以快速生成多个变体

5.5 版本控制与协作

最佳实践:

  1. 命名规范:组件命名清晰,参数命名统一
  2. 注释:使用Note组件添加说明
  3. 版本管理:使用Git管理Grasshopper文件(需转换为JSON格式)
  4. 模块化:将复杂定义分解为多个小文件

第六部分:完整项目实战

6.1 项目:建筑立面转折格栅

项目要求:

  • 尺寸:5m x 3m的立面
  • 单元:30mm x 30mm矩形框
  • 转折:从左到右0-90度渐变
  • 厚度:3mm
  • 间距:5mm

完整Grasshopper定义:

[参数面板]
├─ Width = 5000
├─ Height = 3000
├─ Cell_Size = 30
├─ Spacing = 5
├─ Thickness = 3
├─ Max_Angle = 90
└─ Grid_Count_X = 166 (计算:5000/(30+5))
└─ Grid_Count_Y = 85 (计算:3000/(30+5))

[几何生成]
1. Series (X) → Start=0, Step=35, Count=166
2. Series (Y) → Start=0, Step=35, Count=85
3. Cross Reference → 连接两个Series
4. Point → 生成网格点
5. Rectangle → 创建基础矩形(-15到15)
6. Move → 将矩形移动到网格点
7. Area → 获取每个矩形中心点
8. Remap Numbers → 将X坐标映射到0-1
9. Multiply → 乘以Max_Angle
10. Rotate → 旋转矩形
11. Boundary Surfaces → 创建面
12. Extrude → 挤出Thickness
13. Solid Union → 合并所有实体

Python Script整合版:

# 完整的Python Script组件
import Rhino.Geometry as rg
import math

# 参数
width = 5000
height = 3000
cell_size = 30
spacing = 5
thickness = 3
max_angle = 90

# 计算数量
count_x = int(width / (cell_size + spacing))
count_y = int(height / (cell_size + spacing))

# 生成网格点
points = []
for i in range(count_x):
    for j in range(count_y):
        x = i * (cell_size + spacing)
        y = j * (cell_size + spacing)
        points.append(rg.Point3d(x, y, 0))

# 创建基础矩形
base_rect = rg.Rectangle3d(rg.Plane.WorldXY, 
                          rg.Interval(-cell_size/2, cell_size/2), 
                          rg.Interval(-cell_size/2, cell_size/2))
base_curve = base_rect.ToNurbsCurve()

# 生成格栅
result = []
for pt in points:
    # 计算旋转角度(基于X位置)
    rotation_angle = (pt.X / width) * max_angle
    
    # 移动
    moved = rg.Geometry.Translate(base_curve, pt - rg.Point3d.Origin)
    
    # 旋转
    center = moved.GetBoundingBox(True).Center
    plane = rg.Plane(center, rg.Vector3d.ZAxis)
    rotated = rg.Geometry.Rotate(moved, math.radians(rotation_angle), plane.ZAxis)
    
    # 创建面并挤出
    boundary = rg.Curve.CreatePlanarClosedCurve(rotated)
    if boundary:
        surface = rg.Surface.CreateExtrusion(boundary, rg.Vector3d(0, 0, thickness))
        if surface:
            result.append(surface)

# 输出
a = result

6.2 模型导出与后续处理

导出选项:

  1. STEP格式:用于CAD软件交互
  2. OBJ格式:用于3D打印或渲染
  3. DWG格式:用于工程制图
  4. 3DM格式:保留Rhino原生数据

优化导出:

  • 使用Mesh组件转换为网格
  • 设置合适的网格精度(Meshing Parameters
  • 使用Reduce Mesh减少面数(如果需要)
  • 检查并修复几何错误(Check命令)

第七部分:常见问题解答

Q1: 为什么我的格栅在曲面上扭曲严重? A: 可能是因为使用了全局坐标系而非局部坐标系。确保使用Frame组件获取每个点的局部坐标系,并在该坐标系中创建和旋转单元。

Q2: 如何让格栅在边缘处平滑过渡? A: 使用Blend组件或在边缘区域使用渐变的旋转角度。也可以创建一个”边界区域”,在其中使用特殊的参数设置。

Q3: 大型格栅导致Rhino崩溃怎么办? A: 1) 使用Mesh替代Brep;2) 减少显示精度;3) 使用Display组件分批显示;4) 增加内存或使用Rhino 7的64位版本。

Q4: 如何实现非线性的转折? A: 使用Graph Mapper组件,选择正弦、多项式或其他曲线来定义角度变化规律。

Q5: 能否导出到Revit或ArchiCAD? A: 可以,但需要先转换为合适的格式。对于Revit,可以使用Rhino.Inside.Revit插件直接导入。对于ArchiCAD,可以导出IFC或DWG格式。

结语

掌握Rhino和Grasshopper制作转折格栅是一个循序渐进的过程。从基础几何创建到复杂的参数化控制,每一步都需要理解其背后的逻辑。关键在于:

  1. 建立参数化思维:思考关系而非结果
  2. 熟练掌握工具:理解每个组件的功能
  3. 解决实际问题:在项目中应用所学知识
  4. 持续优化:不断改进工作流程

通过本教程的学习,你应该能够独立创建复杂的转折格栅模型,并根据项目需求灵活调整参数。记住,参数化设计的魅力在于其灵活性和可探索性,多尝试不同的参数组合,你会发现无限的设计可能性。

继续练习和探索,你将从零基础走向精通,真正掌握参数化设计的精髓。