当前位置: 首页 > news >正文

使用Cesium.js加载3D模型

最近项目中用到室外三维模型与室内三维地图交互,室外三维模型的加载我们采用了cesium js来实现,在使用的过程中遇到了许多的问题,闲暇之余将其实现及遇到的问题记录下来,以备将来再用到时少走弯路。
一、开发环境准备
1、下载cesium js
cesium js 下载地址 https://github.com/AnalyticalGraphicsInc/cesium/releases
这里写图片描述
下载完成解压后的目录如下图
这里写图片描述
2.打开cmd命令行进入到cesium的安装目录,执行npm install(需要安装nodejs及npm),该命令执行完会在cesium根目录下创建node_modules目录,如下图
这里写图片描述
这里写图片描述
安装gulp作为项目开发的依赖,如下图
这里写图片描述
gulp安装之后会在node_modules目录中创建执行gulp命令所需要的依赖包,如下图
这里写图片描述
3.下载mds max插件OpenCOLLADA Tools,下载地址
https://github.com/KhronosGroup/OpenCOLLADA/wiki/OpenCOLLADA-Tools(根据系统要求下载32位或64位)。
4.下载collada2gltf 工具,下载地址https://github.com/KhronosGroup/glTF/releases,此工具用来将dae格式文件转换为gltf格式,下载完解压后的目录如下图
这里写图片描述
二、编译cesiumjs
在cesium根目录执行gulp default命令,将会在cesiumjs安装的根目录创建一个Build文件夹,里面包含的是编译后生成的cesium.js文件及相关组件。
这里写图片描述
这里写图片描述
编译后的Build目录包含小部件、第三方依赖库及离线地图数据等
这里写图片描述
三、用cesium js库开发,加载三维模型
1.将Build目录中的所有文件及目录拷贝到项目中
这里写图片描述
2.将3ds max中的三维模型数据导出成dae格式,如图
这里写图片描述
这里写图片描述
导出的类型需要选择OpenCollada(*.dae),如果导出的模型存在透明贴图,导出时不要勾选相对路径,导出后会生成一个images目录,该目录中的图片是模型中所需要的贴图及纹理图。
这里写图片描述
3.将dae格式文件转换成gltf文件,打CMD命令行,进入到collada2gltf的根目录,执行collada2gltf.exe -f E:\xykjc\Model\zhulou.dae -e,
-f表示dae文件的完成路径,collada2gltf支持两种转换方式,-e及-o,-e转换后只生成一个文件(gltf文件),在模型比较大时我们可将模型与纹理贴图分开加载,这时可用-o命令进行转换,转换后会生成.gltf、.bin及.glsl三种格式的文件(注意:在max中导出模型时不能选择相对路径,如果选中了相对路径,-o转换的gltf模型文件加载出来会变成黑色)
这里写图片描述
4.将生成gltf文件及纹理贴图拷贝到项目中
这里写图片描述
5.导入cesium.js及widgets.css
这里写图片描述
//创建cesium Viewer
viewer = new Cesium.Viewer(‘cesiumContainer’,{
//是否创建动画小器件,左下角仪表
animation:false,
//是否显示图层选择器
baseLayerPicker:false,
//是否显示全屏按钮
fullscreenButton:false,
//是否显示geocoder小器件,右上角查询按钮
geocoder:false,
//是否显示Home按钮
homeButton:false,
//是否显示信息框
infoBox : false,
//是否显示3D/2D选择器
sceneModePicker:false,
//是否显示选取指示器组件
selectionIndicator : false ,
//是否显示时间轴
timeline:false,
//是否显示右上角的帮助按钮
navigationHelpButton:false,
//如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
scene3DOnly : true,
navigationInstructionsInitiallyVisible:false,
showRenderLoopErrors:false,
//加载自定义地图瓦片需要指定一个自定义图片服务器 例如指定OpenStreetMapImagerProvider
//URL 为瓦片数据服务器地址
imageryProvider : new Cesium.OpenStreetMapImageryProvider({
url : ‘//a.tile.openstreetmap.org/’
})
/* targetFrameRate:1,sceneMode:Cesium.SceneMode.SCENE2D,
imageryProvider:new Cesium.WebMapServiceImageryProvider(),
mapProjection : new Cesium.WebMercatorProjection() */
});

/**
*创建模型entity,加载gltf文件
*@id 模型ID
*@url 3d模型URL路径
*@height 高度
*@lon 模型所在经度
*@lat 模型所在纬度
**/
function createModel(id,url,height,lon,lat){
//删除视图上所有的实体
//viewer.entities.removeAll();
//实体的位置(经度、纬度、)
var position = Cesium.Cartesian3.fromDegrees(lon, lat, height);
var heading = Cesium.Math.toRadians(0);
var pitch = Cesium.Math.toRadians(0.0);
var roll = 0.0;
var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, heading, pitch, roll);
var entity = viewer.entities.add({
id:id,
//coordinates : rectangle,
fill : false,
outline : true,
outlineColor : Cesium.Color.WHITE,
name : url,
position : position,
orientation : orientation,
model : {
uri : url,
//minimumPixelSize : 100,
maximumScale : 20000
}
});
//viewer.trackedEntity = entity;
return entity;
}

viewer.entities.removeAll();
//地面
createModel(‘ground’,’ModelData/zhulou.gltf’,0,112.226923,32.138933);
在html的body标签中添加<div id="cesiumContainer"></div>
运行的效果图如下
这里写图片描述

参考资料
http://www.zhiwenli.com/wordpress/?p=294
https://blog.gmem.cc/cesium-study-note
http://blog.csdn.net/l491453302/article/details/46766909
http://cesiumjs.org/

                                            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/production/markdown_views-68a8aad09e.css">
                                </div>

相关文章:

  • js中for in与for of之间的差异
  • Cesium实现三维可视化一般步骤
  • Vue2.0 探索之路——生命周期和钩子函数的一些理解
  • vuejs实践todolist列表
  • vue中的watch监听事件机制
  • CommonJS、AMD、CMD的区别
  • npm局部安装和全局安装文件的区别
  • querySelector操作dom的用法
  • webpack打包文件出错
  • npm中的--save-dev与--save的区别
  • vue-router路由导航钩子
  • javascript本地上传并解析excel文件
  • echarts柱状图的x轴文字纵向显示
  • ajax实现跨域请求的几种方式--前端
  • css3-单位px与vw,rem的区别
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • android图片蒙层
  • Invalidate和postInvalidate的区别
  • IP路由与转发
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 基础知识 - 入门篇(一)
  • javascript从右向左截取指定位数字符的3种方法
  • Object.assign方法不能实现深复制
  • Objective-C 中关联引用的概念
  • React-生命周期杂记
  • SwizzleMethod 黑魔法
  • vue的全局变量和全局拦截请求器
  • 给初学者:JavaScript 中数组操作注意点
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 使用agvtool更改app version/build
  • 算法系列——算法入门之递归分而治之思想的实现
  • 优化 Vue 项目编译文件大小
  • Java数据解析之JSON
  • MyCAT水平分库
  • 从如何停掉 Promise 链说起
  • ​Spring Boot 分片上传文件
  • "无招胜有招"nbsp;史上最全的互…
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (笔试题)分解质因式
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (论文阅读11/100)Fast R-CNN
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转) ns2/nam与nam实现相关的文件
  • (转)我也是一只IT小小鸟
  • .net core Swagger 过滤部分Api
  • .NET 中让 Task 支持带超时的异步等待
  • .NET中的Exception处理(C#)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @Data注解的作用
  • @Responsebody与@RequestBody
  • @Transactional 详解
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [20160807][系统设计的三次迭代]