这是 LK 工具集中的可见面提取组件,用于获取多重曲面在指定视图方向上的可见面集合。它的核心逻辑类似于三维软件的"消隐"算法:给定一个视图平面,判断哪些面朝向观察者且未被其他面遮挡。
GH_TaskCapableComponent,复杂运算异步执行,Grasshopper 界面不卡顿Parallel.ForEach 进行多核并行计算,高速处理大面积模型| 名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| 多重曲面 (B) | Brep | 必需 | 需要提取可见面的多重曲面模型(单个 Brep) |
| 视图平面 (P) | Plane | 可选 | 视图平面,默认值为世界 XY 平面。视图方向为平面的 Z 轴方向(即法向量方向) |
| 名称 | 类型 | 说明 |
|---|---|---|
| 可见面 (F) | Brep | 提取出的可见面(列表)。每个可见面从原 Brep 中复制为单独的 Brep 对象 |
| 可见面序号 (I) | Integer | 可见面在原多重曲面中的面索引序号(列表),与可见面列表一一对应 |
每个面经过两次筛选才能被判定为可见:
计算面的中心法向量,检测其与视图方向(平面 Z 轴)的点积。当点积大于 0.01 时,说明该面朝向观察者,通过第一轮筛选。
从面中心沿视图方向发射射线,检查是否与其他面相交。如果射线碰到其他面且距离大于容差,则判定该面被遮挡,排除出可见面列表。
Parallel.ForEach 中独立并行执行。遮挡检测也使用并行循环快速判断,一旦检测到遮挡立即停止。
该组件继承自 GH_TaskCapableComponent,在 Grasshopper 的数据驱动运算场景下自动启用异步执行:
InPreSolve):将输入的 Brep 和平面数据封装为后台 TaskSolveInstance):通过 GetSolveResults 获取计算结果| 场景 | 说明 |
|---|---|
| 建筑立面可见面提取 | 给定建筑模型的平面图,仅提取正立面/侧立面上的可见面,用于立面图制作或日照分析。 |
| 展平单侧曲面 | 配合展平工具,仅将某个朝向的可见面提取出来进行处理。 |
| 模型简化 | 在特定视角下,只保留可见面的几何信息,剔除隐藏面以简化模型。 |
| 视觉分析 | 判断模型中哪些区域从某个方向可见,辅助视线分析或景观评估。 |
组件不依赖面反转标志(OrientationIsReversed),而是直接通过曲面参数域中点计算实际法向量,因此对于各种面朝向的模型均适用:
(uMid, vMid)PointAt(u, v) 获取中心点坐标NormalAt(u, v) 获取该点的法向量并单位化使用 Rhino 的 Intersection.RayShoot 方法,从面中心沿视图方向发射射线。如果射线命中其他面(距离 > 容差 0.01),则认为该面被遮挡。默认容差为 0.01 个单位。
| 名称 | 获取曲面的可见面 |
| 英文名 | VisibleFacesExtractor (VisFaces) |
| 分类 | LK → Brep |
| 基类 | GH_TaskCapableComponent<Solution> |
| GUID | 5C8E2276-3468-4AAF-A44E-F03F24B9122A |