Learning Paths
- cesium api
![image-20240120195610510](/Users/joo/Library/Application Support/typora-user-images/image-20240120195610510.png)
- create a demo or webGL
- cesium source code
- cesium with threejs and babylon.js
- ...
Repo
- learn-cesium
- learn-cesium-source-code
- cesium-xiamen-app: basic demo
🗓️TODO
- 封装高德地图/天地图...imageryProvider
📄Doc
🔗Blog
- https://www.cnblogs.com/telwanggs/p/11124237.html
- http://marsgis.cn/doc/study-cesium.pdf
- https://www.cnblogs.com/fuckgiser/p/5706842.html
📚 Course
- https://www.bilibili.com/video/BV12g411U7Us/?spm_id_from=333.999.0.0&vd_source=35abcff391e951c0b56e70fd7f32e2dc
- https://ke.qq.com/course/468292#term_id=100560563
💻Repo
🔠Keywords
- STK地形服务
STK(Systems Tool Kit)地形服务是由 Analytical Graphics, Inc.(AGI)提供的一种地形服务解决方案,它支持高精度和高解析度的全球地形数据。在地理空间应用和仿真中,STK地形服务常被用来提供精确的地形模型,以支持各种分析和可视化需求。
- TIN网格
TIN(Triangulated Irregular Network)网格是一种用于表示三维地理空间数据的方法。它通过连接不规则分布的点来形成三角形网格,从而构建出地表的三维模型。TIN 网格在地理信息系统(GIS)中广泛应用,特别是在地形建模和分析中。
- ICRF
ICRF(International Celestial Reference Frame,国际天球参考框架)是用于描述天体相对于远处恒星的固定坐标系统。它常用于精确的天文观测和空间导航,特别是在模拟卫星轨道和太空任务时。
多重采样抗锯齿 Multisampling Antialising
var viewer = new Cesium.Viewer('cesiumContainer', {
scene3DOnly: true,
selectionIndicator: false,
baseLayerPicker: false,
});
- https://github.com/CesiumGS/EarthKAMExplorer/tree/master/Cesium/Assets/IAU2006_XYS
- https://blog.csdn.net/u011575168/article/details/108290011
- http://cesium.xin/cesium/en/Documentationb28/Iau2006XysData.html
cesium中坐标系统分为地理坐标、世界坐标(X,Y,Z)、屏幕坐标三种。
采用右手系
- 屏幕坐标: 二维的笛卡尔坐标系,Cartesian2
-
地理坐标: 经度,纬度,高度, WGS-84坐标系 Cartographic(角度、弧度两种表达方式)
-
笛卡尔空间直角坐标系: 世界坐标(x,y,z), 采用右手系, Cartesian3
- **局部坐标
blog:
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);
});
- 角度与弧度互转
角度=弧度×180/π
弧度=角度×π/180
//弧度转角度
const degrees = Cesium.Math.toDegrees(Math.PI / 2); //90度
//角度转弧度
const radians = Cesium.Math.toRadians(180); //Math.PI
- 地理经纬度转地理弧度
//#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为弧度
- 经纬度转世界坐标(笛卡尔)
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;
}
- 世界坐标(笛卡尔)转经纬度
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];
}
- 世界坐标(笛卡尔)转屏幕坐标
const cartesian3 = Cesium.Cartesian3.fromDegrees(112,24)
const cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian3)
- 屏幕坐标转世界坐标(笛卡尔)
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:
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);
};
- Cesium.Cartesian3(相当于Point3D)
- Cesium.Matrix3(3x3矩阵,用于描述旋转变换)
- Cesium.Matrix4(4x4矩阵,用于描述旋转加平移变换)
- Cesium.Quaternion(四元数,用于描述围绕某个向量旋转一定角度的变换)
- Cesium.Transforms(包含将位置转换为各种参考系的功能)
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
- 基础地理环境设置 如地球参数(globe)、光照(light)、雾(fog)、大气(skyAtmosphere)
- 图层
- 场景数据
- 交互:相机、pick...
- create imagerLayer
- 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))
抽象基类
核心方法和属性
- requestImage(x, y, level):请求指定级别和坐标的地图瓦片。
- rectangle:表示该影像提供者覆盖的地理区域。
- tileWidth 和 tileHeight:瓦片的宽度和高度。
- minimumLevel 和 maximumLevel:支持的最小和最大缩放级别。
- getTileCredits(x, y, level):获取加载特定瓦片时所需的版权信息或其他信用信息。
- 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));
-
BingMapsImageryProvider: 从 Bing Maps 获取影像图层。
-
OpenStreetMapImageryProvider
-
GoogleEarthEnterpriseImageryProvider: 用于加载 Google Earth 企业服务器的影像数据。
-
SingleTileImageryProvider: 用于加载单个图片作为影像图层
-
TileMapServiceImageryProvider: tms,加载离线瓦片
-
GridImageryProvider (经纬度网格图层)和 TileCoordinatesImageryProvider(瓦片坐标图层)
-
WebMapServiceImageryProvider (WMS): 用于加载符合 WMS 标准的服务。
-
‼️ WebMapTileServiceImageryProvider (WMTS): 用于加载符合 WMTS 标准的瓦片服务。 -
UrlTemplateImageryProvider: 通过 URL 模板从自定义服务加载影像。
用于定义如何将球体或椭球体的表面分割为瓦片(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
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
是指地球表面的三维地形,而TerrainData
是这些地形在特定区域的具体数据表示。TerrainData
为Terrain
提供了必要的详细信息,使得 CesiumJS 能够渲染出真实的三维地形。
地形数据本身
const terrain = new Cesium Terrain(terrainProviderPromise)
viewer.scene.setTerrain(terrain)
- 世界地形 Cesium.Terrain.fromWorldTerrain(options)
抽象基类
负责每一个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
抽象基类
TerrainProvider提供TerrainData
- Cesium.QuantizedMeshTerrainData 量化网格地形
- 定义:
QuantizedMeshTerrainData
表示一种量化网格地形数据,这种数据格式主要用于表示复杂的地形。 - 数据结构:在量化网格格式中,地形被表示为一系列相互连接的三角形。这些三角形的顶点位置是量化的,以减少所需的存储空间。
- 特点:量化网格格式适用于高精度和高变化率的地形,如山脉或峡谷。它能够更精确地渲染地形的细微变化。
- 使用场景:当需要渲染高度详细和不规则的地形时,
QuantizedMeshTerrainData
是更合适的选择。 - 文件类型:量化网格地形通常存储为特定的文件类型,如
.terrain
,这是一种针对地形数据的二进制格式。
- 定义:
- Cesium.HeightmapTerrainData 高程图地形
- 定义:
HeightmapTerrainData
表示一种基于高程图的地形数据。高程图是一种更简单的表示方式,它使用一个二维数组来存储地形的高程信息。 - 数据结构:在高程图格式中,每个数组元素代表一个网格点的高程值。这些点通常以规则的网格排列。
- 特点:高程图格式相对简单,易于处理和理解。它适用于相对平坦或变化不大的地形。
- 使用场景:对于不需要高度复杂地形的应用,如显示大范围平缓地区的地形,
HeightmapTerrainData
是一个合适的选择。 - 文件类型:高程图数据可以存储在多种文件类型中,常见的如图片格式(PNG, JPG)或二进制格网格式。
- 定义:
- Cesium.GoogleEarthEnterpriseTerrainData Google Earth Enterprise 地形数据
查询指定位置指定等级的高程信息
// 定义查询的位置(经纬度坐标)
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);
}
});
查询地形提供者(TerrainProvider)提供的最详细等级
Cesium.sampleTerrainMostDetailed(terrainProvider, positions).then(function (updatedPositions) {
// 使用查询结果
for (var i = 0; i < updatedPositions.length; ++i) {
console.log('sampleTerrainMostDetailed 位置 ' + i + ' 的高程:' + updatedPositions[i].height);
}
});
抽象基类
- 数据源类型: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);
是一个核心组件,负责管理和渲染来自各种数据源(如 GeoJSON, KML, CZML 等)的实体(Entity)。
DataSourceDisplay
将数据源中的原始数据转换成可视化的图形,并确保它们正确地显示在 CesiumJS 场景(Scene)中。一般不直接调用
用于表示与特定数据源相关联的时间设置。这个对象定义了如何根据时间动态显示数据源中的内容,比如 CZML 中的动态实体。
DataSourceClock
通常包含关于开始时间、结束时间、当前时间和时钟速率的信息。
DataSource集合
[TODO]
- Cesium.KmlTour
- Cesium.KmlTourFlyTo
- Cesium.KmlTourWait
CZML是一种JSON格式的字符串,用于描述与时间有关的动画场景,CZML包含点、线、地标、模型和其他的一些图形元素,并指明了这些元素如何随时间而变化。
Cesium和CZML的关系就像Google Earth和KML的关系
doc
heading: 偏航(yaw),绕y轴
pitch: 俯仰角,绕x轴
roll: 滚动,绕z轴
图元是Cesium用来绘制三维对象的一个独立的结构。图元类有:Globe、Model、Primitive、BillboardCollection、ViewportQuad等。
Globe绘制的是全球地形,它需要两个东西,一个是地形高程信息,另外一个是影像图层,也就是地球的表皮。影像图层可以叠加多个,但是地形高程只能有一个。整个地形的绘制也是渐进式的,即视线看到的地方才会去调度相关的地形高程信息,找到对应位置的地形影像贴上。然而Globe只是一个图元。由此可见一个图元可以相当复杂。
需要注意的地方:
图元没有基类,但是所有的图元都会有update函数; Primitive类直译过来是图元的意思,但是它不是基类,只是图元的一种,起作用是用来绘制各种几何体。
椭球体
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:椭球体数据的二进制数据长度
@see https://cesium.com/blog/2018/01/24/cesium-scene-rendering-performance/
viewer.scene.render() 显式渲染
倾斜摄影模型格式
Geocoder : 一种地理位置搜索工具,用于显示相机访问的地理位置。默认使用微软的 Bing 地图。 HomeButton : 首页位置,点击之后将视图跳转到默认视角。 SceneModePicker : 切换 2D、3D 和 Columbus View (CV) 模式。 BaseLayerPicker : 选择三维数字地球的底图(imagery and terrain)。 NavigationHelpButton : 帮助提示,如何操作数字地球。 Animation :控制视窗动画的播放速度。 CreditsDisplay : 展示商标版权和数据源。 Timeline : 展示当前时间和允许用户在进度条上拖动到任何一个指定的时间。 FullscreenButton : 视察全屏按钮。
Steps:
- 创建几何(geometry)
- 创建几何实例(GeometryInstance): geometry
- 创建图元(Primitive): geometryInstances 、appearance
- PolylineGeometry(折线几何体)
- SimplePolylineGeometry(以线带(line strip)形式建模的折线):
- GroundPolylineGeometry(贴地折线几何体):
- ...
vertexFormat
用于指定折线几何体的顶点格式。顶点格式定义了每个顶点的属性,例如位置、法线、纹理坐标等。
Cesium.VertexFormat.POSITION_ONLY
:仅包含位置信息的顶点格式。Cesium.VertexFormat.POSITION_AND_COLOR
:包含位置和颜色信息的顶点格式。Cesium.VertexFormat.POSITION_NORMAL
:包含位置和法线信息的顶点格式。Cesium.VertexFormat.ALL
:包含位置、颜色、法线、纹理坐标等所有属性的顶点格式。
arcType
Cesium.ArcType.NONE
:表示折线不进行插值,直接连接折线的顶点。这是默认值。Cesium.ArcType.GEODESIC
:表示折线使用大地线插值,按照地球曲率进行插值生成曲线。这种插值方法会在地球表面形成弧线。Cesium.ArcType.RHUMB
:表示折线使用恒向线插值,按照恒向线的方向进行插值生成曲线。这种插值方法会在地球表面形成一系列等角度的线段。
- Appearance:Appearance定义了完整的GLSL顶点和片段着色器,以及用于绘制
Primitive
的渲染状态。 所有的appearances实现都基于这个基础的Appearance
接口。 - MaterialAppearance:用于设置基于材质的外观,可以通过指定材质属性来定义Primitive对象的表面特性,如颜色、透明度、反射率等。支持材质着色的任意几何图形的外观(与
EllipsoidSurfaceAppearance
相反)。 - EllipsoidSurfaceAppearance:用于设置椭球体或球体表面的外观,可以通过指定颜色属性来定义表面的颜色。如
PolygonGeometry
和RectangleGeometry
, 它支持MaterialAppearance
和MaterialAppearance.MaterialSupport.ALL
等所有材质 - PerInstanceColorAppearance:带有颜色属性的
GeometryInstance
实例的外观。 用于根据每个实例的颜色属性来设置每个实例的外观。这个类常用于需要为每个实例指定不同颜色的场景,如点云数据可视化。 - PolylineMaterialAppearance:用于设置折线或线段的外观,可以通过指定材质属性来定义Primitive对象的外观,如颜色、透明度、线宽等。
Cesium也提供了Material类和MaterialProperty类,分别对通过Primitive和Entity两种方式生成的几何对象的material属性进行赋值。Primitive的appearance(或继承类)的material属性为Material类型,Entity的xxxGraphics的material属性为MaterialProperty或Color类型
fract
用于计算一个浮点数的小数部分。它返回一个介于0和1之间的值,表示原始浮点数的小数部分。