BIM 模型和手工模型最大的区别在于几点:
1.建模目标不同,手工模型的目的是为了可视化,就是为了看的见,看不见的东西能省则省。BIM 完全是按照一些工程标准去创建的,比如路面可能有多个层代表了不同的物理层。手工模型的纹理贴图量可能很大,BIM 的贴图相对简单。
2.手工模型一般没有属性信息,但是 BIM 模型有大量属性。
基于这些差异,虽然有些 BIM 工具可以导出 fbx 等模型的交换格式,但是还是推荐按照我们的流程来。 1.导出 clm 格式(clm格式定义),clm 是我们自定义的中间格式,它内部存储了我们切片需要的所有可视化数据(几何体、材质纹理、属性信息、模型结构)等。目前我们做了 revit的插件和microstation connect editon 的插件。以前的 catia v5-2016 插件因为我们实在难以找到更新的 catia 开发资料,也没有技术支持,我们无法再更新,只能暂停,并且从 lab3 里剔除。 2.ifc 格式,ifc 号称是 bim 的标准格式,但事实上 ifc 的标准也是古老而复杂,各家 bim 工具对于 ifc 的支持都不是尽善尽美。另外我们读取和解析 ifc 也是一个比较头疼的问题,容易产生构件丢失的问题,一般最好不要优先考虑 ifc 的方式,而应该是 clm 方式。(lab3中我们也剔除了直接输入ifc的功能)
这里单独讲一讲我们自定义的clm中间格式
clm(CesiumLab Model 简称clm)格式是 CesiumLab 自定义的 BIM 数据中间格式,基于 sqlite 文件数据库,单文件涵盖了可视化需要的所有 BIM 数据信息,包括属性、几何体、构件、纹理、结构等等。 总共包括下述 6 个表。 1.Models
定义了模型信息表
字段名 | 类型 | 说明 |
id | Text | 必须,唯一性标识符,sqlite 下使用 guid 生成 |
path | Text | 必须,源bim 数据路径 |
date | Date | 必须,模型信息导出完成时间 |
elementcount | Int | 必须,模型中的构件个数 |
geometrycount | Int | 必须,模型中的几何体个数 |
Vertexcount | Int | 必须,模型中顶点个数 |
trianglecount | Int | 必须,模型中三角形个数 |
propertycount | Int | 必须,模型中属性个数 |
2.Properties 定义了模型属性表
字段名 | 类型 | 说明 |
id | Text | 必须,唯一性标识符,sqlite 下使用 guid 生成 |
name | Text | 必须,字段名称 |
type | Text | 必须,字段类型,string、integer、double、float,bool |
group | Text | 可选,属性分组 |
unittype | Text | 可选,单位类型,可选 length,volume 等 |
3.Geometries
定义了模型的几何信息
字段名 | 类型 | 说明 |
id | Text | 必须,唯一性标识符,sqlite 下使用 guid 生成 |
gltf | Blob | 必须,几何体信息,使用 glb2.0 格式存储,gltf和 buffer 存在一起。并用 zip 压缩。glb 中纹理采用url 形式,为 modelresources 表的 id。 |
lod | Int | 可选,表示几何体的 lod 级别 |
vertexcount | Int | 几何体顶点个数 |
trianglecount | Int | 三角形个数 |
x | Double | 包围球中心点x 值 |
y | Double | 包围球中心点 y 值 |
z | Double | 包围球中心点 z 值 |
r | Double | 包围球半径 |
4.Elements
定义了 BIM 构件属性
字段名 | 类型 | 说明 |
id | Text | 必须,唯一性标识符,目前 id 虽然是字符串形式,但是必须是整形格式。 |
name | Text | 必须,构件名称 |
modelid | Text | 必须,构件属于哪个模型 |
properties | Blob | 必须,构件的属性信息,如果是 sqlite,这块直接存入 json 文本,并使用 zip 压缩。 |
geometries | Blob | 必须,构件的几何体信息,如果是 sqlite,存入json 文本。 |
geometrysize | Int | 所有几何体的glb 未压缩字节大小之和 |
vertexcount | Int | 顶点个数 |
trianglecount | Int | 三角形个数 |
x | Double | 包围球中心点 x 值,注意这里因为 element 对geometry 的引用是有偏移矩阵的,所以这里的包围球是几何体坐标乘以偏移矩阵得到的。 |
y | Double | 包围球中心点 y 值 |
z | Double | 包围球中心点 z 值 |
r | Double | 包围球半径 |
Properties 的 json 部分示例如下:
该信息为一个数组。“index”为当前BIM 模型的属性列表里序号。Value 为当前字段的值。 Geometries 的部分,参考如下: Geometries:[{ “id”:”aaaaaaaaaaaaaa”, “matrix”:[0,….] },{}] “id”:”aaaaaaaaaaaaaa”, “matrix”:[0,….] 该信息也是一个数组,gid 表示引用 geometries 库下的几何体 id,matrix 表示偏移矩阵,默认为单位矩阵。
5.modelresources
定义了几何体gltf 中引用的外部资源,一般都是纹理图片
字段名 | 类型 | 说明 |
id | Text | 必须,唯一性标识符,sqlite 下使用 guid 生成 |
name | Text | 必须,资源名称 |
data | Blob | 必须,资源的二进制数据 |
6.Scenetree
定义了模型的结构树中的节点(node)
字段名 | 类型 | 说明 |
id | Text | 必须,唯一性标识符,sqlite 下使用 guid 生成,节点如果是构件,那么必须和构件id 相同 |
name | Text | 必须,节点名称 |
type | Text | 可选,节点类型,对于构件,必须是 element |
props | Text | 可选,JSON 格式,附加到本 node 的额外属性,比如 |
parent | Text | 可选,节点的父节点,为空表示根节点 |