webgl3.0动目标加载波束雷达
2023-05-30 11:47:14
96次阅读
0个评论
最后修改时间:2023-06-16 09:17:58

波束雷达视频效果

1、加载cesium 默认环境及开启帧数


var viewer = new Cesium.Viewer("cesiumContainer", {
                animation: false,
                baseLayerPicker: false,
                fullscreenButton: false,
                geocoder: false,
                homeButton: false,
                infoBox: false,
                sceneModePicker: false,
                selectionIndicator: false,
                timeline: false,
                navigationHelpButton: false,
                scene3DOnly:true,
                imageryProvider: new Cesium.SingleTileImageryProvider({
                    url: "../images/globe.jpg"
                })
            });
            viewer.extend(CesiumEMExtensions.EMExtensionsMixin);
            viewer.scene.debugShowFramesPerSecond = true;
2、生成场景需要定义的对象



       var ev_mtMgr;   //动目标对象
            var planeNumber = 1;  //飞行物数量
            var itemIndex = 0;  //动目标的uid
            var customCylider=undefined; //波束雷大对象          
            let count =0;                //波束雷达生成条件
 
            setUpMovingTarget(planeNumber);  //生成动目标的方法
3、生成动目标对象



function setUpMovingTarget (planeNumber) {
                viewer.scene.postProcessStages.fxaa.enabled = true;
                var sTime = new Date().getTime();
                var eTime = new Date(sTime + 1000000).getTime();
                var timeSpace = eTime - sTime;
                var trainingClock = new Cesium.Clock({
                    startTime: Cesium.JulianDate.fromDate(new Date(sTime)),
                    currentTime: Cesium.JulianDate.fromDate(new Date(sTime)),
                    stopTime: Cesium.JulianDate.fromDate(new Date(eTime)),
                    clockStep: Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER,
                    clockRange: Cesium.ClockRange.UNBOUNDED,
                });
                function DateManager () {
                }
                DateManager.prototype.addReceiveDataListener = function() {
                }
                var ev_dataMgr = new DateManager();
                ev_mtMgr = new CesiumEMExtensions.EV_MovingTargetManager({
                    viewer: viewer,
                    ev_dataMgr: ev_dataMgr,
                    trainingClock: trainingClock,
                });
                var ev_mtLabelConfiTable = new CesiumEMExtensions.EV_MTLabelConfigurationTable({
                    showBackground: true,
                    font: "12px sans-serif",
                    //distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.00001, 400000.0),
                });
                ev_mtLabelConfiTable.addDisplayFieldPara("id:", "uId");
                ev_mtLabelConfiTable.addDisplayFieldPara("经度:", "fLon", 2);
                ev_mtLabelConfiTable.addDisplayFieldPara("纬度:", "fLat", 2);
                ev_mtLabelConfiTable.addDisplayFieldPara("海拔:", "fAlt", 2);
                ev_mtLabelConfiTable.addDisplayFieldPara("机型:", "modelType");
                ev_mtMgr.ev_MTLabelConfigurationTables.set(1, ev_mtLabelConfiTable);

                trainingClock.shouldAnimate = true;
                trainingClock.tick();

                var single = [];
                var lat = 18;
                var height = 90000;
                var endLat = 37;
                var latNum = 40;//一条纬线上动目标的数量
                
                var i, j, itemStartLat, itemEndLat, itemStartLon, itemEndLon;
                var lon = 97;
                var endLon = 97;
                while (itemIndex < planeNumber) {
                    i = Math.floor(itemIndex / latNum);
                    j = itemIndex % latNum;
                    itemStartLat = lat + i * 0.5;
                    itemEndLat = endLat + 0.5;
                    itemStartLon = lon + j * 0.5;
                    itemEndtLon = endLon + j * 0.5;
                    var tempMTFlightData = new CesiumEMExtensions.EV_MovingTargetFlightData({
                        uId: itemIndex,
                        mtType: 1,
                        name: "J10",
                        modelType: 10,
                        modelLabelVisible: false,
                        modelUri: Cesium.buildModuleUrl("Assets/EMExtensions/gltf/dsp卫星.gltf"),
                        modelIconUri: "../images/Flight_1.png",
                        modelIconDisplayDistance: new Cesium.DistanceDisplayCondition(5000000.0, 50000000.0),
                        modelIconScale: 0.3,
                        scale: 100,
                        specialAttributes: {},
                        ribbonVisible: false,
                        forwardOffset: -10,
                        upOffset: 3,
                        traceTimeDuration: 30,
                        barTimeInterval: 20
                    });
                    tempMTFlightData.addTimeAttitude({
                        realTime: sTime,
                        fLon: itemStartLon,
                        fLat: itemStartLat,
                        fAlt: height,
                        position: Cesium.Cartesian3.fromDegrees(itemStartLon, itemStartLat, height),
                        nRedOrBlue: 0,
                        headingPitchRoll: new Cesium.HeadingPitchRoll(0.0, 0.0, 0.0)
                    });
                    tempMTFlightData.addTimeAttitude({
                        realTime: eTime,
                        fLon: itemEndtLon,
                        fLat: itemEndLat,
                        fAlt: height,
                        position: Cesium.Cartesian3.fromDegrees(itemEndtLon, itemEndLat, height),
                        nRedOrBlue: 0,
                        headingPitchRoll: new Cesium.HeadingPitchRoll(0.0, 90, 0.0)
                    });
                    ev_mtMgr.addMovingTargetTimeAttitude(itemIndex, tempMTFlightData);
                    itemIndex++;
                }

            }
4、销毁动目标对象



function destroy () {
                if (ev_mtMgr) {
                    ev_mtMgr.removeAllMovingTargets();
                    ev_mtMgr.destroy();
                    ev_mtMgr = undefined;
                }
            }
5、根据点位,方向和距离计算下一个点的位置



function ByDirectionAndLen(position, angle, len){
    let matrix = Cesium.Transforms.eastNorthUpToFixedFrame(position);  //将坐标转换为东北天坐标
    let mz = Cesium.Matrix3.fromRotationX(angle.pitch + Math.PI/2 || 0); //计算3*3旋转矩阵
     
    let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz); //转为4*4xuanzhuanjuzhen Cesium.Matrix4.multiply(matrix, rotationZ, matrix);
    
    let result = Cesium.Matrix4.multiplyByPoint(matrix, new Cesium.Cartesian3(0, len, 0),
                new Cesium.Cartesian3());
    return result;
}

6、帧监听绘制波束雷达


let preRender = viewer.scene.preRender.addEventListener(() => {
            
            if(ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude!=undefined){
                
                if(count==0){
                //根据两点计算向量
                var direction = Cesium.Cartesian3.subtract(
                      Cesium.Cartesian3.fromDegrees(121.20, 23.0, 10000),
                      Cesium.Cartesian3.fromDegrees(121.20, 23.0, 50000),
                      new Cesium.Cartesian3()
                 );
                 //根据属性绘制波束雷达
              customCylider= new CesiumEMExtensions.EV_CustomCylider({
                  viewer: viewer,
                  startPosition: ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,
                  direction: direction,
                  length: 100000,
                  fillColor: new Cesium.Color(0.0, 1.0, 1.0, 1.0),
                  fillStyle: CesiumEMExtensions.EV_CustomCylider.fillType.stripe,
                  speed: 1.0,
                  multiply: 10,
                  show: true,
                  bottomRadius: 20000,
                  topRadius: 0,
               });
                }else{
                  //根据点位,方向,距离计算下一个点的位置
                  var point =  ByDirectionAndLen(ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.headingPitchRoll,100)
                   //根据计算点位 获取向量
                    var direction = Cesium.Cartesian3.subtract(
                      ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,
                      point,
                      new Cesium.Cartesian3()
                 );
               //根据点位,方向,距离更新波束雷达
                customCylider.change(ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,direction,100000);
               
                }
                count=1;
            }

           
           });
整体代码如下


window.CesiumEMExtensions = CesiumEMExtensions;
            var viewer = new Cesium.Viewer("cesiumContainer", {
                animation: false,
                baseLayerPicker: false,
                fullscreenButton: false,
                geocoder: false,
                homeButton: false,
                infoBox: false,
                sceneModePicker: false,
                selectionIndicator: false,
                timeline: false,
                navigationHelpButton: false,
                scene3DOnly:true,
                imageryProvider: new Cesium.SingleTileImageryProvider({
                    url: "../images/globe.jpg"
                })
            });
            viewer.extend(CesiumEMExtensions.EMExtensionsMixin);
            viewer.scene.debugShowFramesPerSecond = true;

            
            var ev_mtMgr;
            var planeNumber = 1;
            var itemIndex = 0;
            var customCylider=undefined;           
            let count =0;

            setUpMovingTarget(planeNumber);
            let preRender = viewer.scene.preRender.addEventListener(() => {
            
            if(ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude!=undefined){
                
                if(count==0){
                var direction = Cesium.Cartesian3.subtract(
                      Cesium.Cartesian3.fromDegrees(121.20, 23.0, 10000),
                      Cesium.Cartesian3.fromDegrees(121.20, 23.0, 50000),
                      new Cesium.Cartesian3()
                 );
                 
              customCylider= new CesiumEMExtensions.EV_CustomCylider({
                  viewer: viewer,
                  startPosition: ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,
                  direction: direction,
                  length: 100000,
                  fillColor: new Cesium.Color(0.0, 1.0, 1.0, 1.0),
                  fillStyle: CesiumEMExtensions.EV_CustomCylider.fillType.stripe,
                  speed: 1.0,
                  multiply: 10,
                  show: true,
                  bottomRadius: 20000,
                  topRadius: 0,
               });
                }else{

                  var point =  ByDirectionAndLen(ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.headingPitchRoll,100)
                    var direction = Cesium.Cartesian3.subtract(
                      ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,
                      point,
                      new Cesium.Cartesian3()
                 );
               
                customCylider.change(ev_mtMgr.ev_MTFlightDatas.get(itemIndex-1).curTimeAttitude.position,direction,100000);
               
                }
                count=1;
            }

           
           });


            function setUpMovingTarget (planeNumber) {
                viewer.scene.postProcessStages.fxaa.enabled = true;
                var sTime = new Date().getTime();
                var eTime = new Date(sTime + 1000000).getTime();
                var timeSpace = eTime - sTime;
                var trainingClock = new Cesium.Clock({
                    startTime: Cesium.JulianDate.fromDate(new Date(sTime)),
                    currentTime: Cesium.JulianDate.fromDate(new Date(sTime)),
                    stopTime: Cesium.JulianDate.fromDate(new Date(eTime)),
                    clockStep: Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER,
                    clockRange: Cesium.ClockRange.UNBOUNDED,
                });
                function DateManager () {
                }
                DateManager.prototype.addReceiveDataListener = function() {
                }
                var ev_dataMgr = new DateManager();
                ev_mtMgr = new CesiumEMExtensions.EV_MovingTargetManager({
                    viewer: viewer,
                    ev_dataMgr: ev_dataMgr,
                    trainingClock: trainingClock,
                });
                var ev_mtLabelConfiTable = new CesiumEMExtensions.EV_MTLabelConfigurationTable({
                    showBackground: true,
                    font: "12px sans-serif",
                    //distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0.00001, 400000.0),
                });
                ev_mtLabelConfiTable.addDisplayFieldPara("id:", "uId");
                ev_mtLabelConfiTable.addDisplayFieldPara("经度:", "fLon", 2);
                ev_mtLabelConfiTable.addDisplayFieldPara("纬度:", "fLat", 2);
                ev_mtLabelConfiTable.addDisplayFieldPara("海拔:", "fAlt", 2);
                ev_mtLabelConfiTable.addDisplayFieldPara("机型:", "modelType");
                ev_mtMgr.ev_MTLabelConfigurationTables.set(1, ev_mtLabelConfiTable);

                trainingClock.shouldAnimate = true;
                trainingClock.tick();

                var single = [];
                var lat = 18;
                var height = 90000;
                var endLat = 37;
                var latNum = 40;//一条纬线上动目标的数量
                
                var i, j, itemStartLat, itemEndLat, itemStartLon, itemEndLon;
                var lon = 97;
                var endLon = 97;
                while (itemIndex < planeNumber) {
                    i = Math.floor(itemIndex / latNum);
                    j = itemIndex % latNum;
                    itemStartLat = lat + i * 0.5;
                    itemEndLat = endLat + 0.5;
                    itemStartLon = lon + j * 0.5;
                    itemEndtLon = endLon + j * 0.5;
                    var tempMTFlightData = new CesiumEMExtensions.EV_MovingTargetFlightData({
                        uId: itemIndex,
                        mtType: 1,
                        name: "J10",
                        modelType: 10,
                        modelLabelVisible: false,
                        modelUri: Cesium.buildModuleUrl("Assets/EMExtensions/gltf/dsp卫星.gltf"),
                        modelIconUri: "../images/Flight_1.png",
                        modelIconDisplayDistance: new Cesium.DistanceDisplayCondition(5000000.0, 50000000.0),
                        modelIconScale: 0.3,
                        scale: 100,
                        specialAttributes: {},
                        ribbonVisible: false,
                        forwardOffset: -10,
                        upOffset: 3,
                        traceTimeDuration: 30,
                        barTimeInterval: 20
                    });
                    tempMTFlightData.addTimeAttitude({
                        realTime: sTime,
                        fLon: itemStartLon,
                        fLat: itemStartLat,
                        fAlt: height,
                        position: Cesium.Cartesian3.fromDegrees(itemStartLon, itemStartLat, height),
                        nRedOrBlue: 0,
                        headingPitchRoll: new Cesium.HeadingPitchRoll(0.0, 0.0, 0.0)
                    });
                    tempMTFlightData.addTimeAttitude({
                        realTime: eTime,
                        fLon: itemEndtLon,
                        fLat: itemEndLat,
                        fAlt: height,
                        position: Cesium.Cartesian3.fromDegrees(itemEndtLon, itemEndLat, height),
                        nRedOrBlue: 0,
                        headingPitchRoll: new Cesium.HeadingPitchRoll(0.0, 90, 0.0)
                    });
                    ev_mtMgr.addMovingTargetTimeAttitude(itemIndex, tempMTFlightData);
                    itemIndex++;
                }

            }

            function destroy () {
                if (ev_mtMgr) {
                    ev_mtMgr.removeAllMovingTargets();
                    ev_mtMgr.destroy();
                    ev_mtMgr = undefined;
                }
            }

            //参数为什么类型,可根据函数API去传参
//len(单位:m)
//返回的类型可根据API转换坐标即可
function ByDirectionAndLen(position, angle, len){
    let matrix = Cesium.Transforms.eastNorthUpToFixedFrame(position);
    let mz = Cesium.Matrix3.fromRotationX(angle.pitch + Math.PI/2 || 0);
    
    let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);

    Cesium.Matrix4.multiply(matrix, rotationZ, matrix);
    
    let result = Cesium.Matrix4.multiplyByPoint(matrix, new Cesium.Cartesian3(0, len, 0),
                new Cesium.Cartesian3());
    return result;
}

            viewer.scene.camera.setView({
                destination: Cesium.Cartesian3.fromDegrees(99, 21, 1000000),

            });
收藏 0 0

登录 后评论。没有帐号? 注册 一个。

张泽

研发
  • 0 回答
  • 0 粉丝
  • 0 关注