JOO97 / learn-cesium

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CesiumJS

Learning Paths

  1. cesium api

![image-20240120195610510](/Users/joo/Library/Application Support/typora-user-images/image-20240120195610510.png)

  1. create a demo or webGL
  2. cesium source code
  3. cesium with threejs and babylon.js
  4. ...

Repo

  1. learn-cesium
  2. learn-cesium-source-code
  3. cesium-xiamen-app: basic demo

🗓️TODO

  1. 封装高德地图/天地图...imageryProvider

📄Doc

  1. 中文doc

    http://cesium.xin/cesium/cn/Documentation1.62/index.html

🔗Blog

  1. https://www.cnblogs.com/telwanggs/p/11124237.html
  2. http://marsgis.cn/doc/study-cesium.pdf
  3. https://www.cnblogs.com/fuckgiser/p/5706842.html

📚 Course

  1. https://www.bilibili.com/video/BV12g411U7Us/?spm_id_from=333.999.0.0&vd_source=35abcff391e951c0b56e70fd7f32e2dc
  2. https://ke.qq.com/course/468292#term_id=100560563

💻Repo

  1. https://github.com/YanzheZhang/Cesium.HPUZYZ.Demo

🔠Keywords

  1. STK地形服务

STK(Systems Tool Kit)地形服务是由 Analytical Graphics, Inc.(AGI)提供的一种地形服务解决方案,它支持高精度和高解析度的全球地形数据。在地理空间应用和仿真中,STK地形服务常被用来提供精确的地形模型,以支持各种分析和可视化需求。

  1. TIN网格

TIN(Triangulated Irregular Network)网格是一种用于表示三维地理空间数据的方法。它通过连接不规则分布的点来形成三角形网格,从而构建出地表的三维模型。TIN 网格在地理信息系统(GIS)中广泛应用,特别是在地形建模和分析中。

  1. ICRF

ICRF(International Celestial Reference Frame,国际天球参考框架)是用于描述天体相对于远处恒星的固定坐标系统。它常用于精确的天文观测和空间导航,特别是在模拟卫星轨道和太空任务时。

图形学

抗锯齿

MSAA

多重采样抗锯齿 Multisampling Antialising

Concept

Viewer

var viewer = new Cesium.Viewer('cesiumContainer', {
	scene3DOnly: true,
	selectionIndicator: false,
	baseLayerPicker: false,
});

坐标系

岁差章动计算(XYs):

  1. https://github.com/CesiumGS/EarthKAMExplorer/tree/master/Cesium/Assets/IAU2006_XYS
  2. https://blog.csdn.net/u011575168/article/details/108290011
  3. http://cesium.xin/cesium/en/Documentationb28/Iau2006XysData.html

坐标类型

cesium中坐标系统分为地理坐标、世界坐标(X,Y,Z)、屏幕坐标三种。

采用右手系

blog: https://zhuanlan.zhihu.com/p/334540571

  1. 屏幕坐标: 二维的笛卡尔坐标系,Cartesian2
  • image-20231123110408720
  1. 地理坐标: 经度,纬度,高度, WGS-84坐标系 Cartographic(角度、弧度两种表达方式)

  2. 笛卡尔空间直角坐标系: 世界坐标(x,y,z), 采用右手系, Cartesian3

image-20231123110321285

  1. **局部坐标

blog:

  1. https://blog.csdn.net/weixin_45782925/article/details/123365834
  2. https://www.zhoulujun.cn/html/theory/Mathematics/Geometry/8330.html

Cesium.Transforms.eastNorthUpToFixedFrame

eastNorthUp 对应 x,y,z

//绕点旋转示例
	const center = Cesium.Cartesian3.fromRadians(
		2.4213211833389243,
		0.6171926869414084,
		3626.0426275055174
	);
//创建矩阵
	const transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);
	viewer.scene.camera.lookAtTransform(
		transform,
		new Cesium.HeadingPitchRange(0, -Math.PI / 4, 2900)
	);
	// Orbit this point
	viewer.clock.onTick.addEventListener(function (clock) {
		viewer.scene.camera.rotateRight(0.005);
	});

坐标转换

blog: https://zhuanlan.zhihu.com/p/522245835?utm_id=0

  1. 角度与弧度互转

角度=弧度×180/π

弧度=角度×π/180

	//弧度转角度
	const degrees = Cesium.Math.toDegrees(Math.PI / 2); //90度
	//角度转弧度
	const radians = Cesium.Math.toRadians(180); //Math.PI

sp20231122_174523_685

  1. 地理经纬度转地理弧度
//#1
	const lngLat = [118, 24];
	const longitude = Cesium.Math.toRadians(lngLat[0]);
	const latitude = Cesium.Math.toRadians(lngLat[1]);
	const height = 200;
	//NOTE: Cartographic-弧度制的经纬度,入参也为弧度制
	const cartographic = new Cesium.Cartographic(longitude, latitude, height);
	//#2
	var cartographic2 = Cesium.Cartographic.fromDegrees(lngLat[0], lngLat[1], height);
	// console.log('lngLat to cartographic', cartographic, longitude, latitude, cartographic2);
	//#3
	var cartographic3 = Cesium.Cartographic.fromRadians(longitude, latitude, height); //longitude和latitude为弧度
  1. 经纬度转世界坐标(笛卡尔)
	function lngLatToCartesian(lng, lat, h) {
		//直接转换
		var cartesian3 = Cesium.Cartesian3.fromDegrees(lngLat[0], lngLat[1], h);
		// const cartesian3 = Cesium.Cartesian3.fromDegrees(118, 24);
		// const cartesian3s = Cesium.Cartesian3.fromDegreesArray([118, 24, 119, 24]);
		// const cartesian3sWithHeight = Cesium.Cartesian3.fromDegreesArrayHeights([
		// 	118, 24, 100, 119, 24, 200,
		// ]);
		//弧度转笛卡尔
		//Cesium.Cartesian3.fromRadians, Cesium.Cartesian3.fromRadiansArray, Cesium.Cartesian3.fromRadiansArrayHeights

		//先转弧度后转笛卡尔
		//var cartographic = Cesium.Cartographic.fromDegrees(lng, lat, height); //单位:度,度,米
		//var ellipsoid=viewer.scene.globe.ellipsoid;
		//var cartesian3 = ellipsoid.cartographicToCartesian(cartographic);
		return cartesian3;
	}
  1. 世界坐标(笛卡尔)转经纬度
	function cart3ToLngLat(cartesian3) {
		var ellipsoid = viewer.scene.globe.ellipsoid;
		//先转换为弧度,再由弧度转化为经纬度
		const cartograhphic = ellipsoid.cartesianToCartographic(cartesian3);

		var lat = Cesium.Math.toDegrees(cartograhphic.latitude);
		var lng = Cesium.Math.toDegrees(cartograhphic.longitude);
		var height = cartographic.height;

		return [lng, lat, height];
	}
  1. 世界坐标(笛卡尔)转屏幕坐标
const cartesian3 = Cesium.Cartesian3.fromDegrees(112,24)
const cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian3)
  1. 屏幕坐标转世界坐标(笛卡尔)
const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
handler.setInputAction(event => {
  const screenPos = event.position //屏幕坐标
  /* 1 获取地球表面的世界坐标,包含地形,不包含其他模型 */
	viewer.scene.globe.depthTestAgainstTerrain = true; /* NOTE: 开启深度检测 */
  const ray = viewer.camera.getPickRay(screenPos) 
 
  const pickedPos2 = viewer.scene.globe.pick(ray, viewer.scene);
  /* 2 获取参考椭球的世界坐标 */
  const pickedPos3 = viewer.scene.camera.pickEllipsoid(
			event.position,
			viewer.scene.globe.ellipsoid
		);
  /* 3 获取包含了地形、倾斜摄影表面、模型的世界坐标 */
	const pickedPos = viewer.scene.pickPosition(event.position);
	if (Cesium.defined(pickedPos)) {
			console.log('======pickedPos', pickedPos);
	}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK)

拾取方法

blog:

  1. https://zhuanlan.zhihu.com/p/623421312?utm_id=0
  2. https://blog.csdn.net/happy81997/article/details/129242772
const pickHandler = (viewer) => {
	const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
	handler.setInputAction((event) => {
		const screenPos = event.position;

		/**
		 * 1 viewer.scene.pick()
		 * 通过坐标位置,拾取实体(Entity),图元(Primitive),3DTiles对象,返回的是scene中指定位置最上层的对象。例如点击获取
		 * Entity的pick对象,通过pick.id可以拾取当前的entity对象。拾取后,可以用于改变对象的属性参数,如颜色,图片等。
		 * 只能获取一个对象,并且是最顶部的对象。如果拾取点没有对象,则会返回undefined
		 */
		const pick = viewer.scene.pick(screenPos);
		console.log('pick()', pick);
		if (Cesium.defined(pick)) {
			// pick.id.billboard.image = '......'; // 修改拾取到的entity的样式
		}

		/**
		 * 2 viewer.scene.pickPosition()
		 * 获取包含了地形、倾斜摄影表面、模型的世界坐标
		 * 拾取对应位置的Cartesian3,适用于模型表面位置的选取,拾取三维物体的坐标等。
		 */
		const pickPosition = viewer.scene.pickPosition(screenPos);
		if (Cesium.defined(pickPosition)) {
			console.log('======pickPosition', pickPosition);
		}

		/**
		 * 3 viewer.scene.globe.pick
		 * 返回一个射线(ray)和地球表面的一个交点的Cartesian3坐标。
		 * 一般用于获取加载地形后的经纬度和高程,不包括模型、倾斜摄影等表面高度。
		 */
		const ray = viewer.camera.getPickRay(screenPos);
		/* NOTE: 开启深度检测 */
		viewer.scene.globe.depthTestAgainstTerrain = true;
		const pickedPos2 = viewer.scene.globe.pick(ray, viewer.scene);
		console.log('=====pickedPos2', pickedPos2);

		/**
		 * 4 获取参考椭球的世界坐标
		 * 返回相机视角下鼠标点击的对应椭球面位置。接收屏幕坐标,返回Cartesian3坐标。适用裸球表面的选取,是基于数学模型的椭圆球体。
		 * 在有地形的情况下误差较大,在使用时需要关闭深度测试。
		 */
		const pickedPos3 = viewer.scene.camera.pickEllipsoid(screenPos, viewer.scene.globe.ellipsoid);
		console.log('=====pickedPos3', pickedPos3);

		/**
		 * 5 拾取图层
		 */
		let ImageryLayerFeatures = viewer.imageryLayers.pickImageryLayerFeatures(ray, viewer.scene);
		if (!Cesium.defined(ImageryLayerFeatures)) {
			console.log('没有影像图层要素信息选中');
		} else {
			Cesium.when(ImageryLayerFeatures, function (LayerFeatures) {
				//获取到图层数据
				if (LayerFeatures.length > 0) {
					console.log('获取到图层数据', LayerFeatures);
				}
			});
		}
	}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
};

矩阵[TODO]

blog: https://www.seekstack.cn/post/780

  • Cesium.Cartesian3(相当于Point3D)
  • Cesium.Matrix3(3x3矩阵,用于描述旋转变换)
  • Cesium.Matrix4(4x4矩阵,用于描述旋转加平移变换)
  • Cesium.Quaternion(四元数,用于描述围绕某个向量旋转一定角度的变换)
  • Cesium.Transforms(包含将位置转换为各种参考系的功能)

Viewer

steps:

new Cesium.Viewer(container, options)

=>

  • create container

  • new CesiumWidget(container, options)

    =>

    • new Scene(options)

      =>

      • setup mapProjection
      • new Camera()
    • Set the globe to scene: new Globe()

    • Set the base imagery layer to scene

    • Set the terrain provider to scene

    • render by ellipsoid info

  • ...other widgets

在这里插入图片描述

Scene

  1. 基础地理环境设置 如地球参数(globe)、光照(light)、雾(fog)、大气(skyAtmosphere)
  2. 图层
  3. 场景数据
  4. 交互:相机、pick...

在这里插入图片描述

Imagery

blog: https://zhuanlan.zhihu.com/p/340669216

ImageryLayer
  1. create imagerLayer
  2. viewer.scene.imageryLayers.add(imageryLayer)
  • 从ImageryLayer创建

    const provider = new Cesium.XXXImageryProvider()
    const imagery = new Cesium.ImageryLayer(provider)
    viewer.scene.imageryLayers.add(imagery)
  • cesium默认地底图 Cesium.ImageryLayer.fromWorldImagery()

  • 异步创建 Cesium.ImageryLayer.fromProviderAsync

    • Cesion Ion
    Cesium.ImageryLayer.fromProviderAsync(        Cesium.IonImageryProvider.fromAssetId(4))
ImageryProvider

抽象基类

核心方法和属性

  • requestImage(x, y, level):请求指定级别和坐标的地图瓦片。
  • rectangle:表示该影像提供者覆盖的地理区域。
  • tileWidthtileHeight:瓦片的宽度和高度。
  • minimumLevelmaximumLevel:支持的最小和最大缩放级别。
  • getTileCredits(x, y, level):获取加载特定瓦片时所需的版权信息或其他信用信息。
  1. ArcGisMapServerImageryProvider: 用于从 ArcGIS Server 加载地图服务。
Cesium.ArcGisMapService.defaultAccessToken = ACCESS_TOKEN.ArcGis;

const arcGisBaseMap = Cesium.ArcGisMapServerImageryProvider.fromBasemapType(
		Cesium.ArcGisBaseMapType.OCEANS
	);
	layer.add(Cesium.ImageryLayer.fromProviderAsync(arcGisBaseMap));
	const arcGisFromUrl = await Cesium.ArcGisMapServerImageryProvider.fromUrl(
		'https://ibasemaps-api.arcgis.com/arcgis/rest/services/World_Imagery/MapServer',
		{
			token: ACCESS_TOKEN.ArcGis,
		}
	);
layer.add(Cesium.ImageryLayer.fromProviderAsync(arcGisFromUrl));
  1. BingMapsImageryProvider: 从 Bing Maps 获取影像图层。

  2. OpenStreetMapImageryProvider

  3. GoogleEarthEnterpriseImageryProvider: 用于加载 Google Earth 企业服务器的影像数据。

  4. SingleTileImageryProvider: 用于加载单个图片作为影像图层

  5. TileMapServiceImageryProvider: tms,加载离线瓦片

  6. GridImageryProvider (经纬度网格图层)和 TileCoordinatesImageryProvider(瓦片坐标图层)

  7. WebMapServiceImageryProvider (WMS): 用于加载符合 WMS 标准的服务。

  8. ‼️WebMapTileServiceImageryProvider (WMTS): 用于加载符合 WMTS 标准的瓦片服务。

  9. UrlTemplateImageryProvider: 通过 URL 模板从自定义服务加载影像。

tilingScheme

用于定义如何将球体或椭球体的表面分割为瓦片(tiles)

const aMap = new Cesium.UrlTemplateImageryProvider({
		url: 'http://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
		maximumLevel: 18,
		minimumLevel: 1,
		credit: 'Amap',
		//NOTE: 需要转换坐标系
		tilingScheme: new GCJ02TilingScheme(),
		proxy: '/proxy/',
	});
  • GeographicTilingScheme

    用于创建基于地理坐标系统(经度和纬度)的瓦片

  • WebMercatorTilingScheme

    用于创建基于 Web Mercator 投影的瓦片,这是许多在线地图服务(如 Google Maps 和 Bing Maps)使用的标准

  • 自定义TilingScheme

GCJ02TilingScheme extends WebMercatorTilingScheme

ImageryLayerCollection

Cesium.ImageryLayerCollection类是ImageryLayer类对象的容器,它可以装载、放置多个ImageryLayer或ImageryProvider类对象,而且它内部放置的ImageryLayer或ImageryProvider类对象是有序的

viewer.scene.imageryLayers:ImageryLayerCollection

![image-20240121204201356](/Users/joo/Library/Application Support/typora-user-images/image-20240121204201356.png)

const viewer = new Cesium Viewer(...)
const imageryLayerCollection = viewer.scene.imageryLayers;                          

Terrain

Terrain 是指地球表面的三维地形,而 TerrainData 是这些地形在特定区域的具体数据表示。TerrainDataTerrain 提供了必要的详细信息,使得 CesiumJS 能够渲染出真实的三维地形。

Cesium.Terrain

地形数据本身

const terrain = new Cesium Terrain(terrainProviderPromise)
viewer.scene.setTerrain(terrain)
  • 世界地形 Cesium.Terrain.fromWorldTerrain(options)
Cesium.TerrainProvider

抽象基类

负责每一个Tile对应的地形数据的构建

地形图层只能有一个

  • Cesium.CesiumTerrainProvider

    从 Cesium Ion 或兼容的服务器加载量化网格地形(Quantized Mesh Terrain)数据

    使用了 STK 提供的地形服务

  • Cesium.ArcGISTiledElevationTerrainProvider

    arcgis提供的高度图

    不支持法线,水面,但可以选择TileScheme

const terrainProvider = await Cesium.ArcGISTiledElevationTerrainProvider.fromUrl(
		'https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer',
		{
			token: ACCESS_TOKEN.ArcGis,
		}
	);
	viewer.terrainProvider = terrainProvider;
  • Cesium.GoogleEarthEnterpriseTerrainProvider

  • Cesium.EllipsoidTerrainProvider 以光滑、规则的椭球形状来代表地球表面, 不带地形信息

    tileScheme默认使用GeographicTilingScheme

  • Cesium.VRTheWorldTerrainProvider

Cesium.TerrainData

抽象基类

TerrainProvider提供TerrainData

  • Cesium.QuantizedMeshTerrainData 量化网格地形
    • 定义QuantizedMeshTerrainData 表示一种量化网格地形数据,这种数据格式主要用于表示复杂的地形。
    • 数据结构:在量化网格格式中,地形被表示为一系列相互连接的三角形。这些三角形的顶点位置是量化的,以减少所需的存储空间。
    • 特点:量化网格格式适用于高精度和高变化率的地形,如山脉或峡谷。它能够更精确地渲染地形的细微变化。
    • 使用场景:当需要渲染高度详细和不规则的地形时,QuantizedMeshTerrainData 是更合适的选择。
    • 文件类型:量化网格地形通常存储为特定的文件类型,如 .terrain,这是一种针对地形数据的二进制格式。
  • Cesium.HeightmapTerrainData 高程图地形
    • 定义HeightmapTerrainData 表示一种基于高程图的地形数据。高程图是一种更简单的表示方式,它使用一个二维数组来存储地形的高程信息。
    • 数据结构:在高程图格式中,每个数组元素代表一个网格点的高程值。这些点通常以规则的网格排列。
    • 特点:高程图格式相对简单,易于处理和理解。它适用于相对平坦或变化不大的地形。
    • 使用场景:对于不需要高度复杂地形的应用,如显示大范围平缓地区的地形,HeightmapTerrainData 是一个合适的选择。
    • 文件类型:高程图数据可以存储在多种文件类型中,常见的如图片格式(PNG, JPG)或二进制格网格式。
  • Cesium.GoogleEarthEnterpriseTerrainData Google Earth Enterprise 地形数据
sampleTerrain

查询指定位置指定等级的高程信息

// 定义查询的位置(经纬度坐标)
	var positions = [
		Cesium.Cartographic.fromDegrees(114.0, 38.0),
		Cesium.Cartographic.fromDegrees(115.0, 39.0),
	];
	// 查询地形高程
	Cesium.sampleTerrain(terrainProvider, 11, positions).then(function (updatedPositions) {
		// 使用查询结果
		for (var i = 0; i < updatedPositions.length; ++i) {
			console.log('位置 ' + i + ' 的高程:' + updatedPositions[i].height);
		}
	});
sampleTerrainMostDetailed

查询地形提供者(TerrainProvider)提供的最详细等级

Cesium.sampleTerrainMostDetailed(terrainProvider, positions).then(function (updatedPositions) {
		// 使用查询结果
		for (var i = 0; i < updatedPositions.length; ++i) {
			console.log('sampleTerrainMostDetailed 位置 ' + i + ' 的高程:' + updatedPositions[i].height);
		}
	});

DataSource

Cesium.DataSource

抽象基类

  • 数据源类型:Cesium 提供了多种数据源类型,每种类型对应不同的数据格式或数据服务。例如,GeoJsonDataSource 用于加载 GeoJSON 数据,KmlDataSource 用于加载 KML 数据。
  • 实体(Entity):数据源中的数据项通常被表示为“实体”(Entity)。一个实体可以是一个点、线、多边形、模型或其他图形对象,具有位置、外观和行为等属性。
  • Cesium.GeoJsonDataSource: 加载geojson/topojson

  • Cesium.KmlDataSource

    加载kml/kmz

  • Cesium.CzmlDataSource 加载ceisum的czml数据

viewer.dataSources.add(Cesium.CzmlDataSource.load(url)).then((dataSource) => {viewer.flyTo(dataSource.entities);
	});
  • Cesium.GpxDataSource 加载gps设备记录的数据(.gpx)
  • Cesium.CustomDataSource 自定义数据源
const dataSource = new Cesium.CustomDataSource('joo');
	dataSource.entities.add({
		position: Cesium.Cartesian3.fromDegrees(122, 29, 0),
		billboard: {
			image: '/SampleData/fire.png',
		},
	});
	dataSources.add(dataSource);
	viewer.flyTo(dataSource.entities);
DataSourceDisplay

是一个核心组件,负责管理和渲染来自各种数据源(如 GeoJSON, KML, CZML 等)的实体(Entity)。DataSourceDisplay 将数据源中的原始数据转换成可视化的图形,并确保它们正确地显示在 CesiumJS 场景(Scene)中。

一般不直接调用

DataSourceClock

用于表示与特定数据源相关联的时间设置。这个对象定义了如何根据时间动态显示数据源中的内容,比如 CZML 中的动态实体。DataSourceClock 通常包含关于开始时间、结束时间、当前时间和时钟速率的信息。

Cesium.DataSourceCollection

DataSource集合

[TODO]

KML
  • Cesium.KmlTour
  • Cesium.KmlTourFlyTo
  • Cesium.KmlTourWait
CZML

CZML是一种JSON格式的字符串,用于描述与时间有关的动画场景,CZML包含点、线、地标、模型和其他的一些图形元素,并指明了这些元素如何随时间而变化。

Cesium和CZML的关系就像Google Earth和KML的关系

doc

  1. https://github.com/AnalyticalGraphicsInc/czml-writer/wiki/Packet
  2. https://github.com/AnalyticalGraphicsInc/czml-writer/wiki/CZML-Structure

Camere

HeadingPitchRoll

heading: 偏航(yaw),绕y轴

pitch: 俯仰角,绕x轴

roll: 滚动,绕z轴

img

roll(滚转)

图元

图元是Cesium用来绘制三维对象的一个独立的结构。图元类有:Globe、Model、Primitive、BillboardCollection、ViewportQuad等。

Globe绘制的是全球地形,它需要两个东西,一个是地形高程信息,另外一个是影像图层,也就是地球的表皮。影像图层可以叠加多个,但是地形高程只能有一个。整个地形的绘制也是渐进式的,即视线看到的地方才会去调度相关的地形高程信息,找到对应位置的地形影像贴上。然而Globe只是一个图元。由此可见一个图元可以相当复杂。

需要注意的地方:

图元没有基类,但是所有的图元都会有update函数; Primitive类直译过来是图元的意思,但是它不是基类,只是图元的一种,起作用是用来绘制各种几何体。

在这里插入图片描述

Ellipsoid

椭球体

new Cesium.Ellipsoid(x, y, z)

  • Cesium.Ellipsoid.WGS84 : WGS84 标准的 Ellipsoid 实例
  • Cesium.Ellipsoid.MOON: 月球
  • Cesium.Ellipsoid.UNIT_SPHERE: 初始化为 (1.0, 1.0, 1.0) 的半径
  • Cesium.Ellipsoid.packedLength:椭球体数据的二进制数据长度

Performance

@see https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/

RequestRenderMode 请求渲染模式

viewer.scene.render() 显式渲染

3d tiles

Model

倾斜摄影模型格式

blog: https://zhuanlan.zhihu.com/p/632120916

Engine

JulianDate

Widgets

Geocoder : 一种地理位置搜索工具,用于显示相机访问的地理位置。默认使用微软的 Bing 地图。 HomeButton : 首页位置,点击之后将视图跳转到默认视角。 SceneModePicker : 切换 2D、3D 和 Columbus View (CV) 模式。 BaseLayerPicker : 选择三维数字地球的底图(imagery and terrain)。 NavigationHelpButton : 帮助提示,如何操作数字地球。 Animation :控制视窗动画的播放速度。 CreditsDisplay : 展示商标版权和数据源。 Timeline : 展示当前时间和允许用户在进度条上拖动到任何一个指定的时间。 FullscreenButton : 视察全屏按钮。

Timeline

Entity

Primitive

Steps:

  1. 创建几何(geometry)
  2. 创建几何实例(GeometryInstance): geometry
  3. 创建图元(Primitive): geometryInstances 、appearance

Geometry

polyline

  1. PolylineGeometry(折线几何体)
  2. SimplePolylineGeometry(以线带(line strip)形式建模的折线):
  3. GroundPolylineGeometry(贴地折线几何体):
  4. ...

vertexFormat

用于指定折线几何体的顶点格式。顶点格式定义了每个顶点的属性,例如位置、法线、纹理坐标等。

  • Cesium.VertexFormat.POSITION_ONLY:仅包含位置信息的顶点格式。
  • Cesium.VertexFormat.POSITION_AND_COLOR:包含位置和颜色信息的顶点格式。
  • Cesium.VertexFormat.POSITION_NORMAL:包含位置和法线信息的顶点格式。
  • Cesium.VertexFormat.ALL:包含位置、颜色、法线、纹理坐标等所有属性的顶点格式。

arcType

  1. Cesium.ArcType.NONE:表示折线不进行插值,直接连接折线的顶点。这是默认值。
  2. Cesium.ArcType.GEODESIC:表示折线使用大地线插值,按照地球曲率进行插值生成曲线。这种插值方法会在地球表面形成弧线。
  3. Cesium.ArcType.RHUMB:表示折线使用恒向线插值,按照恒向线的方向进行插值生成曲线。这种插值方法会在地球表面形成一系列等角度的线段。

GeometryInstance

Cesium.Primitive

appearance

  1. Appearance:Appearance定义了完整的GLSL顶点和片段着色器,以及用于绘制Primitive的渲染状态。 所有的appearances实现都基于这个基础的Appearance接口。
  2. MaterialAppearance:用于设置基于材质的外观,可以通过指定材质属性来定义Primitive对象的表面特性,如颜色、透明度、反射率等。支持材质着色的任意几何图形的外观(与EllipsoidSurfaceAppearance相反)。
  3. EllipsoidSurfaceAppearance:用于设置椭球体或球体表面的外观,可以通过指定颜色属性来定义表面的颜色。如PolygonGeometryRectangleGeometry, 它支持MaterialAppearanceMaterialAppearance.MaterialSupport.ALL等所有材质
  4. PerInstanceColorAppearance:带有颜色属性的GeometryInstance实例的外观。 用于根据每个实例的颜色属性来设置每个实例的外观。这个类常用于需要为每个实例指定不同颜色的场景,如点云数据可视化。
  5. PolylineMaterialAppearance:用于设置折线或线段的外观,可以通过指定材质属性来定义Primitive对象的外观,如颜色、透明度、线宽等。

Material

Cesium也提供了Material类和MaterialProperty类,分别对通过Primitive和Entity两种方式生成的几何对象的material属性进行赋值。Primitive的appearance(或继承类)的material属性为Material类型,Entity的xxxGraphics的material属性为MaterialProperty或Color类型

image-20231120100821776

MaterialProperty

Fabric

Shader

内置函数

fract

用于计算一个浮点数的小数部分。它返回一个介于0和1之间的值,表示原始浮点数的小数部分。

0

image-20231124094632861

About


Languages

Language:Vue 94.0%Language:JavaScript 4.8%Language:CSS 0.9%Language:HTML 0.3%