一、基本介绍
前端中的三维技术主要有以下几种:
WebGL:WebGL是一种基于OpenGL ES 2.0标准的3D图形渲染技术,它能够在Web浏览器中呈现出高性能、交互式的3D视觉效果。
Three.js:Three.js是一个轻量级的JavaScript库,它为WebGL提供了更高层次的抽象,使得使用WebGL变得更加容易。通过Three.js,开发者可以快速创建3D场景和交互应用程序。
A-Frame:A-Frame是一个基于WebVR的框架,它允许开发者使用HTML编写虚拟现实(VR)场景,同时可以利用WebGL和Web Audio API来增强体验。
除此之外,还有一些其他的前端三维技术,例如Babylon.js和Cesium等。这些技术都可以帮助开发者创建出更加生动、逼真的3D图像和交互体验。
二、Cesium框架
这篇博客重点是讲解cesium框架,Cesium是一个基于WebGL的开源3D地球可视化引擎,它可以在现代浏览器中实现高性能、交互式的3D地球可视化效果。Cesium支持矢量和栅格数据的可视化,包括地形、气象、遥感等多种类型的数据。
Cesium具有以下几个特点:
支持全球范围内的数据可视化:Cesium可以将全球范围内的数据以高性能的方式呈现出来,并提供了丰富的交互功能,例如缩放、旋转、漫游等操作。
开放式的插件接口:Cesium提供了丰富的插件接口,让开发者可以轻松扩展和定制其功能。
多平台支持:Cesium不仅可以在桌面端使用,还可以在移动设备上运行,并支持主流的Web浏览器。
易用性:Cesium提供了丰富的示例和API文档,使得开发者可以快速上手,并快速构建自己的3D地球可视化应用程序。
Cesium被广泛应用于GIS(地理信息系统)、游戏、虚拟现实等领域,并且已经得到了众多商业机构和组织的采用。
三、Cesium框架在Vue中的使用
这里主要讲解如何在vue中的使用,如果只是在普通H5原生项目中使用的话,通常只需要引入相关的cdn路径,或者下载相关的静态文件便可,但是在Vue中我们可以对其进行简单的封装,让项目的规范性和工程的复用性和封装更优。
1.使用包管理工具下载cesium
提示:如果出现莫名其妙的node_module报错,那可能是版本问题,可以尝试下载其他版本。例如我用了若依后台使用1.104版本则出现了兼容问题。
npm install cesium
2.找到node_module中的cesium文件夹,把Assets,ThridPart,Widgets,Workers四个文件夹复制到public文件夹下面
3.main.js中引入css样式,引入Widgets中的widgets.css
4.可以封装一个使用cesium的js文件。
import * as Cesium from 'cesium'
Cesium.Ion.defaultA***essToken ="token"; //这里的token是自己申请的token
window.CESIUM_BASE_URL = "/";
class mMap{
constructor(id){
this.id = id; //地图容器
this.viewer = null;
this.scene = null;
}
//初始化地图
initMap(){
console.log(this.id)
this.viewer = new Cesium.Viewer(this.id,{
geocoder: false, //是否显示地名查找控件
sceneModePicker: false, //是否显示投影方式控件
navigationHelpButton: false, //是否显示帮助信息控件
baseLayerPicker: false, //是否显示图层选择控件
homeButton: false, //是否显示Home按钮
fullscreenButton: false, //是否显示全屏按钮
animation: false, //左下角的动画控件的显示
shouldAnimate: false, //控制模型动画
timeline: false, //底部的时间轴
selectionIndicator: false,
infoBox: false
});
//定位到指定位置
this.viewer.camera.flyTo({
destination : Cesium.Cartesian3.fromDegrees(112.876942, 28.235312, 1500.0)
});
//去cesium logo水印 或 css
this.viewer.cesiumWidget.creditContainer.style.display = "none";
//创建场景
this.scene = this.viewer.scene;
if(!this.scene.pickPositionSupported){
window.alert("此浏览器不支持拾取位置!")
}
this.handler = new Cesium.ScreenSpaceEventHandler(this.scene.canvas);
}
}
export function createMap(id){
window.map = new mMap(id)
}
四、Cesium的简单使用
1.加载立体的地形,很简单,只需要在初始化的配置中添加:terrainProvider: Cesium.createWorldTerrain()。表示加入地形支持。
this.viewer = new Cesium.Viewer(this.id, {
geocoder: true, //是否显示地名查找控件
sceneModePicker: false, //是否显示投影方式控件
navigationHelpButton: false, //是否显示帮助信息控件
baseLayerPicker: false, //是否显示图层选择控件
homeButton: false, //是否显示Home按钮
fullscreenButton: false, //是否显示全屏按钮
animation: false, //左下角的动画控件的显示
shouldAnimate: false, //控制模型动画
timeline: false, //底部的时间轴
selectionIndicator: false,
infoBox: false,
terrainProvider: Cesium.createWorldTerrain()
});
2.添加点位,并且给点位添加一些事件。
//添加点位
let entity = new Cesium.Entity({
id: 'flyTmp',
position: Cesium.Cartesian3.fromDegrees(112.876942, 28.235312, 5800.0),
point: {
pixelSize: 20,
color: Cesium.Color.RED.withAlpha(0.9),
outlineColor: Cesium.Color.RED.withAlpha(0.9),
outlineWidth: 1,
disableDepthTestDistance: Number.POSITIVE_INFINITY,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
}
});
// 为实体对象添加click事件
entity.clickable = true;
entity.description = '点位信息';
this.viewer.entities.add(entity);
this.handler = new Cesium.ScreenSpaceEventHandler(this.scene.canvas);
let self = this
this.handler.setInputAction(function (movement) {
var pickedObject = self.viewer.scene.pick(movement.position);
if (Cesium.defined(pickedObject) && pickedObject.id === entity) {
console.log('你点击了点位:', pickedObject);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
// 添加一个带有图标的3d点位
let iconEntity = new Cesium.Entity({
id: 'iconEntity',
position: Cesium.Cartesian3.fromDegrees(112.876942, 28.235312, 5800.0),
billboard: {
image: logo,
scale: 0.5,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
}
});
// 为实体对象添加click事件
iconEntity.clickable = true;
iconEntity.description = '点位信息';
this.viewer.entities.add(iconEntity);
this.handler.setInputAction(function (movement) {
var pickedObject = self.viewer.scene.pick(movement.position);
if (Cesium.defined(pickedObject) && pickedObject.id === iconEntity) {
// 点击实体之后,需要有一些动画,实现动画
self.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(112.876942, 28.235312, 3000.0),
duration: 2,
});
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)