Skip to content

组成及实例化

一个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"),
        }),
    })
);

MGis 地理三维库