Xbim.GLTF源码解析(四):轻量化处理
原创作者:flowell,转载请标明出处:https://www.cnblogs.com/flowell/p/10839433.html
在IFC标准中,由IfcRepresentationMap支持图元的复用。IfcRepresentationMap包含一个或多个IfcMappedItem,IfcShapeRepresentation可以应用笛卡尔变换算子将自身(ShapeRepresentation)变换到另一个本地坐标系,这个变换算子包含在IfcMappedItem中。IfcMappedItem的坐标笛卡尔变换被限制为平移,旋转,镜像和缩放,对应的矩阵必须是TRS矩阵。因此,通过包含IfcRepresentationMap属性便可以达到将同样的ShapeRepresentation应用在不同的IfcProduct中。
图1 通过IfcRepresentationMap复用ShapeRepresentation
如下图,在同一个模型中的高亮的两把椅子。两把椅子的外形一致,材质纹理和大小在视觉上都是一致的,它们位于坐标系中不同的坐标。根据这个Representation实例的EntityLabel推断,这两把椅子分别属于不同的ShapeRepresentation。
图2 IFC模型中的一把椅子
图3 IFC模型中的另一把椅子
追踪两把椅子的ShapeRepresentation,可以发现最终抵达了同一个元素。这个元素的Type是IfcShapeRepresentation,说明这也是一个ShapeRepresentation,但是在图中并没有显示出来。该ShapeRepresentation拥有的是真实的图形数据,可以看到列表中包含了8个图元信息,这些信息真是地构成了一张完整的椅子。而这个ShapeRepresentation拥有PresentationMap属性,该属性拥有多个IfcMappedItem,这些IfcMappedItem又正好对应着上图椅子里的IfcShapeRepresentation所引用的IfcMappedItem。总而言之,一个IfcMappedItem便对应着一个坐标变换,通过坐标变换从而使得同样的椅子出现在空间中的不同坐标中。
图4 构件共用的IfcShapeRepresentation
因为坐标转换已经包含在IFC文件中了,对于构件而言,其本地坐标系到世界坐系的转换坐标已经包含在构件本身的属性里,所以本章的工作无需再次计算变换的矩阵,只要读取构件的变换矩阵并保存即可。
基于以上理论依据,本文提出以下轻量化算法:
算法流程:
图5 模型轻量化的算法流程