cesium-相机的使用

直接上代码

<template>
	<div id="cesiumContainer" style="height: 100vh;"></div>
	<div id="toolbar" style="position: fixed;top:20px;left:220px;">
		<el-breadcrumb>
			<el-breadcrumb-item>场景设置实例</el-breadcrumb-item>
			<el-breadcrumb-item>相机</el-breadcrumb-item>
		</el-breadcrumb>
		<el-row class="mb-4" style="margin-top: 15px">
			<el-button type="primary" @click="flyInACity">飞行进城市</el-button>
			<el-button type="primary" @click="flyToSanDiego">飞行圣迭哥</el-button>
			<el-button type="primary" @click="flyToLocation">飞行到当前</el-button>
			<el-button type="primary" @click="flyToHeadingPitchRoll">飞行控制角度</el-button>
			<el-button type="primary" @click="flyToRectangle">飞行到正方形</el-button>
			<el-button type="primary" @click="viewRectangle">打开到正方形</el-button>
			<el-button type="primary" @click="setReferenceFrame">设置相机参考</el-button>
			<el-button type="primary" @click="setHeadingPitchRoll">设置相机角度</el-button>
			<el-button type="primary" @click="viewInICRF">设置地球自转</el-button>
			<el-button type="primary" @click="cameraEvents">相机移动事件</el-button>
		</el-row>
		<el-row class="mb-4" style="margin-top: 15px">
			<el-button type="primary" @click="cameraChanges">相机发生变化</el-button>
			<el-button type="primary" @click="flyOverLongitude">从洛杉矶经欧洲飞往东京</el-button>
			<el-button type="primary" @click="flyOverLongitudeWithPitch">夸张飞行时向下看</el-button>
		</el-row>
	</div>
	<div id="toolbar" style="position: fixed;top:150px;left:220px;color: #fff;">
		<div id="viewChanged">View Changed</div>
		<div id="cameraChanged">Camera Changed</div>
	</div>
</template>
<script>
import * as Cesium from "cesium";
import InitCesiumHide from "../js/InitCesiumHide.js";

export default {
	name: 'cesium24001',
	data() {
		return {
			viewer: undefined,
			scene: undefined
		}
	},
	mounted() {
		let initCesium = new InitCesiumHide('cesiumContainer')
		this.viewer = initCesium.initViewer({});
		//去除版权信息
		this.viewer._cesiumWidget._creditContainer.style.display = "none";
		this.scene = this.viewer.scene;
		let clock = this.scene.clock;

	},
	methods: {
		flyOverLongitudeWithPitch() {
			this.losAngelesToTokyo(true);
		},
		flyOverLongitude(adjustPitch) {
			this.losAngelesToTokyo();
		},
		losAngelesToTokyo(adjustPitch) {
			var camera = this.scene.camera;
			// 东京
			var tokyoOptions = {
				destination: Cesium.Cartesian3.fromDegrees(139.8148, 35.7142, 20000.0),
				orientation: {
					heading: Cesium.Math.toRadians(15.0),
					pitch: Cesium.Math.toRadians(-60),
					roll: 0.0
				},
				duration: 20,
				flyOverLongitude: Cesium.Math.toRadians(60.0)
			};
			// 洛杉矶
			var laOptions = {
				destination: Cesium.Cartesian3.fromDegrees(-117.729, 34.457, 10000.0),
				duration: 5,
				orientation: {
					heading: Cesium.Math.toRadians(-15.0),
					pitch: -Cesium.Math.PI_OVER_FOUR,
					roll: 0.0
				}
			};

			laOptions.complete = function () {
				setTimeout(function () {
					camera.flyTo(tokyoOptions);
				}, 1000);
			};

			if (adjustPitch) {
				tokyoOptions.pitchAdjustHeight = 1000;
				laOptions.pitchAdjustHeight = 1000;
			}

			camera.flyTo(laOptions);
		},
		cameraChanges() {
			var cameraChanged = document.getElementById('cameraChanged');
			var i = 0;
			//相机发生变化时触发
			let removeChanged = this.viewer.camera.changed.addEventListener(function (percentage) {
				++i;
				cameraChanged.innerText = 'Camera Changed: ' + i + ', ' + percentage.toFixed(6);
				cameraChanged.style.display = 'block';
			});
		},
		cameraEvents() {
			var viewChanged = document.getElementById('viewChanged');
			var camera = this.viewer.camera;
			camera.moveStart.addEventListener(function () {
				viewChanged.style.display = 'block';
			});
			camera.moveEnd.addEventListener(function () {
				viewChanged.style.display = 'none';
			});
		},
		icrf(scene, time) {
			if (this.scene.mode !== Cesium.SceneMode.SCENE3D) {
				return;
			}
			// 计算一个旋转矩阵,在给定时间将一个点或向量从国际天文参考坐标系  time计算旋转矩阵的时间
			var icrfToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time);
			if (Cesium.defined(icrfToFixed)) {
				var camera = this.viewer.camera;
				var offset = Cesium.Cartesian3.clone(camera.position);
				var transform = Cesium.Matrix4.fromRotationTranslation(icrfToFixed);
				camera.lookAtTransform(transform, offset);
			}
		},
		viewInICRF() {
			this.viewer.camera.flyHome(0);

			this.viewer.clock.multiplier = 3 * 60 * 60;

			// 实时更新执行
			this.scene.postUpdate.addEventListener(this.icrf);
			this.scene.globe.enableLighting = true;
		},
		setHeadingPitchRoll() {
			var camera = this.viewer.camera;
			camera.setView({
				destination: Cesium.Cartesian3.fromDegrees(-75.5847, 40.0397, 1000.0),
				orientation: {
					heading: -Cesium.Math.PI_OVER_TWO,
					pitch: -Cesium.Math.PI_OVER_FOUR,
					roll: 0.0
				}
			});
		},
		setReferenceFrame() {
			var center = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);
			var transform = Cesium.Transforms.eastNorthUpToFixedFrame(center);

			// View in east-north-up frame
			var camera = this.viewer.camera;
			camera.constrainedAxis = Cesium.Cartesian3.UNIT_Z;
			camera.lookAtTransform(transform, new Cesium.Cartesian3(-120000.0, -120000.0, 120000.0));

			// Show reference frame.  Not required.
			this.scene.primitives.add(new Cesium.DebugModelMatrixPrimitive({
				modelMatrix: transform,
				length: 100000.0
			}));
		},
		viewRectangle() {
			var west = -77.0;
			var south = 38.0;
			var east = -72.0;
			var north = 42.0;

			var rectangle = Cesium.Rectangle.fromDegrees(west, south, east, north);
			this.viewer.camera.setView({
				destination: rectangle
			});

			// Show the rectangle.  Not required; just for show.
			this.viewer.entities.add({
				rectangle: {
					coordinates: rectangle,
					fill: false,
					outline: true,
					outlineColor: Cesium.Color.WHITE
				}
			});
		},
		flyToRectangle() {
			var west = -90.0;
			var south = 38.0;
			var east = -87.0;
			var north = 40.0;
			var rectangle = Cesium.Rectangle.fromDegrees(west, south, east, north);

			this.viewer.camera.flyTo({
				destination: rectangle
			});

			// Show the rectangle.  Not required; just for show.
			this.viewer.entities.add({
				rectangle: {
					coordinates: rectangle,
					fill: false,
					outline: true,
					outlineColor: Cesium.Color.WHITE
				}
			});
		},
		flyToHeadingPitchRoll() {
			this.viewer.camera.flyTo({
				destination: Cesium.Cartesian3.fromDegrees(-122.22, 46.12, 5000.0),
				orientation: {
					heading: Cesium.Math.toRadians(20.0),
					pitch: Cesium.Math.toRadians(-35.0),
					roll: 0.0
				}
			});
		},
		flyToLocation() {
			// Create callback for browser's geolocation
			function fly(position) {
				console.log(position)
				this.viewer.camera.flyTo({
					destination: Cesium.Cartesian3.fromDegrees(position.coords.longitude, position.coords.latitude, 1000.0)
				});
			}

			// Ask browser for location, and fly there.
			navigator.geolocation.getCurrentPosition(fly);
		},
		flyToSanDiego() {
			this.viewer.camera.flyTo({
				destination: Cesium.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0)
			});
		},
		flyInACity() {
			let camera = this.scene.camera;
			camera.flyTo({
				destination: Cesium.Cartesian3.fromDegrees(-73.98580932617188, 40.74843406689482, 363.34038727246224),
				complete: function () {
					setTimeout(function () {
						camera.flyTo({
							destination: Cesium.Cartesian3.fromDegrees(-73.98585975679403, 40.75759944127251, 186.50838555841779),
							orientation: {
								heading: Cesium.Math.toRadians(200.0),
								pitch: Cesium.Math.toRadians(-50.0)
							},
							easingFunction: Cesium.EasingFunction.LINEAR_NONE
						});
					}, 1000);
				}
			});
		}
	}
}
</script>
<style>
.el-breadcrumb__inner {
	color: #ffffff !important;
}
</style>

效果展示 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/362800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Maven的Docker镜像二次打包,再次推送至Harbor中

之所以如此操作&#xff0c;主要原因是&#xff0c;官版的镜像中默认的setting.xml已内置好&#xff0c;不容易修改&#xff0c; 重新二次打包&#xff0c;可以指定我们自己的setting.xml配置&#xff0c;配置自己的私服地址以及解决默认Maven仓库国内下载速度慢的问题 一、创…

安全防御第五次作业

拓扑图及要求如下&#xff1a; 实验注意点&#xff1a; 先配置双机热备&#xff0c;再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致双机热备时&#xff0c;请确保vrrp配置的虚拟IP与下面的ip在同一网段如果其中一台防火墙有过配置&#xff0c;最好清空或重启&…

SerDes PoC 电感网络工作原理详解

如下图所示,PoC的工作原理可以描述如下: 1. 直流状态时,电感处于短路状态,电容处于开路状态,因此,接收端的电源能够通过电感注入到信号传输系统中,并在另一端通过电感为本地电路供电,而不会透过电容影响到两端的高速收发器; 2. 交流状态时,即高频信号注入时,电容器是…

Vue3的Props

Vue 3中的props是用于接收父组件传递的数据的属性。在Vue 3中&#xff0c;props的声明发生了一些改变&#xff1a; 使用props选项来声明props。之前的版本中使用props属性来声明&#xff0c;但在Vue 3中改为使用props选项。通过TypeScript或Flow来静态类型检查props。Vue 3允许…

Java EE 5 SDK架构

Java EE 5 SDK架构 大型组织每天都要处理大量数据和多用户的相关事务。为管理该组织如此大型而又复杂的系统,开发了企业应用程序。企业应用程序是在服务器上托管的应用程序,通过计算机网络同时向大量用户提供服务。这种应用程序可采用各种技术开发,如Java EE 5。Java EE 5平…

Spark SQL的高级用法

一. 快速生成多行的序列 需求:请生成一列数据, 内容为 1 , 2 , 3 , 4 ,5 -- 快速生成多行的序列 -- 方式一 select explode(split("1,2,3,4,5",",")); --方式二 /*序列函数sequence(start,stop,step):生成指定返回的列表数据[start,stop]必须传入,step步…

用githubDesktop部署静态页面到github

准备项目 现在桌面新建文件夹 在githubDesktop选择新建存储库&#xff0c;本地路径选择新建的文件夹路径 选择发布到存储库&#xff0c;将本地文件夹的内容和github进行连接 将项目文件复制粘贴到新建的文件夹里面 在githubDesktop填写摘要和描述&#xff0c;选择上传 …

一文教你如何本地搭建Qchan图床网站实现公网远程访问

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

【Java 数据结构】对象的比较

Java中对象的比较 1. PriorityQueue中插入对象2. 元素的比较2.1 基本类型的比较2.2 对象比较的问题 3. 对象的比较3.1 覆写基类的equals3.2 基于Comparble接口类的比较3.3 基于比较器比较3.4 三种方式对比 4. 集合框架中PriorityQueue的比较方式5. 使用PriorityQueue创建大小堆…

Vue学习笔记(二)快速入门

Vue学习笔记&#xff08;二&#xff09;快速入门 vue小试牛刀 hello-vue3.html <body><div id"app"><h1>{{msg}}</h1></div><script type"module">import {createApp} from https://unpkg.com/vue3/dist/vue.esm-b…

【MySQL】——用SQL语句实现数据库和基本表的创建

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【数据库】mysql触发器使用

题目&#xff1a; 创建职工表以及职工工资表职工表字段&#xff1a;工号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄工资表字段&#xff1a;编号自增&#xff0c;职工工号&#xff0c;基础工资10000通过触发器实现&#xff1a;对职工进行添加时 工资表中也要体现当前职…

【Linux】环境基础开发工具的使用(一)

前言&#xff1a;在此之前我们学习了一些Linux的权限&#xff0c;今天我们进一步学习Linux下开发工具的使用。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; &#x1f4af;代码仓库:卫卫周大胖的学习日记…

docker下,容器无法启动,要删除里面的文件

第一步&#xff1a;进入docker cd /var/lib/docker 第二步&#xff1a;查找&#xff0c;我这里是拼音分词器 find ./ -name py 第三步&#xff1a;得到路径 第四步&#xff1a;删除或复制或移动&#xff0c;我这里是删除py文件夹 rm -rf ./over那一串 第五步&#xff1a;想干…

在 python 中调用 C/C++

Python 是一种很好用的胶水语言&#xff0c;利用Python的简洁和C的高效&#xff0c;基本可以解决99%的问题了&#xff0c;剩下那 1% 的问题也就不是问题了&#xff0c;毕竟不是所有问题都可解。 一般的&#xff0c;Python和C的交互分为这两种情况&#xff1a; 用C扩展Python&…

转转基于MQ的分布式重试框架设计方案

文章目录 1 背景2 方案3 效果4 可选项5 注意事项6 总结 1 背景 在分布式场景下&#xff0c;为了保障系统的可用性和数据的最终一致性&#xff0c;采用基于消息队列&#xff08;MQ&#xff09;的重试机制是一种常见的解决方案。伪代码如下&#xff1a; /*** 需要保证最终一致性…

数据可视化Tableau

目录 一.第一次实验课内容 1、熟悉Tableau Desktop的工作环境。 2、熟悉数据导入、维度和度量的区分以及不同数据字段类型的标识符。 3、熟悉工作表的基本操作&#xff0c;主要包括行列功能区&#xff0c;标记卡&#xff0c;筛选器&#xff0c;智能推荐的使用。 4、作业--…

3. Mybatis的XML配置文件(重点)

目录 1 Mybatis的XML配置文件 1.1 XML配置文件规范 1.2 XML配置文件实现 1.3 MybatisX的使用 2. Mybatis动态SQL 2.1 什么是动态SQL 2.2 动态SQL-if 2.2.1 条件查询 2.2.2更新 2.3 动态SQL-foreach 2.4 动态SQL-sql&include 1.mybatis入门 2.mybatis基本操作 1…

六大效果图渲染技巧,实现照片级真实感!

追求完美的3D艺术家们&#xff0c;注意了&#xff01;掌握这六大效果图渲染技巧&#xff0c;就能令你的作品逾越虚拟与现实的边界。无需长篇大论&#xff0c;立即提升你的渲染工作至照片级别的真实感&#xff01;让观者难以分辨&#xff0c;这正是我们所追求的魔法。 六大效果图…

LRU缓存(Leetcode146)

例题&#xff1a; 分析&#xff1a; 题目要求函数get和put要达到O(1)的时间复杂度&#xff0c;可以用 hashMap 来实现&#xff0c;因为要满足逐出最久未使用的元素的一个效果&#xff0c;还需要配合一个双向链表来共同实现。链表中的节点为一组key-value。 我们可以用双向链表来…