visface 获取曲面的可见面 · VisibleFacesExtractor

获取模型在指定视图方向上的可见面,支持异步并行计算
📂 LK → Brep 📄 BrepVisibleFacesComponent.cs ⚡ GH_TaskCapable 🔄 并行计算

📖 功能概述

这是 LK 工具集中的可见面提取组件,用于获取多重曲面在指定视图方向上的可见面集合。它的核心逻辑类似于三维软件的"消隐"算法:给定一个视图平面,判断哪些面朝向观察者且未被其他面遮挡。

📥 输入参数

名称类型必填说明
多重曲面 (B) Brep 必需 需要提取可见面的多重曲面模型(单个 Brep)
视图平面 (P) Plane 可选 视图平面,默认值为世界 XY 平面。视图方向为平面的 Z 轴方向(即法向量方向)

📤 输出参数

名称类型说明
可见面 (F) Brep 提取出的可见面(列表)。每个可见面从原 Brep 中复制为单独的 Brep 对象
可见面序号 (I) Integer 可见面在原多重曲面中的面索引序号(列表),与可见面列表一一对应

🧠 核心流程

1
输入模型 + 视图
2
并行面分析
3
提取可见面
4
输出结果

🔍 可见性判断算法(两阶段检测)

每个面经过两次筛选才能被判定为可见:

🧭

阶段一:法向量朝向检测

计算面的中心法向量,检测其与视图方向(平面 Z 轴)的点积。当点积大于 0.01 时,说明该面朝向观察者,通过第一轮筛选。

🛡️

阶段二:遮挡检测

从面中心沿视图方向发射射线,检查是否与其他面相交。如果射线碰到其他面且距离大于容差,则判定该面被遮挡,排除出可见面列表。

✅ 两种检测同步进行:每个面的可见性判断在 Parallel.ForEach 中独立并行执行。遮挡检测也使用并行循环快速判断,一旦检测到遮挡立即停止。

⚡ 异步任务支持

该组件继承自 GH_TaskCapableComponent,在 Grasshopper 的数据驱动运算场景下自动启用异步执行:

🧪 典型使用场景

场景说明
建筑立面可见面提取 给定建筑模型的平面图,仅提取正立面/侧立面上的可见面,用于立面图制作或日照分析。
展平单侧曲面 配合展平工具,仅将某个朝向的可见面提取出来进行处理。
模型简化 在特定视角下,只保留可见面的几何信息,剔除隐藏面以简化模型。
视觉分析 判断模型中哪些区域从某个方向可见,辅助视线分析或景观评估。

🔬 技术细节

法向量计算方式

组件不依赖面反转标志(OrientationIsReversed),而是直接通过曲面参数域中点计算实际法向量,因此对于各种面朝向的模型均适用:

  1. 获取面的 UV 参数域范围
  2. 计算 UV 域中点 (uMid, vMid)
  3. 通过 PointAt(u, v) 获取中心点坐标
  4. 通过 NormalAt(u, v) 获取该点的法向量并单位化

遮挡检测的射线法

使用 Rhino 的 Intersection.RayShoot 方法,从面中心沿视图方向发射射线。如果射线命中其他面(距离 > 容差 0.01),则认为该面被遮挡。默认容差为 0.01 个单位。

⚠️ 局限性说明:基于射线法的遮挡检测是近似判断。对于完全包围内部腔体的凹曲面,中心点射线可能无法穿透整个外部壳来判断遮挡,这在简单模型中影响不大。

📋 组件信息

名称获取曲面的可见面
英文名VisibleFacesExtractor (VisFaces)
分类LK → Brep
基类GH_TaskCapableComponent<Solution>
GUID5C8E2276-3468-4AAF-A44E-F03F24B9122A