Cesium 若干绘制示例

20 篇文章 7 订阅
该博客展示了如何在Cesium中创建水流、曲线插值、流动箭头线和飞鸟动画效果。通过导入不同图片并利用CallbackProperty动态改变图片,实现了飞鸟循环飞翔的视觉效果。代码中详细定义了构造函数、创建方法、获取实体和清除实体等关键步骤。
摘要由CSDN通过智能技术生成

一、效果

1、水流效果

2、曲线插值

3、流动箭头线

4、飞鸟

二、代码 鸟

复制代码

/*
 * @Author: 苹果园dog 
 * @Date: 2021-04-07 10:14:19
 * @LastEditTime: 2021-04-12 18:39:52
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \web\cesiumS\cesium\cesium\mytest\Innosky2021\web\src\pages\飞鸟\Flybird.js
 */
import png1 from './1.png';
import png2 from './2.png';
import png3 from './3.png';
export default class Flybird {
    constructor(options) {
        this._image = options.image ;
        this._positions = options.positions || [];
        this._color = options.color || Cesium.Color.YELLOW;
        this._width = options.width || 10;
        this._duration = options.duration || 3000;
        this._entities = [];
        this._create();
    }

    /**
     * 创建
     */
    _create() {
        let preData={
            preTime:Cesium.JulianDate.now(),
            preIndex:0,
            preImage:png1
        }
        var rotation = Cesium.Math.toRadians(0);
        let curPolygonPositions2 = Cesium.Rectangle.fromCartesianArray(this._positions);
        var birdEntity = viewer.entities.add({
            rectangle: {
                coordinates:curPolygonPositions2,
                material:new Cesium.ImageMaterialProperty({
                    image:new Cesium.CallbackProperty((time,result) => {
                        let timestep = Cesium.JulianDate.secondsDifference(time, preData.preTime);
                        if (timestep < 0.2) {
                            return preData.preImage;
                        }
                        if(preData.preIndex===0){
                            preData={
                                preImage:png2,
                                preTime:time,
                                preIndex:1
                            }
                        }else if(preData.preIndex===1){
                            preData={
                                preImage:png3,
                                preTime:time,
                                preIndex:2
                            }
                        }else if(preData.preIndex===2){
                            preData={
                                preImage:png1,
                                preTime:time,
                                preIndex:0
                            }
                        }
                        return preData.preImage;
                    }, false)
                }),
                rotation: new Cesium.CallbackProperty(() => rotation, false),
                stRotation: new Cesium.CallbackProperty(() => rotation, false),
                classificationType: Cesium.ClassificationType.TERRAIN,
            },
        });
        this._entities.push(birdEntity);
    }



    /**
     * 获取所有加到球上的entity  
     * @returns 
     */
    getEntities() {
        return this._entities;
    }

    /**
     * 移除所有实体
     */
    clear() {
        for (let index = 0; index < this._entities.length; index++) {
            const element = this._entities[index];
            viewer.entities.remove(element);
        }
    }

    /**
     * 定位
     */
    flyTo() {
        viewer.flyTo(this._entities);
    }

}

复制代码

Cesium是一款基于Web的开源地球引擎,主要用于实时三维地理信息系统渲染。在Cesium中,批量绘制多边形是一个高效处理大量地形、建筑或其他几何体的方式。通过将多个多边形组合成一个批次(Batch),可以减少GPU的顶点和索引缓冲区之间的频繁交换,这在大规模场景中能够显著提升性能。 以下是在Cesium中批量绘制多边形的基本步骤: 1. **创建几何体**:首先,你需要为每个多边形创建`Cesium.PolygonGeometry`对象,并设置其位置、半径、顶点等属性。 2. **合并到批次**:使用`Cesium.GeometryPipeline`提供的`batchGeometries`方法,将多个`PolygonGeometry`实例添加到同一个`DynamicGeometryInstance`或`Primitive`中,这些对象会被合并到一个批次中。 3. **创建材质**:给多边形指定合适的着色器材料,如`BillboardGraphicsMaterial`或自定义的`Material`。 4. **添加到场景**:最后将`DynamicGeometry`或包含几何体的` Primitive`添加到场景中,Cesium会自动管理批次绘制,提高性能。 ```javascript // 示例代码片段 const positions = ...; // 多边形顶点数组 const geometries = new Cesium.PolygonGeometry({ hierarchy: ..., // 格式化的多边形顶点描述 }); let batch = new Cesium.DynamicGeometry(); batch.geometryInstances.push(new Cesium.GeometryInstance({ geometry: geometries, material: new Cesium.BillboardGraphicsMaterial({ color: ..., // 材料颜色 }), })); scene.primitives.add(batch);
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苹果园dog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值