cesium入门示例-探测效果
动画实现方式通过多个canvas实现,参考的https://www.yueyanshaosun.cn/ysCesium/views/5_geometricObj2_entityCanvas.html
探测效果实现步骤:
1、创建Cylinder圆锥体;
2、设置材质的贴图为动态属性,实现动态探测,但方向不变;
3、动态修改圆锥体长度length、位置position、朝向orientation,让圆锥体沿着顶点动起来;
4、去掉底部的纹理贴图,修改了cesium的源码实现。
第4步请教cesiumlab群,圆锥体是包含底面的,没有参数可以修改,只能动源码了,涉及的类包括:Core/CylinderGeometry.js、DataSources/CylinderGraphics,js、DataSources/CylinderGeometryUpdater.js
实现代码如下:
html部分:
<div id="cesiumContainer"></div>
<canvas id="canvas-a" width="400px" height="400px"></canvas>
<canvas id="canvas-b" width="400px" height="400px"></canvas>
<canvas id="canvas-c" width="400px" height="400px"></canvas>
三个canvas也可以通过js代码创建。
js部分:
Cesium.Ion.defaultAccessToken = ‘your token';
var viewer = new Cesium.Viewer('cesiumContainer');
viewer._cesiumWidget._creditContainer.style.display = "none";
viewer.scene.debugShowFramesPerSecond = true; //通过3个画布交替切换实现探测纹理动态
var changenum = 0;
var curCanvas = 'a'; function readyCanvas(convasid, radius) {
var canvas = document.getElementById(convasid);
let cwidth = 400;
let cheight = 400;
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, cwidth, cheight);
ctx.fillStyle = 'rgba(255, 255, 255, 0)';
ctx.fillRect(0, 0, cwidth, cheight); for (let ii = 0; radius <= 200; ii++) {
ctx.lineWidth = 5;
//开始一个新的绘制路径
ctx.beginPath();
//设置弧线的颜色
var trans = 1.0 - (radius / 255);
ctx.strokeStyle = "rgba(255, 0, 255, " + trans + ")";
var circle = {
x: 200, //圆心的x轴坐标值
y: 200, //圆心的y轴坐标值
r: radius //圆的半径
};
//以canvas中的坐标点(200,200)为圆心,绘制一个半径为50px的圆形
ctx.arc(circle.x, circle.y, circle.r, 0, Math.PI * 2, true);
//按照指定的路径绘制弧线
ctx.stroke();
radius += 20;
}
}
readyCanvas("canvas-a", 5);
readyCanvas("canvas-b", 10);
readyCanvas("canvas-c", 15); function drawCanvasImage(time, result) {
changenum++;
var canvas = document.getElementById("canvas-" + curCanvas);
if (changenum >= 20) {
changenum = 0;
if (curCanvas === 'a')
curCanvas = 'b';
else if (curCanvas === 'b')
curCanvas = 'c';
else
curCanvas = 'a';
}
return canvas;
}
//初始位置
var lon = -118.760842;
var lat = 38.132073;
var planePosition = Cesium.Cartesian3.fromDegrees(lon, lat, 3000.0)
//改变圆锥体位置,循环画矩形
function changePosition() {
if (lon > -118.755842 && lat < 38.138073) {
lat += 0.00001;
} else if (lat > 38.138073 && lon > -118.760842) {
lon -= 0.00001;
} else if (lon <= -118.760842 && lat > 38.132074) {
lat -= 0.00001
} else {
lon += 0.00001;
} planePosition = Cesium.Cartesian3.fromDegrees(lon, lat, 3000.0)
return planePosition
}
//根据圆锥中心点位置动态计算朝向、圆锥体长度
var geoD = new Cesium.EllipsoidGeodesic();
//顶点经纬度
var startPt = Cesium.Cartographic.fromDegrees(-118.760842, 38.132073, 0); function changeOrientation() {
//计算经度方向的夹角
var endX = Cesium.Cartographic.fromDegrees(lon, 38.132073, 0);
geoD.setEndPoints(startPt, endX);
var innerS = geoD.surfaceDistance;
var angleX = Math.atan(innerS / halfLen); //计算圆锥体长度
var end = Cesium.Cartographic.fromDegrees(lon, lat, 0);
geoD.setEndPoints(startPt, end);
innerS = geoD.surfaceDistance;
length = Math.sqrt(innerS * innerS + halfLen * halfLen); //计算纬度方向的夹角
var endY = Cesium.Cartographic.fromDegrees(-118.760842, lat, 0);
geoD.setEndPoints(startPt, endY);
innerS = geoD.surfaceDistance;
var angleY = Math.asin(innerS / length); //计算朝向
var hpr = new Cesium.HeadingPitchRoll(0.0, angleX, angleY);
var orientation = Cesium.Transforms.headingPitchRollQuaternion(planePosition, hpr); return orientation
}
var halfLen = 1000.0
var length = 1000.0; function changeLength() {
return 2 * length;
}
//创建圆锥实体
var cylinder = viewer.entities.add({
name: 'Red cone',
position: new Cesium.CallbackProperty(changePosition, false),
orientation: new Cesium.CallbackProperty(changeOrientation, false),
cylinder: {
length: new Cesium.CallbackProperty(changeLength, false),
topRadius: 0.0,
bottomRadius: 300.0,
//topSurface: false, //新增参数,控制顶部是否渲染
bottomSurface: false, //新增参数,控制底部是否渲染
material: new Cesium.ImageMaterialProperty({
image: new Cesium.CallbackProperty(drawCanvasImage, false),
transparent: true
})
}
}); //定位到圆锥体
var initialPosition = Cesium.Cartesian3.fromDegrees(-118.760842, 38.089073, 8000); //相机视角三要素:朝向(左右偏移),倾斜(上下偏移),翻滚角度(相机视锥体中轴线旋转角度)
var initialOrientation = new Cesium.HeadingPitchRoll.fromDegrees(1.27879878293835, -51.34390550872461, 0.0716951918898415);
viewer.scene.camera.setView({
destination: initialPosition,
orientation: initialOrientation,
endTransform: Cesium.Matrix4.IDENTITY
});
创建圆锥体时,将121、124行注释,显示效果如下:
若设置为透明的,即启用124行,效果如下:
注意箭头标示的地方,圆锥底部也被渲染纹理,修改源码增加了两个参数topSurface、bottomSurface用于支持关闭底部的渲染,最后结果如下:
cesium入门示例-探测效果的更多相关文章
- cesium入门示例-测量工具
作为cesium入门示例级别的最后一篇,参考cesium-长度测量和面积测量实现测量工具封装,修改了其中的距离测量函数,计算贴地距离,并对事件内部处理做了调整.包括贴地距离测量.面积测量.结果清除. ...
- cesium入门示例-矢量化单体分类
实现楼层的分层选择和属性信息展示,该功能基于大雁塔倾斜数据实现单体化分类显示. 数据准备: 1.大雁塔倾斜数据,已转换为3dTiles,参考cesium入门示例-3dTiles加载的第2节osgb数据 ...
- cesium入门示例-HelloWorld
示例准备: 在Cesium ion官网(https://cesium.com/)上注册用户,获取AccessToken,在js代码入口设置Cesium.Ion.defaultAccessToken,即 ...
- cesium入门示例-3dTiles加载
数据转换工具采用cesiumlab1.5.17版本,转换后的3dTiles加载显示比较简单,通过Cesium.Cesium3DTileset接口指定url即可,3dTiles文件可与js前端代码放置一 ...
- cesium入门示例-geoserver服务访问
1.wms服务访问 //wms服务 viewer.imageryLayers.addImageryProvider(new Cesium.WebMapServiceImageryProvider({ ...
- Cesium入门2 - Cesium环境搭建及第一个示例程序
Cesium入门2 - Cesium环境搭建及第一个示例程序 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 验 ...
- Cesium入门8 - Configuring the Scene - 配置视窗
Cesium入门8 - Configuring the Scene - 配置视窗 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coini ...
- Couchbase之个人描述及入门示例
本文不打算抄袭官方或者引用他人对Couchbase的各种描述,仅仅是自己对它的一点理解(错误之处,敬请指出),并附上一个入门示例. ASP.NET Web项目(其他web开发平台也一样)应用规模小的时 ...
- OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
第1章 OUYA游戏入门示例——StarterKit StarterKit是一个多场景的游戏示例,也是OUYA官方推荐给入门开发者分析的第一个完整游戏示例.本章会对StarterKit做详细介绍,包 ...
随机推荐
- selenium滚动条应用,爬永远讲不完的故事
from selenium import webdriver class Lj(object): def __init__(self): self.driver = webdriver.Chrome( ...
- 201509-1 数列分段 Java
思路: 后一个和前一个不相等就算一段 import java.util.Scanner; public class Main { public static void main(String[] ar ...
- 吴裕雄--天生自然 PHP开发学习:表单验证
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- 运行SQL文件报错Invalid ON UPDATE clause for 'create_date' column
Invalid ON UPDATE clause for 'create_date' column 原因: 高版本的mysql导数据到低版本出现的问题 日期类型报错 MySQL 5.5 每个表只允 ...
- Photoshop和Halcon如何锐化彩色图像不伤其颜色
锐化图像是摄影中的一步重要操作. 锐化是通过颜色提纯达到锐化的目的.一旦锐化过度,照片很容易就会出现不自然的色斑,或溢色效果. 我们以Photoshop中的“USM锐化滤镜”为例:(为了使效果明显,我 ...
- python_pycharm控制台输出带颜色
一.书写格式: 设置颜色开始:\033[显示方式;前景色;背景色m] 结束:\033[0m 二.颜色参数: 前景色 背景色 颜色 ----------------------------------- ...
- Python笔记_第四篇_高阶编程_py2与py3的区别
1. 性能: py3.x起始比py2.x效率低,但是py3.x现有极大的优化空间,效率正在追赶. 2. 编码: py3.x原码文件默认使用的utf-8编码,使得变量名更为宽阔. 3. 语法: * 去除 ...
- RL78 RAM GUARD Funtion
1.段设置 在Section段增加 My_ProtectRAM_n段, 段地址为RAM起始地址+256字节 2.变量定义 #pragma section bss My_ProtectRAM/*My_P ...
- Scipy优化算法--scipy.optimize.fmin_tnc()/minimize()
scipy中的optimize子包中提供了常用的最优化算法函数实现,我们可以直接调用这些函数完成我们的优化问题. scipy.optimize包提供了几种常用的优化算法. 该模块包含以下几个方面 使用 ...
- java package 包 学习笔记
编译命令示例: javac -d . Main.java 注:带参数-d自动建立文件目录, 只使用javac 则需要手工创建目录 把 class文件打包 jar命令 jar cvf T.jar *; ...