当前位置: 首页 > article >正文

supermap iclient3d for cesium模型沿路径移动

可以直接settimeout隔一段时间直接设置位置属性,但是得到的结果模型不是连续的移动,如果想要连续的移动,就需要设置一个时间轴,然后给模型传入不同时间时的位置信息,然后就可以了。

开启时间轴

     let start = Cesium.JulianDate.fromDate(new Date());  // 设置时间轴当前时间为开始时间

    start = Cesium.JulianDate.addHours(start, 8, new Cesium.JulianDate())//东八区

    let stop = Cesium.JulianDate.addSeconds(start, 400, new Cesium.JulianDate()) 

    viewer.clock.startTime = start.clone()

    // 设置时钟当前时间
    viewer.clock.currentTime = start.clone()

    // 设置时钟结束时间
    viewer.clock.stopTime = stop.clone();
    // 数字越大时间过的越快
    viewer.clock.multiplier = 10
    // 循环执行
    viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;

想让模型跟随移动方向切换方向

 orientation : new Cesium.VelocityOrientationProperty(position)

但是刚开始机头的朝向并不是速度的方向,所以一直会偏差,查询之后,发现有点复杂,初学者还是暂时放弃,

飞机整体代码这样,这里有个小坑,原生cesium你要绑定时间轴还需要设置availability,但是supermap这个没有,你加上就没有图像了

  var plane=new Cesium.Entity({
            
            position:property,
            model: {
                uri:"src/assets/gltf/plane/scene.gltf",
                minimumPixelSize: 128, //模型最小像素
                maximumScale: 200, //模型最大放大倍数
                },
                orientation: new Cesium.VelocityOrientationProperty(property)
        })

viewer.entities.add(plane)

function computeFlight(source:any) {

    let property = new Cesium.SampledPositionProperty();
    for (let i = 0; i < source.length; i++) {
                                                    //时间间隔
      let time = Cesium.JulianDate.addSeconds(start, source[i][2], new Cesium.JulianDate);
                                                    //坐标和高度
      let position = Cesium.Cartesian3.fromDegrees(source[i][0], source[i][1], 600);
      property.addSample(time, position);
    }
    return property;
}

在后面加一条轨迹线

const entityPath = new Cesium.Entity({
            position: property,
            path: {
                show: true,
                leadTime: 0,
                trailTime: 30,
                width: 6,
                resolution: 1,
                material:Cesium.Color.YELLOW,
            },
        });

初学做的不好,后面学多了会做好看的

总的代码

<template>
    <div class="PartOneBox">
        <div id="cesiumContainer"></div>
    </div>
</template>

<script setup lang='ts'>
import { ref, reactive,onMounted} from 'vue'

const plane1Position=[
            [104.173,30.822,0],
            [104.178,30.837,100],
            [104.19,30.837, 200],
            [104.185,30.82,300],
            [104.173,30.822,400],
            ]
    let start = Cesium.JulianDate.fromDate(new Date());  // 设置时间轴当前时间为开始时间
    start = Cesium.JulianDate.addHours(start, 8, new Cesium.JulianDate());   // 开始时间加8小时改为北京时间
    let stop = Cesium.JulianDate.addSeconds(start, 400, new Cesium.JulianDate());   // 设置结束时间为开始时间加400秒

onMounted(async()=>
{

    let viewer = new Cesium.Viewer('cesiumContainer')
    // 设置时钟开始时间
    viewer.clock.startTime = start.clone();
    // 设置时钟当前时间
    viewer.clock.currentTime = start.clone();
    // 设置时钟结束时间
    viewer.clock.stopTime = stop.clone();
    // 时间速率,数字越大时间过的越快,设置1好像是和实际时间一样
    viewer.clock.multiplier = 20
    // 循环执行,到达终止时间,重新从起点时间开始
    viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;

        var labelImagery = new Cesium.TiandituImageryProvider({
            mapStyle: Cesium.TiandituMapsStyle["IMG_C"],//天地图全球中文注记服务
            token: "你的" //由天地图官网申请的密钥
        });
   
        viewer.imageryLayers.addImageryProvider(labelImagery);
        viewer.camera.setView({
            destination: Cesium.Cartesian3.fromDegrees(
                104.18,30.83,3500
            )
        })

        var geo  = new Cesium.Entity({
            position:Cesium.Cartesian3.fromDegrees(
                104.18,30.83,1650
            ),
            wall:{
                positions:Cesium.Cartesian3.fromDegreesArrayHeights([
            104.173,30.822,400,
            104.178,30.837,400,
            104.19,30.837, 400,
            104.185,30.82,400,
            104.173,30.822,400,
            ]),
            material:Cesium.Color.RED.withAlpha(.4),
            outline: true,
          
            },
            polyline:{
                positions:Cesium.Cartesian3.fromDegreesArrayHeights([
                104.18,30.83,0,
                104.18,30.83,1600
            ]),
            material:Cesium.Color.BLUE,
            width:5
            },
            label: {
      text: "好的大学没有围墙!!", 
      font: "14px sans-serif", 
      showBackground: true,
      backgroundColor:new Cesium.Color(50,50,50,.6)
    },
        })

        let property = computeFlight(plane1Position) 
        var plane=new Cesium.Entity({
            
            position:property,
            model: {
                uri:"src/assets/gltf/plane/scene.gltf",
                minimumPixelSize: 128, //模型最小像素
                maximumScale: 200, //模型最大放大倍数
                },
                orientation: new Cesium.VelocityOrientationProperty(property)
        })
        const entityPath = new Cesium.Entity({
            position: property,
            path: {
                show: true,
                leadTime: 0,
                trailTime: 30,
                width: 6,
                resolution: 1,
                material:Cesium.Color.YELLOW,
            },
        });
        viewer.entities.add(geo)
        viewer.entities.add(plane)
        viewer.entities.add(entityPath)
        
})
function computeFlight(source:any) {

    let property = new Cesium.SampledPositionProperty();
    for (let i = 0; i < source.length; i++) {
                                                    //时间间隔
      let time = Cesium.JulianDate.addSeconds(start, source[i][2], new Cesium.JulianDate);
                                                    //坐标和高度
      let position = Cesium.Cartesian3.fromDegrees(source[i][0], source[i][1], 600);
      property.addSample(time, position);
    }
    return property;
}

</script>

<style scoped lang='scss'>
.PartOneBox
{
    width:1200px;
    height:1000px;
    margin:50px auto;
    position:relative;
    .cesiumContainer
    {
        width:100%;
        height:100%;
    }
}


</style>


http://www.kler.cn/news/314097.html

相关文章:

  • 高效音频格式转换实战:使用Python和FFmpeg处理MP3到WAV的转换20240918
  • WIFI路由器的套杆天线简谈
  • 基于SpringBoot的高校实习信息发布网站【附源码】
  • RK3588/RK3588s运行yolov8达到27ms
  • 如何设置word页码从指定页开始
  • itk c++ 3D医学图像刚性配准
  • Linux面试题-日志量很大,怎么查看到目标日志
  • u-code-input结合u-keyboard实现支付密码+数字键盘
  • MODIS/Landsat/Sentinel下载教程详解【常用网站及方法枚举】
  • ESP8266做httpServer提示Header fields are too long for server to interpret
  • OpenCV读取并保存中文路径图片指南
  • 车载软件调试工具系列---Trace32断点功能
  • Docker安装 ▎Docker详细讲解 ▎数据卷挂载 ▎Nginx安装理解
  • linux-进程管理-进程状态
  • 怎么给视频加字幕?6种给视频加字幕最简单的方法,不怕你学不会!
  • 基于SpringBoot的在线教育平台的设计与实现
  • 【图虫创意-注册安全分析报告-无验证方式导致安全隐患】
  • Android状态栏StatusBar颜色修改
  • 基于云计算和大数据技术的传感器数据存储与分析系统
  • 01-Mac OS系统如何下载安装Python解释器
  • 天源迪科java实习生面经
  • 【CSS Tricks】如何做一个粒子效果的logo
  • Docker 消息队列RabbitMQ 安装延迟消息插件
  • 1. ZYNQ 2. MPSOC 3. FPGA 4. IO分配 5. 硬件设计
  • 【运维项目经历|044】云迁移与CI/CD管道优化项目
  • AUTOSAR_EXP_ARAComAPI的5章笔记(9)
  • 面试爱考 | 设计模式
  • 线程(三) 线程的互斥
  • 一些常用的 Docker 命令
  • Android外接USB扫码枪