快速开发一个三维自动建模程序:自动建模+后端服务+3D Tiles

开发一个自己的三维建模工具

坐标成都,疫情+高温,出不了门,闲来无聊,给大家分享一个简单的自动化建模实现方案。


要求:通过后端服务实现,输出3DTiles切片


一、技术栈分析

目前,GIS行业及相关行业(数字孪生、元宇宙等)进入到当今时代赋予的红利期。不少商业公司正在不断研发和发布自己的三维软件产品,传统的GIS平台软件大厂(易智瑞、超图等)也在三维可视化及应用领域不断发力,包括传统测绘行业也在向实景三维中国转型。

从GISer人的眼中来看,支撑数字孪生和元宇宙应用的技术点无非是:

3D数据模型(底层数据结构&存储逻辑)+三维建模(数据工程&建模技术)+三维应用(软件开发&项目价值)

今天就给大家分享一个Cesium开源技术栈的一环(三维自动建模),通过调用在线建模服务(输入模型底面),实时建模,返回模型切片地址(3dTiles)。


二、技术实现

1、搭建Nodejs+EXpress后端服务环境

需要windows开发环境、Windows服务器环境,依赖包如下:
在这里插入图片描述
如果需要mac、linux环境可以自行编译Cesium3DTilesConverter源码

2、开发上传接口

上传的参数:geojson数据集。84坐标系。可以是Cesium前端绘制的Geojson多边形集合。

 var geojsons = {
        "type": "FeatureCollection",
        "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
        "features": [……]
      };

3、后端Geojson转SHP

 引入第三方包:geojson2shp,进行转换操作。
let geojson_data = JSON.parse(data);  //前端上传个geojson数据集对象
    const options = {
        layer: filename, //图层名称
        targetCrs: 4326
    }
    //geojson转shp
    convert(geojson_data, shpZip, options);
 生成的shp默认是压缩包,需要进行加压缩操作。
 let zip = new admZip(shpZip);
            zip.extractAllTo(shpPath + filename, true);

4、后端SHP转3DTiles

SHP转3DTiles。
首先在github上直接下载的Cesium3DTilesConverter.exe可执行程序,放到Nodejs运行目录下
代码执行转换操作

 // console.log("文件解压完成。");            
 let cmd = converterPath + `\Converter.exe --format gdal --input ` + shpPath + filename + ` --output ` + outputPath + filename + ` --field height --layer ` + filename;
 exec(cmd, function (error, stdout, stderr) {
     if (error) {
         console.error(error);
     }
     else {
         //记录前端传过来的参数
         var str = JSON.stringify(parm);
         fs.writeFile(outputPath + filename + "/parm.json", str, function (err, data) {
             if (err) {                          
                 console.error(err);
             }                       
         });
         // console.log("success");
         res.send({'result': httserver + '/' + filename + '/tileset.json' });//返回最终处理结果 3dtiles切片地址
     }
 });

5、开发dxf转geojson接口

针对复杂的应用需求,通过前端绘制模型底面多边形的方式不太友好,我们可以选择手动处理得到模型底面的办法。比如根据复杂的建筑设计或装修图纸,提取/绘制房屋底面CAD(转成84坐标),输出dxf文件。

//首先将dxf文件上传到nodejs运行目录 outputPath 下
if (filename.toLowerCase().indexOf('.dxf') > -1) {
 const outputPath = path.join(__dirname, 'upload/');
 const content = fs.readFileSync(outputPath + filename, 'utf-8')
 new DxfParser().parseContent(content)
     .then(result => {
         let geojson = toGeojson(result);
         //cad闭合曲线转成面
         if (geojson && geojson.features) {
             for (let index = 0; index < geojson.features.length; index++) {
                 const feature = geojson.features[index];
                 if (feature && feature.geometry && feature.geometry.type == 'LineString') {
                     if (feature.geometry.coordinates.length > 2) {
                         if (feature.geometry.coordinates[0].toString() == feature.geometry.coordinates[feature.geometry.coordinates.length - 1].toString()) {
                             feature.geometry.type = 'Polygon';
                             feature.geometry.coordinates = [feature.geometry.coordinates];
                         } else {
                             if (polyline2polygon == 'true') {  //传入参数,是否将线转成面
                                 feature.geometry.type = 'Polygon';
                                 feature.geometry.coordinates[feature.geometry.coordinates.length] = feature.geometry.coordinates[0];
                                 feature.geometry.coordinates = [feature.geometry.coordinates];
                             }
                         }
                     }
                 }

             }
         }
         
         //向前端返回dxf转geojson的结果,最好在前端做数据质检和业务逻辑控制
         res.send({
             status: true,
             message: 'File is uploaded',
             data: {
                 name: filename,
                 mimetype: dxffile.mimetype,
                 size: dxffile.size
             },
             geojson: geojson
         });
     })
}

三、示例效果

在这里插入图片描述
在这里插入图片描述


总结

对于中小型的项目应用(三维白模),我们分享这个方案是适合的。如果要进一步提高要求,可以通过自定义Cesium的渲染着色器来实现三维模型的高级可视化,或者改写3DTiles转换工具的代码实现纹理贴图。

这里提出两个更高阶的技术应用,欢迎交流讨论:

1、BIM模型管理的难点:轻量化、分片、按需加载、模型体量太多等
基于Cesium的应用场景:可选择在revit下进行二次开发(数据质检+自动轻量化+ 动态导出模型),动态转换3DTiles切片

2、三维管线自动建模与动态更新
区别于部分GIS平台软件的动态建模路线(本质上也是采用了软件提供的三维对象进行实时渲染)。另一种方式就是事先生成好模型,再加载到GIS引擎或游戏引擎进行渲染。针对Cesium应用,限定三维管线更新频率,可以在后台实时创建三维模型fbx(可借助blender强大的python能力,根据二维管线生成三维管线),动态转换成3DTiles。

更多资讯、合作交流、技术研讨,请关注作者微信:hebinabianyan

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
gltf是一种开放的3D文件格式,而3D Tiles则是一种用于高性能可视化大规模地理数据的技术。将gltf文件转换为3D Tiles可以让我们能够更好地在地理信息系统(GIS)中展示和分析三维模型数据。 要将gltf转换为3D Tiles,需要进行以下步骤: 1. 导入gltf模型:将gltf文件导入到3D建模软件中,如Blender或3D Max等。这些软件可以用来编辑和处理模型的几何形状、纹理、材质等。 2. 调整模型设置:在3D建模软件中,可以对模型进行一些调整和优化,以确保转换后的3D Tiles文件能够在GIS应用中具有较高的性能。例如,可以简化模型的几何细节,合并材质或纹理等。 3. 导出为3D Tiles:选择合适的导出选项将模型导出为3D Tiles文件。一些3D建模软件提供了直接导出为3D Tiles的选项,也可以使用专门的转换工具来进行转换。 4. 创建3D Tiles索引:生成3D Tiles文件后,需要创建一个3D Tiles索引文件,用于指示数据的层级、边界和相对位置等信息。这些信息可以让GIS应用程序在加载和渲染3D Tiles数据时进行优化。 5. 部署到GIS平台:最后,将生成3D Tiles文件和索引文件部署到适当的GIS平台上。这些平台可以是虚拟地球软件(如Cesium)、GIS服务器或其他支持3D Tiles的应用程序。 通过将gltf转换为3D Tiles,我们可以更好地利用已有的3D模型数据,并在GIS中进行高效的空间分析和可视化。这种转换可以帮助我们更好地理解和展示地理数据,从而支持决策制定和规划等应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值