Cesium用wsad进行场景漫游(九)
2023-01-14
先看效果,wsadqe控制方向升降,鼠标拖动屏幕也可以控制方向

整理下思路:
1. 使用movement变量控制是否进行漫游
2.1 进行漫游则先将enableRotate等全部取消
2.2 绑定Cesium.ScreenSpaceEventType.LEFT_DOWN等事件,用于计算鼠标移动并改变镜头方向,同时根据鼠标是否按下判断鼠标移动是否可以改变镜头方向
2.3 document.addEventListener监听按下的键盘按钮,进行相应的camera.moveForward等方法
3. 不进行漫游则恢复enableRotate等
代码如下:在vue中将其包装为一个Ismovement方法
//是否漫游模式
Ismovement(){
var that = this;
this.movement = !this.movement; //如果进行漫游
if(this.movement){
var ellipsoid = this.viewer.scene.globe.ellipsoid; //先将鼠标控制事件全部取消
this.viewer.scene.screenSpaceCameraController.enableRotate = false;
this.viewer.scene.screenSpaceCameraController.enableTranslate = false;
this.viewer.scene.screenSpaceCameraController.enableZoom = false;
this.viewer.scene.screenSpaceCameraController.enableTilt = false;
this.viewer.scene.screenSpaceCameraController.enableLook = false; var startMousePosition;
var mousePosition; //控制方向
var flags = {
looking : false,
moveForward : false,
moveBackward : false,
moveUp : false,
moveDown : false,
moveLeft : false,
moveRight : false
}; //按下左键的同时克隆一个鼠标点击的位置
this.viewer.screenSpaceEventHandler.setInputAction(function(movement) {
flags.looking = true;
mousePosition = startMousePosition = Cesium.Cartesian3.clone(movement.position);
}, Cesium.ScreenSpaceEventType.LEFT_DOWN); //记录鼠标移动的终点
this.viewer.screenSpaceEventHandler.setInputAction(function(movement) {
mousePosition = movement.endPosition;
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE); //looking改为false,意思是此时鼠标移动不会改变镜头方向
this.viewer.screenSpaceEventHandler.setInputAction(function(position) {
flags.looking = false;
}, Cesium.ScreenSpaceEventType.LEFT_UP); //获得按下的哪个按钮
function getFlagForKeyCode(keyCode) {
switch (keyCode) {
case 'W'.charCodeAt(0):
return 'moveForward';
case 'S'.charCodeAt(0):
return 'moveBackward';
case 'Q'.charCodeAt(0):
return 'moveUp';
case 'E'.charCodeAt(0):
return 'moveDown';
case 'D'.charCodeAt(0):
return 'moveRight';
case 'A'.charCodeAt(0):
return 'moveLeft';
default:
return undefined;
}
} //keydown如果长时间按下某个键,则重复触发按键按下事件。
document.addEventListener('keydown', this.down = function(e){
var flagName = getFlagForKeyCode(e.keyCode);
if (typeof flagName !== 'undefined') {
flags[flagName] = true;
}
}, false); document.addEventListener('keyup', this.up =(e)=>{
var flagName = getFlagForKeyCode(e.keyCode);
if (typeof flagName !== 'undefined') {
flags[flagName] = false;
}
}, false); //实时获取cesium clock的tick每一帧的时间,十分常用的功能
this.viewer.clock.onTick.addEventListener(function(clock) { var camera = that.viewer.camera; // 镜头旋转
if (flags.looking) {
//获取画布的高度宽度
var width = that.viewer.canvas.clientWidth;
var height = that.viewer.canvas.clientHeight; //相当于转动灵敏度,越大转动越快
var lookFactor =0.06; //x和y是鼠标按下后移动的xy距离与画布长宽的比例
var x = (mousePosition.x - startMousePosition.x) / width;
var y = -(mousePosition.y - startMousePosition.y) / height; camera.setView({
//根据摄像头现在的朝向和刚才移动的比例进行方向更新
orientation: {
heading : camera.heading + x*lookFactor,
pitch : camera.pitch + y*lookFactor,
roll : 0.0
}
})
} // 根据高度来决定镜头移动的速度
var cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;
var 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);
}
});
}else{
//取消漫游
this.viewer.scene.screenSpaceCameraController.enableRotate = true;
this.viewer.scene.screenSpaceCameraController.enableTranslate = true;
this.viewer.scene.screenSpaceCameraController.enableZoom = true;
this.viewer.scene.screenSpaceCameraController.enableTilt = true;
this.viewer.scene.screenSpaceCameraController.enableLook = true;
this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)
this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
this.viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)
document.removeEventListener('keydown',this.down,false)
document.removeEventListener('keyup',this.up,false) }
},
为了方便测试,这里用一个button进行控制是否漫游
<el-button @click="Ismovement" >漫游模式</el-button>
Cesium用wsad进行场景漫游(九)的更多相关文章
- 【Unity入门】场景编辑与场景漫游快捷键
版权声明:本文为博主原创文章,转载请注明出处. 打开Unity主窗口,选择顶部菜单栏的“GameObject”->“3D Object”->“Plane”在游戏场景里面添加一个面板对象.然 ...
- OSG实现场景漫游(转载)
OSG实现场景漫游 下面的代码将可以实现场景模型的导入,然后在里面任意行走,于此同时还实现了碰撞检测. 源代码下载地址: /* * File : Travel.cpp * Description : ...
- Unity3d场景漫游---iTween实现
接触U3D以来,我做过的场景漫游实现方式一般有以下几种: Unity3d中的Animation组件,通过设置摄像机的关键点实现场景漫游 第一人称或第三人称控制器 编写摄像机控制脚本 iTween iT ...
- Unity3d 简单的小球沿贝塞尔曲线运动(适合场景漫游使用)
简单的小球沿贝塞尔曲线运动,适合场景漫游使用 贝塞尔曲线:(贝塞尔曲线的基本想法部分摘自http://blog.csdn.net/u010019717/article/details/4768 ...
- 基于SketchUp和Unity3D的虚拟场景漫游和场景互动
这是上学期的一次课程作业,难度不高但是也一并记录下来,偷懒地拿课程报告改改发上来. 课程要求:使用sketchUp建模,在Unity3D中实现场景漫游和场景互动. 知识点:建模.官方第一人称控制器.网 ...
- cesium随笔 — 隐藏三维场景下方版权信息
上图中的版权信息相信很多人都想去掉,那么下面我将介绍一种简单粗暴的方法将其隐藏起来: .cesium-widget-credits { display: none!important; visibil ...
- osg 场景漫游
#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include <osg/Group> #include <os ...
- [Unity3D]巧妙利用父级子级实现Camera场景平面漫游
本文系作者原创,转载请注明出处 入门级的笔者想了一上午才搞懂那个欧拉角的Camera旋转..=.= 在调试场景的时候,每次都本能的按下W想前进,但是这是不可能的(呵呵) 于是便心血来潮想顺便添加个Ke ...
- [转]的C#实现三维数字地形漫游(基于Irrlicht)
马省轩 任丽娜 摘 要:本文采用C#编程语言,利用Irrlicht三维图形引擎实现了三维数字地形的漫游.为三维数字地形显示提供了较易实现的解决方案. 关键词:C# 高度图 Irrlicht引擎 ...
- OpenGL3D迷宫场景设计
近期学习用opengl库来构建一个3D场景,以及实现场景漫游.粒子系统等效果.终于算是是做了一个3D走迷宫游戏吧. 感觉近期学了好多东西,所以有必要整理整理. 一 实现效果 watermark/2/t ...
随机推荐
- Day38:Lambda表达式
Lambda表达式 1.1 概述 Lambda是JDK8开始后的一种新语法形式. 作用:简化函数式匿名内部类的代码写法. 简化格式: /*部类被重写方法的参数)->{ 被重写方法的方法体代码 } ...
- windows GO语言环境配置
目录 GO语言下载 安装goland go目录简介 配置gopath goland里添加goroot和gopath GO语言下载 参考教程:https://www.cnblogs.com/Domini ...
- Sqlserver分布式跨数据库查询、Join,以及分布式事务
简言: 这篇文章我要谈一谈SQL Server分布式跨服务器查询,多表Join,以及分布式事务的处理 SqlServer跨服务器查询的方式 以往自己才疏学浅,学习了一波之后,在这记录下来. 1. 使用 ...
- ES6——模块化
模块化 模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来. 一.浏览器使用ES6模块化方式一 使用script标签,将type属性设置为module,然后在script中书写代码 ...
- AcWing340通信道路/ USACO2008 Telephone Line S
AcWing题目 洛谷题目 解题思路 首先可以得到一个很容易得到的贪心策略,将一条路径上最贵的(边权最大)的\(K\)条边删去,那么我们剩下的路径中最贵(边权最大)的路就是原本这条路径上帝\(K + ...
- Windows上将linux目录映射网络驱动器
我有两台PC,一台操作用的Windows,一台linux.为了方便对linux目录的文件操作.需要在Windows上将linux中的/fdsk目录映射为网络驱动器. a.首先要将linux安装成为sa ...
- 2022年7月13日,第四组 周鹏 JAVA认识的第一天,附加一个用JS写的计算器代码
心情:╭(╯^╰)╮ ╮(╯﹏╰)╭ (╯﹏╰)b 罒ω罒 |*´Å`)ノ ( Ĭ ^ Ĭ ) (ㄒoㄒ) o(╥﹏╥)o /(ㄒoㄒ)/~~ (〒︿〒) ┭┮﹏┭┮ ε(┬┬﹏┬┬)3 ε(┬┬﹏┬ ...
- 使用APICloud AVM多端组件快速实现app中的搜索功能
很多 APP 中都有搜索功能的需求,本文介绍怎么使用 avm 多端组件快速实现搜索功能. 在 APICloud 模块库搜索 animate-UISearchBar,添加到项目.多端组件需要下载源码,引 ...
- 内网渗透-at&schtasks&impacket的使用
内网机器结构 机器账号密码如下: 2008 r2 webserver 域内 web 服务器 本地管理员账号密码 : .\administraotr:admin!@#45 当前机器域用户密码 : god ...
- Serilog日志同步到redis中和自定义Enricher来增加额外的记录信息
Serilog 日志同步到redis队列中 后续可以通过队列同步到数据库.腾讯阿里等日志组件中,这里redis库用的新生命团队的NewLife.Redis组件 可以实现轻量级消息队列(轻量级消息队列R ...