cesium-相机的使用

news2024/11/15 14:04:30

直接上代码

<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>

效果展示 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Springboot的考编论坛网站的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的考编论坛网站的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

C++ 哈希表(unordered_map与unordered_set)

文章目录 unordered_map 与 unordered_set哈希表 (Hash Table)哈希函数哈希冲突模拟实现封装 补充&#xff1a;unordered_map 与 unordered_set 的使用 unordered_map 与 unordered_set 就和名字一样&#xff0c;这是 map、set 的无序版本&#xff08;数据遍历出来是无序的&am…

如何选择性能测试工具?ab和其它工具的对比分析!

性能测试是保证应用程序高效可靠的重要手段之一&#xff0c;在进行性能测试时&#xff0c;选择合适的性能测试工具非常重要。应当根据测试需求来选择适合的测试工具&#xff0c;本文将会详细介绍ApacheBench&#xff08;简称ab&#xff09;和其他性能测试工具的区别以及如何选择…

RFID手持终端_智能pda手持终端设备定制方案

手持终端是一款多功能、适用范围广泛的安卓产品&#xff0c;具有高性能、大容量存储、高端扫描头和全网通数据连接能力。它能够快速平稳地运行&#xff0c;并提供稳定的连接表现和快速的响应时&#xff0c;适用于医院、物流运输、零售配送、资产盘点等苛刻的环境。通过快速采集…

ROS笔记一:工作空间和功能包

目录 工作空间 如何创建工作空间&#xff1a; 编译工作空间 设置环境变量 功能包 创建功能包 CMakeLists.txt package.xml 工作空间 ROS的工作空间是用来存放工程文件代码的文件夹 ROS的开发依赖于工作空间&#xff0c;包括编写代码、编译等都是在工作空间下进行的 工作空…

ACK One Argo工作流:实现动态 Fan-out/Fan-in 任务编排

作者&#xff1a;庄宇 什么是 Fan-out Fan-in 在工作流编排过程中&#xff0c;为了加快大任务处理的效率&#xff0c;可以使用 Fan-out Fan-in 任务编排&#xff0c;将大任务分解成小任务&#xff0c;然后并行运行小任务&#xff0c;最后聚合结果。 由上图&#xff0c;可以使…

【Vitis】基于C++函数开发组件的步骤

目录 基本步骤 关键领域 • 硬件接口&#xff1a; 任务级并行度&#xff1a; 存储器架构&#xff1a; 微观级别的最优化&#xff1a; 基本步骤 1. 基于 设计原则 建立算法架构。 2. &#xff08;C 语言仿真&#xff09; 利用 C/C 语言测试激励文件验证 C/C 代码的逻辑。…

2024/2/6学习记录

ts 因为已经学习过了 js &#xff0c;下面的都是挑了一些 ts 与 js 不同的地方来记录。 安装 npm install -g typescript 安装好之后&#xff0c;可以看看自己的版本 ts基础语法 模块 函数 变量 语法和表达式 注释 编译 ts 文件需要用 tsc xxx.ts &#xff0c;js 文件…

Dockerfile文件参数配置和使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

动态扩缩容下的全局流水号设计

关于全局流水号&#xff0c;业内用的比较多的就是雪花算法&#xff0c;一直没理解在动态扩缩容下其中的workId和 datacenterId如何设置&#xff0c;查到了几个方法&#xff1a;reidis中取&#xff0c;待后期实践下。 先简单的介绍一下雪花算法&#xff0c;雪花算法生成的Id由…

【Zookeeper】what is Zookeeper?

官网地址&#xff1a;https://zookeeper.apache.org/https://zookeeper.apache.org/ 以下来自官网的介绍 ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. A…

AI专题:AI应用落地的商业模式探索

今天分享的是AI 系列深度研究报告&#xff1a;《AI专题&#xff1a;AI应用落地的商业模式探索》。 &#xff08;报告出品方&#xff1a;国金证券&#xff09; 报告共计&#xff1a;27页 AI基座模型提供按量收费服务 以 ChatGPT 为代表的大模型能力涌现,为基座模型厂商带来增…

“小手艺”有“大情怀”, 《青春手艺人》赋能乡村振兴,传承新时代文化

文化传承发展要坚持“守正创新”&#xff0c;以守正创新的正气和锐气&#xff0c;赓续历史文脉、谱写当代华章。中央广播电视总台农业农村节目中心推出的聚焦年轻手艺人故事的微纪录片《青春手艺人》&#xff0c;为守正创新的文化传承增添了新的鲜活的青春故事。节目积极响应二…

MATLAB Fundamentals>>>(2/2) Project - Analyze Vehicle Data

#创作灵感# MATLAB基础知识官方课程学习笔记 MATLAB Fundamentals>Common Data Analysis Techniques>Summary of Common Data Analysis Techniques>(2/2) Project - Analyze Vehicle Data 任务名称&#xff1a;Fuel Economy Analysis 任务1&#xff1a; The variabl…

华为机考入门python3--(10)牛客10-字符个数统计

分类&#xff1a;字符 知识点&#xff1a; 字符的ASCII码 ord(char) 题目来自【牛客】 def count_unique_chars(s): # 创建一个空集合来保存不同的字符 unique_chars set() # 遍历字符串中的每个字符 for char in s: # 将字符转换为 ASCII 码并检查是否在范围内 #…

android retrofit上传List集合数据

由于接口需要&#xff0c;retrofit上传不能用POST,因为FormUrlEncoded注解跟Body不能共存&#xff0c;所以更改成了QueryMap 因为需要传参&#xff0c;所先将图片集合转成了Hashmap集合&#xff0c;再使用Gson 将集合转成Json 字符串 &#xff0c;再转成RequestBody 下面介绍一…

2024年【上海市安全员C3证】考试题库及上海市安全员C3证报名考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【上海市安全员C3证】考试题库及上海市安全员C3证报名考试&#xff0c;包含上海市安全员C3证考试题库答案和解析及上海市安全员C3证报名考试练习。安全生产模拟考试一点通结合国家上海市安全员C3证考试最新大纲…

微信支付服务商,商户快速进件,减少工作量

大家好&#xff0c;我是小悟 服务商拓展特约商户&#xff0c;人工录入大量商户资料&#xff0c;耗时耗力。商户对标准费率不满意&#xff0c;无法说服商户先签约再帮其调整费率。 为了减少服务商工作量&#xff0c;服务商快速进件工具来了&#xff0c;分为移动端和管理端。用好…

MyBatis多数据源以及动态切换实现(基于SpringBoot 2.7.x)

MyBatis多数据源以及动态切换实现可以实现不同功能模块可以对应到不同的数据库&#xff0c;现在就让我们来讲解一下。 目录 一、引入Maven二、配置文件三、实现多数据源四、动态切换数据源 一、引入Maven 注意&#xff1a;博主这边使用的springboot版本是2.7.14的 <!-- htt…

用 Delphi 程序调用 Python 代码画曲线图

用 Python 的库画图 Python 代码如下&#xff1a; import matplotlib.pyplot as pltsquares [1, 4, 9, 16, 25]; plt.plot(squares); plt.grid(True) # 网格线 plt.show(); # 这句话会弹出个窗口出来&#xff0c;里面是上述数据的曲线。 把以上代码&#xff0c;放进 PyS…