在我们的 IFC技术交流群(788206534)里,经常会有人提问“如何学习 IFC文档或者其开发”的问题。对于这个问题,我一直没有机会做一个完整的回答,这次我认真回忆了自己关于IFC的学习经历,在此与大家分享。一是要避免无脑地读官方文档,它就像高中时期那本厚厚的英汉大词典,是一个无底洞,而且里面的不同元素之间还是相互关联的,理清这里面的逻辑关系是非常复杂的一件事;二是选择几个乘手的可视化工具,我在《工业基础类IFC—IFC Viewers》里有提到过一些工具,这里再补充两个工具,分别是 IfcQuickBrowser 和 xbimExploer,这两款工具是我目前用的比较多的,前者是IFC文本的树形结构查看器,后者是几何可视化工具且具有丰富的属性查看功能;三是尽早选择一种适合自己的SDK进行按需开发,在熟悉了IFC标准的基本框架和描述方式后,我们应该以目标为导向去解决问题。就我目前了解到的情况而言,多半的需求集中在对 IFC 文件的信息提取和属性扩展两方面,而少数的需求是要需要创建或者转换成 IFC 文件,对于前者其实并不需要你对IFC有多么深入的了解,SDK已经提供给我们很完备的代码解决方案,它们把复杂的部分进行了封装,但你仍然可以从代码里get到基础的 IFC 表达逻辑和关联关系,这是一个非常快的过程,我们还可以轻松地通过代码的智能提示了解它们之间的关系,这对于我们普通开发者而言,足矣。
回到今天的主题,IFC 中的材质表达同样是一个复杂的体系,在准备这篇文章之前,我对此也是浑然不知。说它复杂,其实是因为它的全面性,兼顾了各种形式的材质信息表达、几何材质及纹理,确保了信息的完整性。
一、材质信息
首先材质定义与构件/构件类型的关联关系是通过 IfcRelAssociatesMaterial 来建立的。当然一个构件可能存在一种或多种材质,当只有一种材质时并不难,直接关联一个 IfcMaterial 即可,而有多种材质时,IFC可以从三个维度去描述构件的材质,一是按层(lfcMaterialLayerSet:不同材质之家有明显界限),比如在描述汉堡的材质时,第一层是面包,第二层是沙拉和生菜,第三层是肉,第四层还是面包;二是按成分(lfcMaterialConstituentSet:不同材质相互混合),比如我们在描述混凝土的材质时,它是由水泥、沙子、骨料、添加剂等混合而成;三是按横截面(lfcMaterialProfileSet:不同横截面轮廓的组合),这通常用于几何分析,可以用于定义不同截面位置处的力学特性。另外,值得提醒的是,IFC 2*3 中用于定义多材质的实体- IfcMaterialList,在 IFC 4 版本中被弃用,因为其摸棱两可的定义。
有了 材质定义之后,还需要定义它的使用方式,例如对于多层材质来说,层叠加的方向等等。当然,也只有 lfcMaterialLayerSet 和 lfcMaterialProfileSet 才有定义使用方式的必要。这里为了更直观,我们直接拿不同材质类型的 IFC 文件进行说明。
1.1 IfcMaterialLayerSetUsage
案例文件中包含一个多层材质的墙,找到编号#303
的墙实体,并在其反向属性中找到其材质的关联实体#305
,#305
中包含了材质的使用方式#304
,在#304
中能找到编号为#210
的层材质定义,该层材质由#204
、#206
、#208
三个材质共同组成,它们分别定义了各自的层高。
关于构成 IfcMaterialLayerSetUsage 实体的字段信息,可以参考下图,首先是层叠加的方向,该方向仅支持坐标轴定义,AXIS1
、AXIS2
、AXIS3
分别代表X\Y\Z轴,我们可以通过构建局部坐标系来实现各个方向上的层叠加;其次是方向的正负性,不用过多解释;还有距参照线的偏移值,该值可正可负,参照线的定义如下图所示,可以在ShapeRepresentation中找到。根据上述定义,我们可以推断出,这种多层材质的表达也仅限于材质层高固定的情形,对于复杂的多层地质是难以表达的。
1.2 IfcMaterialProfileSetUsage
案例文件中包含一个工字形的梁,找到编号#70
的梁实体,并在其反向属性中找到其材质的关联实体#72
,#72
中包含了材质的使用方式#71
,在#71
中能找到编号为#66
的轮廓材质定义,该轮廓材质由工字形轮廓#64
组成。
IfcMaterialProfileSetUsage 最主要的字段信息是CardinalPoint
,也就是基点位置。该位置以1-19之间的整数数字表示,分别对应不同的截面轮廓的有效点。如下图所示,案例文件的数值5代表截面轮廓包围盒的中心点。
IFC 支持多种类型的轮廓定义,其中就包括案例文件中采用的参数化轮廓,我们比较熟悉的就是工字形、槽型、圆型、L型、U型等轮廓形状。
二、几何渲染材质和纹理
上述材质信息主要是对材质构成进行描述,并没有定义几何渲染所需的参数信息。而 IFC 将几何渲染参数称为样式Style
,如下图所示,对象的几何数据通过IfcStyleItem
与样式建立关联。这里我们主要讨论的是面样式IfcSurfaceStyle
。IfcSurfaceStyle
由多个IfcSurfaceStyleElementSelect
组成,一般分为两种情况:带纹理贴图和不带纹理贴图,前者由IfcSurfaceStyleWithTextures
和IfcSurfaceStyleRendering
组成,后者则只有IfcSurfaceStyleRendering
。
IfcSurfaceStyleRendering
支持Phong光照模型、基于物理的光照模型和忽略光源的平面光照模型。IfcSurfaceStyleWithTextures
用于表达贴图纹理,如下图所示,当对象存在贴图纹理时,其几何表达一般为三角化数据,顶点数组记录在IfcCartesianPointList3D
中,UV纹理坐标则记录在IfcTextureVertexList
中。
三、小结
虽然 IFC 标准早就提供了贴图纹理相关的实体,但一是ABC厂家并没有集成这块功能,例如Revit导出IFC时,是不会携带贴图纹理的;二是既有的IFC可视化工具均不支持贴图的查看。这方面SZ-IFC倒是做了不少工作,其插件可以导出贴图,而且也有一个专门的查看器,不过贴图文件是以附件形式存在的,数据利用过程中会有些麻烦。
四、参考资料
IFC - Industry Foundation Classes/IFC materials - Wiki.OSArch