组成及实例化
一个Primitive对象主要由以下两部分组成
Geometry
用于定义Primitive显示的几何形状和位置,类似Entity中的Graphics。
Appearance
外观,用于决定Primitive的着色结果,类似Entity中的MaterialProperty。
通俗来说Geometry就相当于人的骨架,而Appearance就是人的皮肤外表。
关系
一个Primitive可以包含多个Geometry,但是只能有一个Appearance。
实例化创建
我们在指定Primitive的几何图形时 ,是通过geometryInstances属性,该属性类型为Array.<GeometryInstance> | GeometryInstance即实例化几何或其数组。GeometryInstance实例化几何是Primitive中一个很强大的功能,GeometryInstance允许一个几何对象位于多个不同的位置,并具有唯一的颜色。例如,一个BoxGeometry可以被实例化多次,每次使用不同的modelMatrix来更改其位置、旋转和比例。也就是说一个几何对象可以被重复使用,这对于需要创建大量只是位置不一样的几何图形时,能够很大程度节省程序性能的开销。
ts
let viewer = new Cesium.Viewer("cesiumContainer");
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(110.0, 30.0, 8000.0), // 经度, 纬度, 高度(单位:米)
orientation: {
heading: Cesium.Math.toRadians(0.0), // 水平方向(0° 表示朝北)
pitch: Cesium.Math.toRadians(-90.0), // 向下俯视
roll: 0.0, // 没有滚动
},
duration: 3, // 飞行持续时间(秒)
});
let p = [110.0, 30.0];
let instances = [];
let boxGeometry = Cesium.BoxGeometry.fromDimensions({
dimensions: new Cesium.Cartesian3(100, 100, 100),
});
for (let i = 0; i < 50000; i++) {
const position = Cesium.Cartesian3.fromDegrees(
p[0] - 0.5 + Math.random(),
p[1] - 0.5 + Math.random(),
200 + Math.random() * 100
);
const instance = new Cesium.GeometryInstance({
geometry: boxGeometry,
modelMatrix: Cesium.Transforms.eastNorthUpToFixedFrame(position), //通过modelMatrix设置不同的位置
});
instances.push(instance);
}
viewer.scene.primitives.add(
new Cesium.Primitive({
geometryInstances: instances,
appearance: new Cesium.EllipsoidSurfaceAppearance({
material: Cesium.Material.fromType("Color"),
}),
})
);