BIM轻量化之路(二)-revit导出GLTF

前言

上文提到如果项目需求的业务管理功能多、集成度高,那么就建议使用webgl的技术方向进行模型轻量化。
目前市面上有不少成熟的模型轻量化工具,比如广联达BIMFace、葛兰岱尔的GLWebGLBIMEngine、e建筑等,都是在平台转换,在线、离线式使用,基本都使用的threejs实现模型的展示,其中bimface的通讯格式为二进制,猜测为自定义的数据格式,GLWebGLBIMEngine和e建筑使用的是gltf。还见过一家使用silverlight结合unity做模型展示,但是这并不是主流趋势,很多浏览器已经不支持。

一、轻量化流程

经过多种途径的试探,结合目前的资源,决定全面转向threejs实现轻量化,实现的大概流程:
实现流程
理想中轻量化应该是上传RVT文件后,服务器自动对各版本的文件进行解析处理,将相应的数据及文件存入数据库及文件服务器。模型的展示应该是组件化模块化,对于其他应用模块提供标准开放接口,方便外部调用。所以应该本着文件尽可能小、展示真实、操作流畅的原则进行开发。

二、数据提取

1.revit分类

首先要大概了解revit类别结构
在这里插入图片描述

  • Category:类别,比如梁、板、柱、门、窗等大的分类。
  • Family:族,子分类。
  • FamilySymbol:族类型,个人理解是体现子类的规格。
  • FamilyInstance:实例化出新的对象,体现在revit中就是创建了一个新的构件,这个构件属于Category、Family、FamilySymbol一种,熟悉面向对象的编程语言应该很容易理解这个概念
    所以简单的理解revit的数据存储结构是树状结构

2.revit分类编码规则

Revit 分类编码采用的是国际行业标准的Omniclass编码,是对建筑全生命周期进行编码,印象中总共有30多个table,revit主要使用的是第23个table中的编码,例如:23.25.30.11.14.11,在表中可以查到对应的解释。Revit内置大约有1000多种族分类。

3.插件开发

环境的搭建可以参照
https://blog.csdn.net/qq_36754364/article/details/86724985

提取数据需要依赖revti的sdk, c#引用链接库RevitAPI.dll、RevitDBAPI.dll,实现IExportContext接口,方法流程:
IExportContext 方法执行流程图
注:获取的element包含了场景数据,如相机。也包括轻量化不需要的元素,如中心线、洞等,执行插件只获取当前视图view的元素,也支持链接rvt的进一步遍历。

4.导出gltf

使用GITF格式作为模型文件,一是它的目标是成为模型界的通用格式,类似图片界的jpeg。二是对OpenGL的兼容性好,数据格式清晰简单,三是自己对计算机图形学不了解,自定义格式难度大,还是考虑成熟的数据格式。
GLTF文件格式
GITHUB上有开源的导出GLTF的代码,地址:
https://github.com/McCulloughRT/Revit2glTF

 public struct glTF
    {
        public glTFVersion asset;
        public List<glTFScene> scenes;
        public List<glTFNode> nodes;
        public List<glTFMesh> meshes;
        public List<glTFBuffer> buffers;
        public List<glTFBufferView> bufferViews;
        public List<glTFAccessor> accessors;
        public List<glTFMaterial> materials;
    }

这里是对GLTF的文件格式定义,按照revit二次开发规范实现IExternalCommand,IExportContext接口生成dll和addin文件,然后关联到revit上即可导出文件:
在这里插入图片描述
导出结果:
在这里插入图片描述

4.文件大小优化

对模型进一步优化可以使用谷歌开源的Draco,大幅加速 3D 数据的编码、传输和解码。
gltf-pipeline:https://github.com/CesiumGS/gltf-pipeline,依赖NODE.JS,通过命令行窗口可以对模型进行优化:

  • 转换GLB:gltf-pipeline -i NewProject.gltf -o NewProject.glb
  • 转换Draco:gltf-pipeline -i NewProject.gltf -o buildDraco.gltf –d
    在这里插入图片描述
    源文件大小为6M,压缩完后为1M,压缩比接近6:1,对于管线、精装修等mesh多的情况达不到这种压缩比。

总结

提取的算法优化空间还很大,比如移除重复顶点和重复面、三角网简化等,只不过自己的能力不足,需要继续学习,感兴趣的同学可以进一步优化。

这个是好用的至少是至今发现上最好用最实用,也是参考然后大改过的 比如解决了Node、纹理丢失、压缩等等问题的项目 主要是Revit次开发的插件,其中主要是基于Revit2018进行的,实现从Revit中把建筑模型导出来,使用的是GLTF格式的编码。(这个是好用的至少是至今发现上最好用最实用,也是参考然后大改过的 比如解决了Node、纹理丢失、压缩等等问题的项目) 运行操作: 直接双击运行插件,然后选择需要导出的格式与路径,导出格式包括gltf 与glb进制这些; 运行成功还有返回的信息,导出的格式以及文件等等; 主要使用了RevitAPI.dll 与RevitAPIUI.dll 来Revit次开发,其中 : //add-in manger 只读模式 使用了SharpGLTF库,SharpGLTF是一个100%.NET标准库,旨在支持Khronos Group glTF 2.0文件格式。 所以使用SharpGLTF生成gltf、glb数据; 该库分为两个主要软件包: SharpGLTF.Core提供读/写文件支持,以及对glTF模型的低级别访问。 SharpGLTF.Toolkit提供了方便的实用程序来帮助创建,操纵和评估glTF模型。 simple example gltf保存为glb格式: var model = SharpGLTF.Schema2.ModelRoot.Load("model.gltf"); model.SaveGLB("model.glb"); IExportContext接口在数据导出中,执行如下的顺序: 将revit的数据解析为我们自己的数据需要继承重写IExportContext就能revit文件进行数据导出和数据换; * 接口在数据导出中,无链接模型执行如下的顺序: * Start -> OnViewBegin -> onElementBegin -> OnInstanceBegin ->OnMaterial ->OnLight * ->OnFaceBegin OnPolymesh -> OnFaceEnd -> OnInstanceEnd-> OnElementEnd * ->OnViewEnd ->IsCanceled ->Finish、 * 假如有链接模型在执行完非链接的OnElementBegin以后,执行OnLinkBegin,然后执行链接模型里的OnElementBegin……依次类推 依赖环境:Autodesk.RevitAPi Autodesk.Revit.UI 安装nodejs 使用工具:使用npm 安装gltf-pipeline配置系统环境
BIM轻量化引擎是用于将BIM(建筑信息模型)数据化为轻量化模型的工具或软件。它们可以帮助用户在不同的平台或设备上快速加载和浏览BIM模型,提供更高效的可视化和交互体验。以下是一些常见的BIM轻量化引擎: 1. Autodesk Forge:Autodesk Forge是一个面向云端的开发平台,提供了一系列用于BIM数据处理和可视化的API和工具,包括轻量化引擎。它支持将BIM数据换为多种格式,如SVF(Simple Vector Format),以实现在Web浏览器中加载和交互BIM模型。 2. Unity:Unity是一款流行的跨平台游戏引擎,也被广泛应用于BIM数据的可视化和交互。借助Unity的3D渲染和交互能力,开发人员可以将BIM数据导入并构建逼真的虚拟环境,以及添加交互功能。 3. Unreal Engine:Unreal Engine是另一个强大的游戏引擎,也可用于BIM数据的轻量化和可视化。它提供了高度逼真的渲染效果和交互功能,使用户可以在虚拟环境中进行漫游和操作BIM模型。 4. SketchUp Viewer:SketchUp Viewer是一款专门为SketchUp建模软件设计的轻量化引擎。它可以加载和查看SketchUp模型,并提供交互功能,方便用户在移动设备上浏览和展示BIM数据。 这些是一些常见的BIM轻量化引擎,每个引擎都有其独特的特点和适用场景。选择合适的引擎取决于具体的需求和项目要求。 希望对你有所帮助!如果还有其他问题,请继续提问。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值