Cesium.Ion.defaultAccessToken =
        "token";
      const viewer = new Cesium.Viewer("cesiumContainer", {
        shouldAnimate: true,
      });
     const start=Cesium.JulianDate.fromDate(new Date(2018,11,12,15));
     //从 JavaScript 日期创建一个新实例。
     const totalSeconds=10;
     const stop=Cesium.JulianDate.addSeconds(
  start,totalSeconds,new Cesium.JulianDate());
  //将提供的秒数添加到提供的日期实例。
viewer.clock.startTime=start.clone();
//复制此实例。
viewer.clock.stopTime=stop.clone();
viewer.clock.currentTime=start.clone();
viewer.clock.clockRange=Cesium.ClockRange.LOOP_STOP;
//时间轴的运作方式 循环or播完暂停
viewer.timeline.zoomTo(start,stop);
   
const position=new Cesium.SampledPositionProperty();
//采样 位置 特性
const startPosition=new Cesium.Cartesian3(
  -2379556.799372864,
  -4665528.205030263,
  3628013.106599678
);
//3D笛卡尔坐标系点
const endPosition = new Cesium.Cartesian3(
  -2379603.7074103747,
  -4665623.48990283,
  3627860.82704567
);
const velocityVectorProperty=new Cesium.VelocityVectorProperty(
  position,false
);
//速度  矢量 特性
//用于计算速度的位置属性
//是否对结算的速度矢量进行归一化
const velocityVector=new Cesium.Cartesian3();
const wheelAngleProperty=new Cesium.SampledProperty(Number);
//一个 Property ,
//其值在给定时间内根据提供的样本集和指定的插值算法和度数进行插值
let wheelAngle=0;
const  numberOfSamples=100;
for(let i=0;i<=numberOfSamples;++i)
{
  const factor=i/numberOfSamples;
  const time=Cesium.JulianDate.addSeconds(start,factor*totalSeconds,
  new Cesium.JulianDate() );
  const locationFactor=Math.pow(factor,2);
  const location=Cesium.Cartesian3.lerp(
    startPosition,
    endPosition,
    locationFactor,
    new Cesium.Cartesian3() );
  //使用提供的笛卡尔计算在 t 处的线性插值或外插。
  //start   Cartesian3  在 0.0 时对应于 t 的值。
  //end   Cartesian3  在 1.0 时对应于 t 的值。
  //t   Number  沿 t 进行插值的点。
  //result  Cartesian3  存储结果的对象。
  position.addSample(time,location);
  //添加一个新样本。
  //更新车模型的位置
  velocityVectorProperty.getValue(time,velocityVector);
  //获取速度矢量值,并放在velocityVector中
  const metersPerSecond=Cesium.Cartesian3.magnitude(velocityVector);
    //计算笛卡尔的大小(长度)。
  //参数:要计算其大小的笛卡尔实例。
  //米/秒
  const wheelRadius=0.52;
  //车轮半径
  const circumference=Math.PI*wheelRadius*2;//周长
  const rotationsPerSecond=metersPerSecond/circumference;
  //每秒转数
  //速度 =转速 X半径 X 2*math.pi
  wheelAngle+=((Math.PI*2*totalSeconds)/numberOfSamples)*
  rotationsPerSecond;//转速系数*转数
  wheelAngleProperty.addSample(time,wheelAngle);
  //添加插值采样
//更新轮胎(模型节点)的速度和旋转情况
}
function updateSpeedLabel(time,result){
  velocityVectorProperty.getValue(time,velocityVector);
  //在提供的时间获取属性的值。
  //result:将值存储到其中的对象,如果省略,则创建并返回一个新实例。
  const metersPerSecond=Cesium.Cartesian3.magnitude(velocityVector);
  //计算笛卡尔的大小(长度)。
  //参数:要计算其大小的笛卡尔实例。
  const kmPerHour=Math.round(metersPerSecond*3.6);//四舍五入函数
  return `${kmPerHour}km/hr`;
}
const rotationProperty=new Cesium.CallbackProperty(function(time,result){
  //一个 Property ,其值由回调函数延迟评估。
  return Cesium.Quaternion.fromAxisAngle(
    //一组 4 维坐标,用于表示 3 维空间中的旋转。
    //计算表示绕轴旋转的四元数。
    Cesium.Cartesian3.UNIT_X,//旋转轴
    wheelAngleProperty.getValue(time),//旋转角度(弧度值)
    //轮胎的旋转角度
    result
  );
},false);
//当回调函数每次返回相同的值时为 true ,如果值会改变则为 false 。
const wheelTransformation=new Cesium.NodeTransformationProperty({
  rotation:rotationProperty,//轮胎旋转矩阵
});
//产生数据类型:由平移、旋转和缩放定义的仿射变换。
const nodeTransformations={
  Wheels:wheelTransformation,
  Wheels_mid:wheelTransformation,
  Wheels_rear:wheelTransformation
};//模型节点及对应的运动矩阵
//添加模型
const vehicleEntity=viewer.entities.add({
  position:position,
  orientation:new Cesium.VelocityOrientationProperty(position),
  //指定实体方向的属性
  model:{
    uri:"../Source/SampleData/models/GroundVehicle/GroundVehicle.glb",
    runAnimations:false,
    nodeTransformations:nodeTransformations,
    //一个对象,其中键是节点的名称,
    //值是 TranslationRotationScale 描述要应用于该节点的转换的属性。
    //转换在 glTF 中指定的节点现有转换之后应用,并且不会替换节点的现有转换。
  },label:{
    text:new Cesium.CallbackProperty(updateSpeedLabel,false),
    //指定文本的属性。支持显式换行符 ''。
    font:"20px sans-serif",
    //指定 CSS 字体的属性。
    showBackground:true,
    //一个布尔属性,指定标签背后背景的可见性。
    distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
      ////一个属性,指定将在距相机多远的距离处显示此标签。
      0.0,
      100.0
    ),
   
    //与此实体关联的 options.label。
    eyeOffset:new Cesium.Cartesian3(0,3.5,0)
    //指定眼睛偏移的 Cartesian3 属性。
  },
});
viewer.trackedEntity=vehicleEntity;
//获取或设置相机当前正在跟踪的实体实例。
vehicleEntity.viewFrom=new Cesium.Cartesian3(-10.0,7.0,4.0);
//获取或设置跟踪此对象时建议的初始偏移量。偏移量通常在东北上参考系中定义,
//但也可能是另一个参考系,具体取决于对象的速度。
 
 
代码结构思维导图

Cesium案例(六) Time Dynamic Wheels的更多相关文章

  1. WPF案例 (六) 动态切换UI布局

    原文:WPF案例 (六) 动态切换UI布局 这个Wpf示例对同一个界面支持以ListView或者CardView的布局方式呈现界面,使用控件ItemsControl绑定数据源,使用DataTempla ...

  2. cesium 学习(六) 坐标转换

    cesium 学习(六) 坐标转换 一.前言 在场景中,不管是二维还好还是三维也罢,只要涉及到空间概念都会提到坐标,坐标是让我们理解位置的一个非常有效的东西.有了坐标,我们能很快的确定位置相关关系,但 ...

  3. Httpd服务入门知识-Httpd服务常见配置案例之DSO( Dynamic Shared Object)加载动态模块配置

    Httpd服务入门知识-Httpd服务常见配置案例之DSO( Dynamic Shared Object)加载动态模块配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.加载动 ...

  4. Cesium案例解析(六)——3DTilesInspector监视器

    目录 1. 概述 2. 案例 1. 概述 3D Tiles作为传输和渲染大规模3D地理空间数据的格式,应对的都是大规模数据的场景,Cesium提供了一个监视3D Tiles数据的监视器,可以通过这个监 ...

  5. CSharp 案例:用 Dynamic 来解决 DataTable 数值累加问题

    需求说明 给定一个 DataTable,如果从中取出数值类型列的值并对其累加? 限制:不知该列是何种数值类型. 解决方案 1.将表转换为 IEnumerable<dynamic>,而后获取 ...

  6. Cesium案例解析(五)——3DTilesPhotogrammetry摄影测量3DTiles数据

    目录 1. 概述 2. 案例 3. 结果 1. 概述 3D Tiles是用于传输和渲染大规模3D地理空间数据的格式,例如摄影测量,3D建筑,BIM / CAD,实例化特征和点云等.与常规的模型文件格式 ...

  7. Cesium案例解析(三)——Camera相机

    目录 1. 概述 2. 实例 2.1. Camera.html 2.2. Camera.js 2.2.1. 飞行至某一点 2.2.2. 飞行至某区域 2.2.3. 两地之间飞行 2.2.4. 设置视图 ...

  8. awk处理之案例六:awk根据条件插入文本

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [脚本编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  9. Cesium案例解析(二)——ImageryLayers影像图层

    目录 1. 概述 2. 实例 2.1. ImageryLayers.html 2.2. ImageryLayers.js 2.2.1. 代码 2.2.2. 解析 3. 结果 1. 概述 Cesium支 ...

  10. Cesium案例解析(一)——HelloWorld

    目录 1. 概述 2. 实例 2.1. HelloWorld.html 2.2. HelloWorld.js 3. 结果 1. 概述 感觉网上已经有不少关于cesium的教程了,但是学习一个框架最快的 ...

随机推荐

  1. 注释中的Unicode编码也会被转义

    现象 public class Unicode { public static void main(String[] args) { // \u000d System.out.println(&quo ...

  2. LeetCode刷题感想之DFS

    在剑指Offer里专门有一个部分(大概是连续十几题的样子)考察了 DFS ,也就是深度优先遍历,感觉DFS 也是一种套路,只要思路找对,套一下思路也可以了,在这里记录一下. 在很多Leetcode 的 ...

  3. [fiddler的使用]模拟自动回复功能在模拟测试mock第三方对接系统的返回中的使用场景

    [场景描述]在许多对第三方的测试过程中,由于第三方没有测试环境或者测试环境同步开发的时候还未准备好,或者系统间联调时对方还未完成的各种情况下,我们可以通过fiddler来模拟对方的返回. [操作步骤] ...

  4. 如何简单使用Git

    Git基本功能 Git基本功能 在具体介绍Git能做什么之前,先来了解下Git里的四个角色: workspace: 本地的工作空间. index:缓存区域,临时保存本地改动. local reposi ...

  5. 解决navicat远程连接MySQL失败,报错1130问题

    1select host from user where user='root'; 2update user set host = '%' where user ='root';3flush priv ...

  6. Crypto入门 (九) easy_RSA

    前言: 建议看这篇随笔之前先看入门(8)数论基础,简单学习下,有利于你看懂后面得算法原理,链接给出:https://www.cnblogs.com/yuanchu/p/13494104.html ea ...

  7. HCK 、PCLK、FCLK的区别

    HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt control ...

  8. 宝塔linux面板进行数据库操作显示"数据库管理密码"

    在使用宝塔linux面板时,对数据库进行操作之后,显示数据库管理密码错误.经历了卸载数据库并删除了数据库文件和olddata, 在从新安装,仍然显示数据库管理密码错误. 这时,我们可以进入到 /www ...

  9. jmeter学习-性能指标、jmeter初识

    一:性能测试的指标 1. 并发/并发数/并发用户数 狭义的并发:同一时间做相同的一件事 广义的并发:同一时间做不同事情,混合场景,对服务器来说的并发 性能测试,先做简单的狭义并发,在做广义并发:先做单 ...

  10. 将spring boot项目打包成jar包

    在spring boot项目的pom文件中加入 <packaging>jar</packaging> 生成jar包 文件右键Open In Explorer找到文件所在位置 可 ...