|
楼主 |
发表于 2022-6-17 22:11:39
|
显示全部楼层
本帖最后由 tzbm123456 于 2022-6-17 23:05 编辑
Geometry 1.支持的几何类型
从基础篇的Entity篇幅我们知道,Entity支持的图形类型是以Graphics结尾的,一共有17种类型。而Primitive支持的几何类型则是以Geometry结尾的,和Entity除了结尾命名不一样之外,Cesium中还提供了独有的点形状PointPrimitive和一些形状的集合,包括PointPrimitiveCollection、BillboardCollection、LabelCollection、PolylineCollection。支持的形状如下图所示:
添加简单的点图元集合方法如下:
// Create a pointPrimitive collection with two points
var points = scene.primitives.add(
new Cesium.PointPrimitiveCollection({
modelMatrix: Cesium.Matrix4.IDENTITY,
debugShowBoundingVolume: false,
// OPAQUE 完全不透明;TRANSLUCENT 完全透明;OPAQUE_AND_TRANSLUCENT 不透明和半透明
blendOption: Cesium.BlendOption.OPAQUE_AND_TRANSLUCENT,
})
);
// add PointPrimitive
points.add({
position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.53883, 1000.0),
color: Cesium.Color.YELLOW,
});
points.add({
position: Cesium.Cartesian3.fromDegrees(-74.59777, 40.53883, 1000.0),
color: Cesium.Color.CYAN,
});
2.贴地或贴模型特性
跟Entity类似,Primitive也支持贴地或贴模型的特性,但不一样的是,Primitive是通过classificationType属性控制的。其中GroundPolylineGeometry、GroundPolylinePrimitive结合实现贴地线;GroundPrimitive实现贴地几何形状,包括CircleGeometry、CorridorGeometry、EllipseGeometry、PolygonGeometry、RectangleGeometry;ClassificationPrimitive可实现贴地或贴模型,包括BoxGeometry、CylinderGeometry、EllipsoidGeometry、PolylineVolumeGeometry、SphereGeometry几何形状。下面为一简单的贴模型示例:
scene.primitives.add(
new Cesium.ClassificationPrimitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: Cesium.BoxGeometry.fromDimensions({
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
dimensions: new Cesium.Cartesian3(8.0, 5.0, 8.0),
}),
modelMatrix: modelMatrix,
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
new Cesium.Color(1.0, 0.0, 0.0, 0.5)
),
show: new Cesium.ShowGeometryInstanceAttribute(true),
},
id: "volume",
}),
classificationType: Cesium.ClassificationType.CESIUM_3D_TILE,
})
);
3.组合几何
当我们使用一个图元绘制多个静态几何图形时,我们就会看到性能的优势。组合多个GeometryInstances 为一个Primitive可以极大的提高性能,以下示例绘制了2592个颜色各异的矩形,并覆盖整个地球。
var viewer = new Cesium.Viewer('cesiumContainer');
var scene = viewer.scene;
var instances = [];
for (var lon = -180.0; lon < 180.0; lon += 5.0) {
for (var lat = -85.0; lat < 85.0; lat += 5.0) {
instances.push(new Cesium.GeometryInstance({
geometry : new Cesium.RectangleGeometry({
rectangle : Cesium.Rectangle.fromDegrees(lon, lat, lon + 5.0, lat + 5.0),
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
}),
attributes : {
color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromRandom({alpha : 0.5}))
}
}));
}
}
scene.primitives.add(new Cesium.Primitive({
geometryInstances : instances,
appearance : new Cesium.PerInstanceColorAppearance()
}));
4.实例化几何
实例化可用于在场景的不同部分定位、缩放和旋转相同的几何体。多个实例可以引用相同的Geometry,并且每个实例可以具有不同的modelMatrix。这允许我们只需计算一次几何图形,并多次重复使用它。
下面的示例创建一个EllipsoidGeometry和两个实例。每个实例都引用相同的椭球几何体,但使用不同的modelMatrix放置它, 从而导致一个椭球位于另一个之上。
var viewer = new Cesium.Viewer('cesiumContainer');
var scene = viewer.scene;
var ellipsoidGeometry = new Cesium.EllipsoidGeometry({
vertexFormat : Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
radii : new Cesium.Cartesian3(300000.0, 200000.0, 150000.0)
});
var cyanEllipsoidInstance = new Cesium.GeometryInstance({
geometry : ellipsoidGeometry,
modelMatrix : Cesium.Matrix4.multiplyByTranslation(
Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-100.0, 40.0)),
new Cesium.Cartesian3(0.0, 0.0, 150000.0),
new Cesium.Matrix4()
),
attributes : {
color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.CYAN)
}
});
var orangeEllipsoidInstance = new Cesium.GeometryInstance({
geometry : ellipsoidGeometry,
modelMatrix : Cesium.Matrix4.multiplyByTranslation(
Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-100.0, 40.0)),
new Cesium.Cartesian3(0.0, 0.0, 450000.0),
new Cesium.Matrix4()
),
attributes : {
color : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.ORANGE)
}
});
scene.primitives.add(new Cesium.Primitive({
geometryInstances : [cyanEllipsoidInstance, orangeEllipsoidInstance],
appearance : new Cesium.PerInstanceColorAppearance({
translucent : false,
closed : true
})
}));
5.更新每个示例的属性
在将几何图形添加到Primitive中以后,仍然可以修改几何图形实例的某些属性:
(1)颜色:如果Primitive设置了PerInstanceColorAppearance外观,则可以修改ColorGeometryInstanceAttribute类型的颜色
(2)可见性:任何实例可以修改可见性
|
|