第 0002 课 · 上一课 · 术语表

IFC 的几何是怎么存的

同一个 IFC 文件,Revit 秒开,浏览器卡死——根因在"几何表示方式"。

一个反直觉现象

假设你拿到一个 50MB 的 IFC 文件。在 Revit 里双击,几秒就打开了,旋转流畅。同一个文件用浏览器解析渲染,可能要等 30 秒,转一下卡一下。

第一反应可能是"浏览器性能差"或"WebGL 不行"。但真实原因更微妙:IFC 文件里存的根本不是"三角形",而是"形状的数学描述",渲染前必须先把它"算成"三角形。这一步计算,就是浏览器卡死的根源。

这节课拆开 IFC 的三种主流几何表示,让你之后看到任何 IFC 解析性能讨论,都能立刻判断瓶颈在哪。整课 7 分钟可读完。

同一面墙,三种存法

IFC 里同一面墙(比如长 4m、厚 0.2m、高 3m 的墙),可以由三种完全不同的方式描述。这三种方式存的数据量、解析难度、渲染友好度截然不同。

SweptSolid 扫掠体 / 挤出 2D 截面 挤出 3m 墙体结果 截面 + 路径 Brep 边界表示 面1 面2 6 个面 + 边 + 顶点 精确但需计算 面/边/顶点列表 Tessellation 三角网格 N 个三角形 GPU 直接吃 顶点 + 索引
图 1:同一面墙在 IFC 里可以由 SweptSolid、Brep、Tessellation 三种方式描述。数据量与解析成本天差地别。

SweptSolid —— "配方",需要"烹饪"

SweptSolid 描述一个 2D 截面 + 一条路径(通常是直线挤出或旋转)。墙、梁、柱、管道这类"沿一个方向延伸"的构件,几乎都用这种方式。

数据上极其紧凑:一个矩形截面定义(4 个点)+ 一个挤出向量(3 个数)就能描述一面墙。这是 IFC 中最常见的表示,也是 web-ifc 等解析库的甜点——计算量小,几行代码就能把截面挤出成三角形网格。

后端类比:SweptSolid 像一个视图定义——存的是"怎么算出来",每次渲染要 query 一次。轻量,但不是零成本。

Brep —— "精确图纸",渲染前要解算

Brep(Boundary Representation,边界表示)用面、边、顶点精确描述实体边界。每个面可以是平面,也可以是复杂曲面(圆柱面、NURBS 曲面)。它追求的是数学上的精确——一个圆柱就是真正的圆柱,不是离散的三角形。

这种精确性是 BIM 设计端的刚需(用于碰撞检测、工程量计算、CAM 加工),但对浏览器是灾难:GPU 只认三角形,所以每个曲面都要先 tessellate(三角化)。复杂曲面(如异形幕墙、自由曲面屋顶)的三角化计算极其昂贵,可能秒级甚至分钟级。这是浏览器渲染 IFC 的主要性能瓶颈

关键事实:Brep 不是"坏了"或"过时",它服务于不同的目的(精确)。问题出在把设计期的精确表示直接喂给运营期的渲染管线——目的错配。

Tessellation —— "做好的菜",GPU 直接吃

Tessellation 表示 IFC 已经把曲面离散成了三角形网格,存的是顶点坐标数组 + 三角形索引数组。这正是 GPU 喜欢的格式,几乎零计算直接渲染。

IFC 4 起官方支持 Tessellation 表示,但设计院交付的 IFC 极少主动用这种表示——因为生成时占用文件大、且失去精确性。它更多出现在导出端:当你用 IfcOpenShell 把 IFC 转 glTF 时,本质上就是在做"把 SweptSolid/Brep 统一 tessellate 成三角形"。

第四种 CSG(布尔运算组合基本体)在早期 IFC 中存在,现已罕见,不展开。

一个必须分清的概念:几何 vs 拓扑

IFC 把"形状"拆成两个独立的资源:

这两者分开存,是 Brep 精确性的根基——同样的几何可以有多种拓扑解释,同样的拓扑可以挂不同几何。但对渲染来说,你最终要把拓扑 + 几何合成一个统一的三角形流,这个合成就是 tessellation 干的事。

后端类比:几何像"数据",拓扑像"外键关系"。Brep 同时维护两者,渲染前要 join 成扁平的三角形数组——这个 join 就是 tessellation。

渲染管线的真相

无论 IFC 里用的是 SweptSolid 还是 Brep,屏幕上显示的永远是三角形。所以从 IFC 到屏幕,必经这条管线:

IFC 文件 SweptSolid/Brep tessellate ⚠ 计算密集 三角形网格 顶点+索引 传 GPU glTF / 3D Tiles (预转产物) 流式加载 浏览器屏幕 GPU 渲染 预转就是在 IFC 上传时提前做完 tessellate,把结果存成 glTF
图 2:IFC → 屏幕的必经管线。tessellate 这一步的耗时,决定了"原生解析" vs "预转"两条路线的分野。

这张图揭示了两个关键决策点:

  1. tessellate 在哪儿做?在浏览器里现做(卡顿但实时),还是在后端预先做好(一次性成本,浏览时流畅)?
  2. 预转产物用什么格式?glTF(单文件,适合单建筑)、3D Tiles(流式切片,适合园区/城市级)?

这两个问题就是下一课的主题。

一个工程级实测数据

开源 BIM viewer xeokit 做过一组 IFC 转换基准测试,结论很硬:

一个 729MB 的 IFC 文件,转成 xeokit 自家的 XKT 格式(本质就是预转 + 压缩的三角形流),结果是 73.95MB——体积压到 1/10,且无需运行时 tessellate,浏览器秒开。
转换参数必须切片:-s 50(每片 glb ≤ 50MB,规避浏览器内存上限)、-t 200(按 200×200×200m 立方体切几何,规避大世界坐标浮点抖动)。

这个数据是业界共识的缩影:大型 BIM 模型在浏览器里直接解析 IFC 是反模式。web-ifc 这类原生解析库只适合中小模型与交互编辑场景,不适合做运营期数字孪生的主视图。

对 Pivot 的含义

本课给了一个反直觉的判断框架:"IFC 文件大小" ≠ "渲染压力"

一个 50MB 的 IFC(如果是 Brep 为主、含复杂曲面),实际渲染压力可能远超一个 200MB 的 glTF——前者要现场 tessellate,后者 GPU 直接吃。

所以评估"接入 BIM"时,不能只看客户给的 IFC 文件多大,要看:

这三项的组合,才是真实渲染成本的预测变量。下一课会把这些参数映射到具体的路线选择。

检索练习 · 3 道题
1. IFC 中墙、梁、柱最常用的几何表示是?
2. 浏览器渲染 IFC 的主要性能瓶颈是?
3. 一个 50MB IFC 和一个 200MB glTF,渲染压力谁大?