BIMServer数据结构分析

BIMServer是一套BIM领域著名的开源平台,提供IFC文件管理、数据解析、格式化输出、web通信标准、WebGL渲染等功能,一站式解决BIM模型从文件到渲染展示的服务。

本文主要目的是整理分析BIMServer的数据结构,为BIM团队及其他有意或正在使用BIMServer的团队提供参考。因没找找到合适的圈子,所以先放在了WEBGL的圈子里。

webGL渲染效果

移动端Unity3D渲染效果

BIMServer基本的工作流程,蓝色部分为BIMServer服务端操作,其中解析数据包含整理、分类,重新索引、几何数据分离等操作。绿色部分为客户端操作。

BIMServer模型数据主要分成两个阶段来获取:
  • 通过HTTP接口获取IFC Object元数据(Meta Data)
  • 通过websocket获取IFC Object几何渲染数据(Geometry Data)

Meta Data:
   MetaData的使用场景较多,所有对BIM Object的查询操作都会产生MetaData信息,其中最重要的功能是获取模型索引表。
  • MetaData包含所有依赖关系及依赖索引号
  • MetaData包含模型的全局信息,包括材质信息、计量单位等
  • MetaData包含单个IFCObject的边界数据和BIMServer提供的额外的计算数据(如面积,体积,宽高,经纬度,海拔等)
  • MetaData包含单个IFCObject的属性信息分组与列表
  总结一下就是IFC原文件中所有与几何数据无关的标签都使用MetaData展示。MetaData最重要的一个场景就是获取IFC Object依赖列表,流程如下:
    1. 确定模型id、版本id和返回数据格式并提交给BIMServer;
    2. 确定要查询的构建依赖关系的IFCObject标签,包括标签类型和具体的信息类型,一般需要包括的标签如下;
        * IfcProject
        * IfcRepresentation
        * IfcProductRepresentation
        * IfcPresentationLayerWithStyle
        * IfcProduct
        * IfcProductDefinitionShape
        * IfcPresentationLayerAssignment
        * IfcRelAssociatesClassification
        * IfcSIUnit
    3. 组装成BIMServer约定格式提交;
    4. 根据返回的MetaData及关联索引号,可以很容易地构建成一个完整的Project依赖关系树。

   MetaData还有例如获取材质信息,查询构件属性等诸多场景,具体可以参考BIMServer官方wiki
{ //数据结构举例
      "_i": 15422653330, //索引号
      "_t": "IfcProject", //节点类型
      "_s": 1, //节点信息数量
      "GlobalId": "1uPao3J9DDfP1fq0MDOh5G", //IFC文件全局标识
      "_rOwnerHistory": 16313418326, //IFC文件创建时间与工具信息节点号
      "Name": "Project Number", //节点名
      "_rIsDecomposedBy": [ //分解子节点编号
        60144157223
      ],
      "LongName": "", //节点名(全称)
      "Phase": "Project Status", //节点标签
      "_rRepresentationContexts": [ //内容节点编号
        31861965159,
        31862030695
      ],
      "_rIsDefinedBy": [ //构件属性节点编号
        1028471849606,
        1028471915142,
        1028471980678
      ]
      "_rgeometry": 273496016728, //几何信息节点编号
      "_rRelatingObject": 15476196022, //父构件编号
      "_rRelatedObjects": [ //子构件编号
        19350749404,
        19350814940
      ]
      ...... //不同节点类型,结构不同
    }
Geometry Data:
   Geometry Data顾名思义,就是模型的几何数据,包含:
  • 模型的全局边界信息
  • 单个构件的边界信息
  • 单个构件的投影矩阵数据
  • 单个构件的网格数据(含顶点数据,三角索引数据,网格发现数据和网格面着色数据)
  Geometery Data是确切的,可以用于渲染的数据,所以在渲染前必须先要构建完整的Project依赖关系树,否则Geometery Data无法确切对应到具体的构件上,无法完成渲染。

最后整理一下BIMServer的缺点:
    1. 目前BIMServer目前仅限于处理IFC文件,数据相对更丰富的revit和FBX文件则不兼容。
    2. 目前仅支持IFC2x3和IFC4,不兼容IFC2x4以及更早期的IFC文件。
    3. BIMServer的接口设计与交互对web前端较友好,但对各种形式的原生客户端应用(尤其是移动客户端)来说非常不友好。
        * 过于频繁的HTTP交互;
        * 网络数据流量较大;
        * 大多接口需要串行进行,无法做并发调用;
        * 仅提供了基于webGL的渲染方案,各种原生客户端需要自己集成或进行渲染引擎的开发。
    4. 过于依赖BIMServer服务器,服务器压力较大。
    5. 不支持网格聚合与分割算法,完整渲染整个模型带来巨大的硬件资源开销。

本文来自网易实践者社区,经作者徐骞授权发布。