一:基本概念
1:Primitve的概念
Primitve是一种比较复杂的、面向图形开发人员的类,其绘制图形的方式更接近底层。
其由两部分组成:
Geometry:用于定义图形的结构,如面、椭圆、线条等;
Appearance:用于定义图形渲染着色,简单点说就是定义图形的外观材质;
2:Primitve可绘制的图形
PolylineGeometry | 可以具有一定宽度的多段线 |
PolygonGeometry | 可以具有空洞或者拉伸高度的多边形 |
EllipseGeometry | 椭圆或者拉伸的椭圆 |
CircleGeometry | 圆或者拉伸的椭圆 |
CorridorGeometry | 走廊,沿地表且具有一定的宽度 |
RectangleGeometry | 矩形或者拉伸的矩形 |
WallGeometry | 具有一定高度的墙 |
BoxGeometry | 以原点为中心点的立方体 |
EllipsoidGeometry | 以原点为中心的椭球体 |
CylinderGeometry | 圆柱体或圆锥体 |
SphereGeometry | 以原点为中心点的球体 |
3:Primitve的外观
MaterialApperance | 任意几何外观,支持使用材质着色 |
EllipsoidSurfaceApperance | 椭球体表面的外观,不支持几何体 |
PerInstanceColorAppereance | 让几何形状使用自定义颜色着色 |
PolylineMaterialApperance | 多线段的几何外观,支持使用材质着色 |
PolylineColorApperance | 使用每个片段或顶点的颜色来着色多线段 |
二:实际操作
1:线
(1)、通过new Cesium.GeometryInstance创建几何对象;
(2)、通过new Cesium.PolylineMaterialAppearance创建一个外观对象;
(3)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
let polyline = new Cesium.GeometryInstance({
geometry: new Cesium.PolylineGeometry({
positions: Cesium.Cartesian3.fromDegreesArray([
108.0, 31.0, 100.0, 36.0, 105.0, 39.0
]),
width: 10.0
})
})
let polylineApperance = new Cesium.PolylineMaterialAppearance({
material: Cesium.Material.fromType('Color', {
color: new Cesium.Color(1.0, 1.0, 0.0, 1.0)
})
})
let addPolylineGeometry = new Cesium.Primitive({
geometryInstances: polyline,
appearance: polylineApperance
})
viewer.scene.primitives.add(addPolylineGeometry)
(代码效果)
2:面
(1)、通过new Cesium.GeometryInstance创建几何对象;
(2)、通过new Cesium.MaterialAppearance创建一个外观对象;
(3)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 面 */
let polygon = new Cesium.GeometryInstance({
geometry: new Cesium.PolygonGeometry({
polygonHierarchy: new Cesium.PolygonHierarchy(
Cesium.Cartesian3.fromDegreesArray([
108, 45, 109, 48, 104, 48, 103, 45
])
)
})
})
let polygonApperance = new Cesium.MaterialAppearance({
material: Cesium.Material.fromType('Dot', {
color: new Cesium.Color(1.0, 1.0, 0.0, 1.0)
})
})
let addPolygonGeometry = new Cesium.Primitive({
geometryInstances: polygon,
appearance: polygonApperance
})
viewer.scene.primitives.add(addPolygonGeometry)
(代码效果)
3:椭圆
(1)、通过new Cesium.GeometryInstance创建几何对象;
(2)、通过new Cesium.EllipsoidSurfaceAppearance创建一个外观对象;
(3)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 椭圆 */
let ellipse = new Cesium.GeometryInstance({
geometry: new Cesium.EllipseGeometry({
center: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
semiMajorAxis: 500000.0,
semiMinorAxis: 300000
})
})
let ellipseApperance = new Cesium.EllipsoidSurfaceAppearance({
material: Cesium.Material.fromType('Stripe', {
color: new Cesium.Color(1.0, 1.0, 0.0, 1.0)
})
})
let addEllipseGeometery = new Cesium.Primitive({
geometryInstances: ellipse,
appearance: ellipseApperance
})
viewer.scene.primitives.add(addEllipseGeometery)
(代码效果)
4:圆
(1)、通过new Cesium.GeometryInstance创建几何对象;
(2)、通过new Cesium.EllipsoidSurfaceAppearance创建一个外观对象;
(3)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 圆 */
let circle = new Cesium.GeometryInstance({
geometry: new Cesium.CircleGeometry({
center: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
radius: 300000
})
})
let circleApperance = new Cesium.EllipsoidSurfaceAppearance({
material: Cesium.Material.fromType('Grid', {
color: new Cesium.Color(1.0, 1.0, 0.0, 1.0)
})
})
let addCircleGeometery = new Cesium.Primitive({
geometryInstances: circle,
appearance: circleApperance
})
viewer.scene.primitives.add(addCircleGeometery)
(代码效果)
5:走廊
(1)、通过new Cesium.GeometryInstance创建几何对象;
(2)、通过new Cesium.PerInstanceColorAppearance创建一个外观对象;
(3)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 走廊 */
let corridor = new Cesium.GeometryInstance({
geometry: new Cesium.CorridorGeometry({
positions: Cesium.Cartesian3.fromDegreesArray([
108.0, 31.0, 100.0, 36.0, 105.0, 39.0
]),
width: 10000
}),
attributes: {
color: new Cesium.ColorGeometryInstanceAttribute(0.2, 0.5, 0.2, 0.7)
}
})
let corridorApperance = new Cesium.PerInstanceColorAppearance({
flat: true,
translucent: true
})
let addCorridorGeometry = new Cesium.Primitive({
geometryInstances: corridor,
appearance: corridorApperance
})
viewer.scene.primitives.add(addCorridorGeometry)
(代码效果)
6:矩形
(1)、通过new Cesium.GeometryInstance创建几何对象;
(2)、通过new Cesium.EllipsoidSurfaceAppearance创建一个外观对象;
(3)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 矩形 */
let rectangle = new Cesium.GeometryInstance({
geometry: new Cesium.RectangleGeometry({
rectangle: Cesium.Rectangle.fromDegrees(95.0, 39.0, 100.0, 42.0)
}),
})
let rectangleAppearance = new Cesium.EllipsoidSurfaceAppearance({
material: Cesium.Material.fromType('Water')
})
let addRectangleAppearance = new Cesium.Primitive({
geometryInstances: rectangle,
appearance: rectangleAppearance
})
viewer.scene.primitives.add(addRectangleAppearance)
(代码效果)
7:墙
(1)、通过new Cesium.GeometryInstance创建几何对象;
(2)、通过new Cesium.MaterialAppearance创建一个外观对象;
(3)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 墙 */
let wall = new Cesium.GeometryInstance({
geometry: new Cesium.WallGeometry({
positions: Cesium.Cartesian3.fromDegreesArrayHeights([
107.0, 43.0, 100000,
97.0, 43.0, 100000,
97.0, 40.0, 100000.0,
107.0, 40.0, 100000.0,
107.0, 43.0, 10000.0
])
}),
})
let wallAppearance = new Cesium.MaterialAppearance({
material: Cesium.Material.fromType('Color', {
color: new Cesium.Color(1.0, 1.0, 0.0, 1.0)
})
})
let addWallAppearance = new Cesium.Primitive({
geometryInstances: wall,
appearance: wallAppearance
})
viewer.scene.primitives.add(addWallAppearance)
(代码效果)
8:盒子
(1)、通过Cesium.Cartesian3.fromDegrees定义盒子||本地参考系的中心点
(2)、通过Cesium.Transforms.eastNorthUpToFixedFrame获取中心点的正东、正北及地表法线方向
(3)、通过Cesium.Matrix4.multiplyByTranslation计算变换矩阵
(4)、通过Cesium.Matrix4.multiplyByUniformScale将几何图形从模型坐标表示形式转换为世界坐标表示形式
(5)、通过new Cesium.GeometryInstance创建几何对象;
(6)、通过new Cesium.PerInstanceColorAppearance创建一个外观对象;
(7)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 盒子 */
let boxCenter = Cesium.Cartesian3.fromDegrees(106.0, 45.0)
let transformMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(boxCenter)
let affineMatrix = Cesium.Matrix4.multiplyByTranslation(
transformMatrix,
new Cesium.Cartesian3(0, 0, 80000),
new Cesium.Matrix4()
)
let boxModelMatrix = Cesium.Matrix4.multiplyByUniformScale(
affineMatrix,
1.0,
new Cesium.Matrix4()
)
let box = new Cesium.GeometryInstance({
modelMatrix: boxModelMatrix,
geometry: Cesium.BoxGeometry.fromDimensions({
dimensions: new Cesium.Cartesian3(200000.0, 200000.0, 200000.0)
}),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromRandom())
}
})
let boxAppearance = new Cesium.PerInstanceColorAppearance(
)
let addBoxGeometry = new Cesium.Primitive({
geometryInstances: box,
appearance: boxAppearance
})
viewer.scene.primitives.add(addBoxGeometry)
(代码效果)
9:椭球体
(1)、通过Cesium.Cartesian3.fromDegrees定义椭球||本地参考系的中心点
(2)、通过Cesium.Transforms.eastNorthUpToFixedFrame获取中心点的正东、正北及地表法线方向
(3)、通过Cesium.Matrix4.multiplyByTranslation计算变换矩阵
(4)、通过Cesium.Matrix4.multiplyByUniformScale将几何图形从模型坐标表示形式转换为世界坐标表示形式
(5)、通过new Cesium.GeometryInstance创建几何对象;
(6)、通过new Cesium.PerInstanceColorAppearance创建一个外观对象;
(7)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 椭球体 */
let ellipsoidCenter = Cesium.Cartesian3.fromDegrees(106.0, 45.0)
let transformMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(ellipsoidCenter)
let affineMatrix = Cesium.Matrix4.multiplyByTranslation(
transformMatrix,
new Cesium.Cartesian3(0, 0, 80000),
new Cesium.Matrix4()
)
let ellipsoidModelMatrix = Cesium.Matrix4.multiplyByUniformScale(
affineMatrix,
200,
new Cesium.Matrix4()
)
let ellipsoid = new Cesium.GeometryInstance({
modelMatrix: ellipsoidModelMatrix,
geometry: new Cesium.EllipsoidGeometry({
vertextFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
radii: new Cesium.Cartesian3(800, 800, 1600)
}),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromRandom())
}
})
let ellipsoidAppearance = new Cesium.PerInstanceColorAppearance(
{
translucent: false
}
)
let addEllipsoidGeometry = new Cesium.Primitive({
geometryInstances: ellipsoid,
appearance: ellipsoidAppearance
})
viewer.scene.primitives.add(addEllipsoidGeometry)
(代码效果)
10:圆柱体
(1)、通过Cesium.Cartesian3.fromDegrees定义圆柱体||本地参考系的中心点
(2)、通过Cesium.Transforms.eastNorthUpToFixedFrame获取中心点的正东、正北及地表法线方向
(3)、通过Cesium.Matrix4.multiplyByTranslation计算变换矩阵
(4)、通过Cesium.Matrix4.multiplyByUniformScale将几何图形从模型坐标表示形式转换为世界坐标表示形式
(5)、通过new Cesium.GeometryInstance创建几何对象;
(6)、通过new Cesium.PerInstanceColorAppearance创建一个外观对象;
(7)、通过new Cesium.Primitive创建一个图元对象
(关键代码)
/* 圆柱体 */
let ellipsoidCenter = Cesium.Cartesian3.fromDegrees(106.0, 45.0)
let transformMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(ellipsoidCenter)
let affineMatrix = Cesium.Matrix4.multiplyByTranslation(
transformMatrix,
new Cesium.Cartesian3(0, 0, 80000),
new Cesium.Matrix4()
)
let cylinderModelMatrix = Cesium.Matrix4.multiplyByUniformScale(
affineMatrix,
10,
new Cesium.Matrix4()
)
let cylinder = new Cesium.GeometryInstance({
modelMatrix: cylinderModelMatrix,
geometry: new Cesium.CylinderGeometry({
length: 400000.0,
topRadius: 200000,
bottomRadius: 200000,
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
}),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromRandom())
}
})
let cylinderAppearance = new Cesium.PerInstanceColorAppearance(
{
translucent: false
}
)
let addCylinderAppearance = new Cesium.Primitive({
geometryInstances: cylinder,
appearance: cylinderAppearance
})
viewer.scene.primitives.add(addCylinderAppearance)
(代码效果)