cesium-相机修改默认的操作方式

基础框架vue3 + vite。

在操作cesium时,默认使用鼠标左键按住拖动,或者中键安装拖动,在操作上来说是挺便利的,但是有些习惯键盘的操作,那么就可以做如下修改。

cesium默认用鼠标操作场景的转换 ,修改为用键盘操作上下左右移动。废话不多,代码如下:

<template><div id="cesiumContainer" style="height: 100vh;"></div><div id="toolbar" style="position: fixed;top:20px;left:220px;"><el-breadcrumb :separator-icon="ArrowRight"><el-breadcrumb-item>场景</el-breadcrumb-item><el-breadcrumb-item>相机教程</el-breadcrumb-item></el-breadcrumb><div id="latlng_show" style="width:100vw;position:absolute;top:30px;left:15px;z-index:1;font-size:15px;"><div style="width:auto;height:30px;margin-left: 20px;"><span style="color:#fff">点击cesium显示屏开始</span></div><div style="width:auto;height:30px;margin-left: 20px;"><span style="color:#fff">w/s - 场景坐标向前/向后移动</span></div><div style="width:auto;height:30px;margin-left: 20px;"><span style="color:#fff">a/d - 场景坐标向左/向右移动</span></div><div style="width:auto;height:30px;margin-left: 20px;"><span style="color:#fff">q/e - 场景坐标向上/向下移动</span></div><div style="width:auto;height:30px;margin-left: 20px;"><span style="color:#fff">鼠标左键按下加上鼠标移动可更改查看方向</span></div></div></div>
</template>
<script setup>
import {ArrowRight} from '@element-plus/icons-vue'
import {onMounted, ref} from "vue";
import * as Cesium from "cesium";
import InitCesium from "../js/InitCesiumHide.js";let viewer = null;
let points = ref({position: null
});onMounted(() => {let initCesium = new InitCesium('cesiumContainer');viewer = initCesium.initViewer({});flyToRight2();let scene = viewer.scene;let canvas = scene.canvas;// 重点在画布上canvas.setAttribute('tabindex', '0');canvas.onclick = function () {canvas.focus();}let ellipsoid = scene.globe.ellipsoid;// 禁用默认事件处理程序 屏幕空间控制scene.screenSpaceCameraController.enableRotate = false;// 旋转scene.screenSpaceCameraController.enableTranslate = false;scene.screenSpaceCameraController.enableZoom = false;scene.screenSpaceCameraController.enableTilt = false;scene.screenSpaceCameraController.enableLook = false;let startMousePosition;let mousePosition;const flags = {looking: false,moveForward: false,moveBackward: false,moveUp: false,moveDown: false,moveLeft: false,moveRight: false};let handler = new Cesium.ScreenSpaceEventHandler(canvas);handler.setInputAction(function (movement) {flags.looking = true;mousePosition = startMousePosition = Cesium.Cartesian3.clone(movement.position);}, Cesium.ScreenSpaceEventType.LEFT_DOWN);handler.setInputAction(function (movement) {mousePosition = movement.endPosition;}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);handler.setInputAction(function (position) {flags.looking = false;}, Cesium.ScreenSpaceEventType.LEFT_UP);document.addEventListener('keydown', function (e) {let flagName = getFlagForKeyCode(e.key.toUpperCase());if (typeof flagName !== 'undefined') {flags[flagName] = true;}}, false);document.addEventListener('keyup', function (e) {let flagName = getFlagForKeyCode(e.key.toUpperCase());if (typeof flagName !== 'undefined') {flags[flagName] = false;}}, false);viewer.clock.onTick.addEventListener(function (clock) {let camera = viewer.camera;if (flags.looking) {let width = canvas.clientWidth;let height = canvas.clientHeight;// 坐标(0.0,0.0)将是单击鼠标的位置let x = (mousePosition.x - startMousePosition.x) / width;let y = -(mousePosition.y - startMousePosition.y) / height;let lookFactor = 0.05;camera.lookRight(x * lookFactor);camera.lookUp(y * lookFactor);}// 根据相机到椭球表面的距离更改移动速度。let cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;let moveRate = cameraHeight / 100.0;if (flags.moveForward) {camera.moveForward(moveRate);}if (flags.moveBackward) {camera.moveBackward(moveRate);}if (flags.moveUp) {camera.moveUp(moveRate);}if (flags.moveDown) {camera.moveDown(moveRate);}if (flags.moveLeft) {camera.moveLeft(moveRate);}if (flags.moveRight) {camera.moveRight(moveRate);}});
})const getFlagForKeyCode = (keyCode) => {switch (keyCode) {case 'W':return 'moveForward';case 'S':return 'moveBackward';case 'Q':return 'moveUp';case 'E':return 'moveDown';case 'D':return 'moveRight';case 'A':return 'moveLeft';default:return undefined;}
}const flyToRight2 = async () => {let tileset = await Cesium.Cesium3DTileset.fromUrl('/src/assets/tileset/12/tileset.json', {});update3dtilesMaxtrix(tileset);viewer.scene.primitives.add(tileset);viewer.flyTo(tileset);
}function update3dtilesMaxtrix(tileSet) {//调整参数let params = {tx: 113.06265738392063, //模型中心X轴坐标(经度,单位:十进制度)ty: 22.646603971034342, //模型中心Y轴坐标(纬度,单位:十进制度)tz: 45, //模型中心Z轴坐标(高程,单位:米)rx: 0, //X轴(经度)方向旋转角度(单位:度)ry: 0, //Y轴(纬度)方向旋转角度(单位:度)rz: 2, //Z轴(高程)方向旋转角度(单位:度)scale: 1.35, //缩放比例};//旋转const mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));const my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));const mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));const rotationX = Cesium.Matrix4.fromRotationTranslation(mx);const rotationY = Cesium.Matrix4.fromRotationTranslation(my);const rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);//平移const position = Cesium.Cartesian3.fromDegrees(params.tx,params.ty,params.tz);const m = Cesium.Transforms.eastNorthUpToFixedFrame(position);//旋转、平移矩阵相乘Cesium.Matrix4.multiply(m, rotationX, m);Cesium.Matrix4.multiply(m, rotationY, m);Cesium.Matrix4.multiply(m, rotationZ, m);//比例缩放const scale = Cesium.Matrix4.fromUniformScale(params.scale);Cesium.Matrix4.multiply(m, scale, m);// console.log("矩阵m:", m);//赋值给tilesettileSet._root.transform = m;
}
</script>
<style scoped>
#cesiumContainer {overflow: hidden;
}
</style>
<style>
.el-breadcrumb__inner, .el-breadcrumb__separator {color: #ffffff !important;
}
</style>

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

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

相关文章

App Inventor 2 Personal Image Classifier (PIC) 拓展:自行训练AI图像识别模型,开发图像识别分类App

这里仅仅介绍一下AI图像识别App的实现原理&#xff0c;AI的基础技术细节不在本文讨论范围。通过拓展即可开发出一款完全自行训练AI模型&#xff0c;用于特定识别场景的App了。 我们都知道&#xff0c;人工智能AI的基本原理是事先准备好样本数据&#xff08;这里指的是图片&…

2024年(第十届)全国大学生统计建模大赛选题参考(二)

1. 《智能化转型对中小企业成长影响的实证分析——基于长期面板数据》 研究背景 在数字化时代背景下&#xff0c;智能化转型成为推动中小企业&#xff08;SMEs&#xff09;持续成长的关键因素之一。本研究旨在探索智能化转型对中小企业成长的影响&#xff0c;并分析不同成长阶…

Vue3使用reactive定义的响应式变量 用计算属性监听这个变量不会实时更新,需要定义ref才行

在 Vue 3 中&#xff0c;如果你使用 reactive 创建响应式对象&#xff0c;然后在 computed 中使用这些响应式对象&#xff0c;确实可能会出现计算属性不会实时更新的情况。这是因为 computed 默认情况下只会在它所依赖的响应式变量被访问时才会重新计算&#xff0c;而不会在这些…

设计高并发秒杀系统:保障稳定性与数据一致性

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 系统架构设计 1. 系统架构图 二、 系统流程 三…

英福康INFICON真空计VGC012-103-401使用说明

英福康INFICON真空计VGC012-103-401使用说明

mysql和oracle日期函数总结

目录 MySQL日期函数 Oracle日期函数 当涉及到处理日期和时间时,MySQL和Oracle都提供了许多内置的函数。下面是对这两个数据库系统中一些常用的日期函数的总结,并附有示例说明: MySQL日期函数 …

基于深度学习的语音识别的未来

基于深度学习的语音识别是当前人工智能领域的研究热点之一。随着语音技术的不断发展&#xff0c;语音识别技术将在未来扮演更加重要的角色。 语音识别技术的发展已经有几十年的历史&#xff0c;但是基于深度学习的语音识别技术在近年来才取得了突破性的进展。深度学习技术可以…

01-环境搭建、SpringCloud微服务(注册发现、服务调用、网关)

环境搭建、SpringCloud微服务(注册发现、服务调用、网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&…

【BUG】cmd运行wmic提示‘wmic‘ 不是内部或外部命令

cmd运行wmic提示‘wmic‘ 不是内部或外部命令 解决办法 将C:\Windows\System32\wbem添加到系统环境变量

electron 程序与安装包图标放大与制作

原因 electron-builder 在打包时需要最小支持到256x256像素的icon图标。原有历史图标都太小了。需要尝试将图标放大。 工具 convertio.co/zh/ico-png/ 在线ico转png网站 https://github.com/upscayl/upscayl 图片放大工具 csdn下载 greenfish-icon-editor-pro.en.softonic.c…

Flink学习4 - 富函数 + 数据重分区操作 + sink 操作(kafka、redis、jdbc)

1、富函数 - 函数类接口&#xff0c;可以获取运行环境的上下文&#xff0c;实现更复杂的功能 2、数据重分区操作 3、sink操作 sink - kafka 1、引入kafka的pom依赖 <dependency><groupId>org.apache.flink</groupId> <!--<artifactId>flink-conn…

在Linux/Ubuntu/Debian中加密磁盘(U盘)

sudo cryptsetup luksFormat /dev/sdX 此命令初始化指定块设备 (/dev/sdX) 上的 LUKS。它将提示你输入用于解锁加密设备的密码。 sudo cryptsetup open --type luks /dev/sdX crypto_disk 此命令打开 LUKS 加密设备 (/dev/sdX) 并将其映射到名为“encrypted_disk”的新设备。映…

Java基础知识点

Java基础知识点 1.方法重载和重写的区别 方法重载&#xff1a; 同一个类中的方法&#xff0c;方法名相同&#xff0c;返回值可以相同可以不同&#xff0c;参数列表必须不同发生在编译期&#xff0c;在编译期确定执行哪个方法 方法重写&#xff1a; 指的是子类重新定义父类…

ZooKeeper和Diamond有什么不同

本文主要是讨论下两个类似产品&#xff1a;ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond&#xff0c;顾名思义&#xff0c;寄寓了开发人员对产品稳定性的厚望&#xff0c;希望它像钻石一样&#xff0c;提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核…

零基础如何系统自学Python

零基础系统自学Python 学习前的准备 明确学习目标 Python 一共有两大版本&#xff0c;即 Python2 以及 Python3&#xff0c;Python2 已停止维护&#xff0c;强烈建议直接上手 Python3。Python 可以说是无所不能&#xff0c;主要有以下几大方向&#xff0c;建议选择自己感兴趣…

递归神经网络 (RNN) 及其变体 LSTM (长短期记忆) 和 GRU (门控循环单元)

递归神经网络&#xff08;RNN, Recurrent Neural Networks&#xff09;是一类用于处理序列数据的神经网络&#xff0c;特别适合于时间序列数据、语音、文本等连续数据的处理。RNN之所以独特&#xff0c;是因为它们在模型内部维持一个隐藏状态&#xff0c;该状态理论上可以捕获到…

【国产MCU】-CH32V307-SysTick中断与延时功能实现

SysTick中断与延时功能实现 文章目录 SysTick中断与延时功能实现1、SysTick介绍2、SysTick中断使用3、SysTick实现微秒和毫秒延时功能CH32V307的RISC-V内核控制器自带的一个64位可选递增或递减的计数器,用于产生SYSTICK异常(异常号:15),可专用于实时操作系统,为系统提供“…

LabVIEW高精度天线自动测试系统

LabVIEW高精度天线自动测试系统 系统是一个集成了LabVIEW软件的自动化天线测试平台&#xff0c;提高天线性能测试的精度与效率。系统通过远程控制测试仪表&#xff0c;实现了数据采集、方向图绘制、参数计算等功能&#xff0c;特别适用于对天线辐射特性的精确测量。 在天线的…

20 easy 70. 爬楼梯

//假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 // // 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; // // // // 示例 1&#xff1a; // // //输入&#xff1a;n 2 //输出&#xff1a;2 //解释&#xff1a;有两种方法可以爬到楼顶。 /…

uniapp H5 $el.querySelectorAll is not a function

在监听是否在可视区域遇到问题&#xff08;网页端&#xff09; 解决方案 <view class"container"> ...省略 业务代码... </view>参考 &#xff1a; https://blog.csdn.net/qq_18841969/article/details/134620559