直接上代码

  var viewer = new Cesium.Viewer('cesiumContainer');

      //Set the random number seed for consistent results.
Cesium.Math.setRandomNumberSeed(3); //Set bounds of our simulation time
var start = Cesium.JulianDate.fromDate(new Date(2017, 2, 25, 16));
var stop = Cesium.JulianDate.addSeconds(start, 3600, new Cesium.JulianDate()); //Make sure viewer is at the desired time.
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; //在时间结束后再次从开始重复
viewer.clock.multiplier = 1;//时间流速 //Set timeline to simulation bounds
viewer.timeline.zoomTo(start, stop);//底部时间条控件调整 var viewModel = {
rate: 5.0,
gravity: 0.0,
minimumLife: 1.0,
maximumLife: 1.0,
minimumSpeed: 5.0,
maximumSpeed: 5.0,
startScale: 1.0,
endScale: 4.0,
particleSize: 20.0,
transX: 2.5,
transY: 4.0,
transZ: 1.0,
heading: 0.0,
pitch: 0.0,
roll: 0.0,
fly: false,
spin: false,
show: true
}; var entityPosition = new Cesium.Cartesian3();
var entityOrientation = new Cesium.Quaternion();
var rotationMatrix = new Cesium.Matrix3();
var modelMatrix = new Cesium.Matrix4();
function computeModelMatrix(entity, time) {
var position = Cesium.Property.getValueOrUndefined(entity.position, time, entityPosition);
if (!Cesium.defined(position)) {
return undefined;
}
var orientation = Cesium.Property.getValueOrUndefined(entity.orientation, time, entityOrientation);
if (!Cesium.defined(orientation)) {
modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(position, undefined, modelMatrix);
} else {
modelMatrix = Cesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromQuaternion(orientation, rotationMatrix), position, modelMatrix);
}
return modelMatrix;
} var emitterModelMatrix = new Cesium.Matrix4();
var translation = new Cesium.Cartesian3();
var rotation = new Cesium.Quaternion();
var hpr = new Cesium.HeadingPitchRoll();
var trs = new Cesium.TranslationRotationScale();
function computeEmitterModelMatrix() {
hpr = Cesium.HeadingPitchRoll.fromDegrees(viewModel.heading, viewModel.pitch, viewModel.roll, hpr); trs.translation = Cesium.Cartesian3.fromElements(viewModel.transX, viewModel.transY, viewModel.transZ, translation);
trs.rotation = Cesium.Quaternion.fromHeadingPitchRoll(hpr, rotation); return Cesium.Matrix4.fromTranslationRotationScale(trs, emitterModelMatrix);
} //计算运动轨迹函数:时间+位置
function computeCirclularFlight(lon, lat, radius) {
var property = new Cesium.SampledPositionProperty();
for (var i = 0; i <= 360; i += 45) {
var radians = Cesium.Math.toRadians(i);
var time = Cesium.JulianDate.addSeconds(start, i, new Cesium.JulianDate());//时间递增
var position = Cesium.Cartesian3.fromDegrees(lon + (radius * 1.5 * Math.cos(radians)), lat + (radius * Math.sin(radians)),
Cesium.Math.nextRandomNumber() * 500 + 1750);//位置变化
property.addSample(time, position);
}
return property;
} //计算模型随时间变化的位置
//var circularPosition = computeCirclularFlight(-112.110693, 36.0994841, 0.03);
var staticPosition = Cesium.Cartesian3.fromDegrees(-112.110693, 36.0994841, 1000);//静止的位置 var entity = viewer.entities.add({ //Set the entity availability to the same interval as the simulation time.
availability: new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
start: start,
stop: stop
})]), //Load the Cesium plane model to represent the entity
model: {
//uri: '../Apps/SampleData/models/CesiumAir/Cesium_Air.gltf',
uri: '../Apps/SampleData/plane.gltf',
color: getColor('red', 1),
minimumPixelSize: 54,//控制模型最小
maximumScale:5//控制模型最大
}, position: staticPosition, //实时轨迹显示
path: {
show: true,
leadTime: 0,//飞机将要经过的路径,路径存在的时间
trailTime: 60,//飞机已经经过的路径,路径存在的时间
width: 1,//线宽度
resolution: 1,
material: new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.3,//应该是轨迹线的发光强度
color: Cesium.Color.PALEGOLDENROD//颜色
})
}
}); viewer.trackedEntity = entity;
function getColor(colorName, alpha) {
var color = Cesium.Color[colorName.toUpperCase()];
return Cesium.Color.fromAlpha(color, parseFloat(alpha));
}
//根据geojson获取飞行路径
Cesium.loadJson('SampleData/flyline2.json').then(function (jsonData) {
var lineArray = jsonData.features[0].geometry.coordinates;
var property = new Cesium.SampledPositionProperty();
for (var i = 0; i< lineArray.length; i ++) {
var lon = lineArray[i][0];
var lat = lineArray[i][1];
var dtime = 100*i;
var time = Cesium.JulianDate.addSeconds(start, dtime, new Cesium.JulianDate());//时间递增
var position = Cesium.Cartesian3.fromDegrees(lon, lat,11750);//位置变化
property.addSample(time, position);
}
entity.position = property;
entity.orientation = new Cesium.VelocityOrientationProperty(property);
}).otherwise(function (error) {
console.log(error);
});
//移动的原理:position参数包含时间和所处位置,根据当前时间得到位置
//entity.position = circularPosition;
//根据模型当前位置自动计算模型的旋转等参数
//entity.orientation = new Cesium.VelocityOrientationProperty(circularPosition); /*************************
粒子系统实现
**************************/
var scene = viewer.scene;
//粒子系统初始化-实际是使用图片,改变图片的显示样式实现仿粒子化。
//图片可以利用canvas代替,在canvas中可以绘制自定义图形
var particleSystem = scene.primitives.add(new Cesium.ParticleSystem({
image: '../Apps/SampleData/fire.png', startColor: Cesium.Color.RED.withAlpha(0.7),
endColor: Cesium.Color.YELLOW.withAlpha(0.3), startScale: viewModel.startScale,
endScale: viewModel.endScale, minimumLife: viewModel.minimumLife,
maximumLife: viewModel.maximumLife, minimumSpeed: viewModel.minimumSpeed,
maximumSpeed: viewModel.maximumSpeed, minimumWidth: viewModel.particleSize,
minimumHeight: viewModel.particleSize, maximumWidth: viewModel.particleSize,
maximumHeight: viewModel.particleSize, // Particles per second.
rate: viewModel.rate, bursts: [
new Cesium.ParticleBurst({ time: 5.0, minimum: 300, maximum: 500 }),
new Cesium.ParticleBurst({ time: 10.0, minimum: 50, maximum: 100 }),
new Cesium.ParticleBurst({ time: 15.0, minimum: 200, maximum: 300 })
], lifeTime: 16.0, emitter: new Cesium.CircleEmitter(0.5), emitterModelMatrix: computeEmitterModelMatrix(), forces: [applyGravity]
}));
particleSystem.show = false;//不显示粒子系统
//粒子系统重力
var gravityScratch = new Cesium.Cartesian3();
function applyGravity(p, dt) {
// We need to compute a local up vector for each particle in geocentric space.
var position = p.position; Cesium.Cartesian3.normalize(position, gravityScratch);
Cesium.Cartesian3.multiplyByScalar(gravityScratch, viewModel.gravity * dt, gravityScratch); p.velocity = Cesium.Cartesian3.add(p.velocity, gravityScratch, p.velocity);
}
//根据目标模型计算粒子系统相关参数
viewer.scene.preRender.addEventListener(function (scene, time) {
particleSystem.modelMatrix = computeModelMatrix(entity, time);
// Account for any changes to the emitter model matrix.
particleSystem.emitterModelMatrix = computeEmitterModelMatrix(); });

利用geojson实现模型轨迹运动的更多相关文章

  1. R语言利用ROCR评测模型的预测能力

    R语言利用ROCR评测模型的预测能力 说明 受试者工作特征曲线(ROC),这是一种常用的二元分类系统性能展示图形,在曲线上分别标注了不同切点的真正率与假正率.我们通常会基于ROC曲线计算处于曲线下方的 ...

  2. 每天一点点之css - 动画-一个圆绕着另一个圆动(绕着轨迹运动)

    最近要开发一个类似星河的效果,需要小圆绕着一定的轨迹运动,这个时候我首先想到的是使用canvas来实现,在实现过程中发现这个实现起来不是很灵活,然后想到css3有动画也可以实现,下面是效果 注:图2是 ...

  3. Journal of Proteomics Research | 利用混合蛋白质组模型对MBR算法中错误转移鉴定率的评估

    题目:Evaluating False Transfer Rates from the Match-between-Runs Algorithm with a Two-Proteome Model 期 ...

  4. 小随笔:利用Shader实现模型爆炸和沙粒化的效果

    0x00 前言 上一篇小随笔<小随笔:利用Shader给斯坦福兔子长毛和实现雪地效果>中,我和大家聊了聊著名的斯坦福兔子和利用geometry shader实现的一些效果.这篇文章继续沿用 ...

  5. [转]JavaScript与元素间的抛物线轨迹运动

    在张鑫旭的博客看到这个抛物线的小动画,觉得很感兴趣,转载一下方便研究~ 原文地址:http://www.zhangxinxu.com/wordpress/?p=3855 在页面上添加元素的位移动画,除 ...

  6. NLP(十八)利用ALBERT提升模型预测速度的一次尝试

    前沿   在文章NLP(十七)利用tensorflow-serving部署kashgari模型中,笔者介绍了如何利用tensorflow-serving部署来部署深度模型模型,在那篇文章中,笔者利用k ...

  7. 利用Tensorboard可视化模型、数据和训练过程

    在60分钟闪电战中,我们像你展示了如何加载数据,通过为我们定义的nn.Module的子类的model提供数据,在训练集上训练模型,在测试集上测试模型.为了了解发生了什么,我们在模型训练时打印了一些统计 ...

  8. arcgis point 随着 line类型的轨迹运动的动画

    animate : function(frampoint,topoint,speed = 60){ var path = topoint.geometry.paths[0]; var i = 1; v ...

  9. unity3d控制模型的运动

    这里就不多做解释了,直接上代码,只为了备忘. public class HeroMove : MonoBehaviour { private float speed;//人物行动速度 private ...

随机推荐

  1. Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...

  2. Spark RDD的弹性到底指什么

    RDD(Resiliennt Distributed Datasets)抽象弹性分布式数据集对于Spark来说的弹性计算到底提现在什么地方? 自动进行内存和磁盘数据这两种存储方式的切换 Spark 可 ...

  3. PAC 代理自动发现简介

    一 简介 1.1 什么是PAC文件 代理自动配置(PAC)文件包含一组用javaScript编码的规则,允许web浏览器确定是将Web流量直接发送到Internet还是通过代理服务器发送        ...

  4. 有关call和apply、bind的区别及this指向问题

    call和apply都是解决this指向问题的方法,唯一的区别是apply传入的参数除了其指定的this对象之外的参数是一个数组,数组中的值会作为参数按照顺序传入到this指定的对象中. bind是解 ...

  5. c++ python 交互之 swig

    c++ python 交互之 swig 工作中准备用python 作为脚本语言来实现一些工作于是就研究 可以和c++ 交互的脚本语言 本来一开始用的lua 但是 lua本身API接口很少 要么自己需要 ...

  6. 【题解】BZOJ1034 [ZJOI2008]泡泡堂BNB(贪心)

    [题解]BZOJ1034 [ZJOI2008]泡泡堂BNB(贪心) 考虑直接模拟田忌赛马... 我的最小比你的大,直接上 我的最大比你的大,直接上 otherwise,我小换你大 考虑最劣,由于每次比 ...

  7. 如何使用CSS3中的结构伪类选择器和伪元素选择器

    结构伪类选择器介绍 结构伪类选择器是用来处理一些特殊的效果. 结构伪类选择器属性说明表 属性 描述 E:first-child 匹配E元素的第一个子元素. E:last-child 匹配E元素的最后一 ...

  8. 【转】出现“ValueError : numpy.ufunc has the wrong size, try recompiling" 解决方法

    出现这个问题的原因是:numpy版本和scikit-learn版本不搭配. 解决方法: 升级numpy即可: pip install -U numpy

  9. 【转】python及其工具包安装基本流程

    昨天晚上在家里的旧电脑上安装了<利用python进行数据分析>的部分环境,遇到若干问题,在此予以记录. 部分细节转:http://blog.csdn.net/huanbia/article ...

  10. Spring Boot2 系列教程 (十六) | 整合 WebSocket 实现广播

    前言 如题,今天介绍的是 SpringBoot 整合 WebSocket 实现广播消息. 什么是 WebSocket ? WebSocket 为浏览器和服务器提供了双工异步通信的功能,即浏览器可以向服 ...