首页 > 其他分享 >Cesium相机移动操作_Addam Holmes的博客

Cesium相机移动操作_Addam Holmes的博客

时间:2022-11-30 11:33:39浏览次数:58  
标签:Holmes 相机 camera 偏移量 摄像机 Camera Cesium Addam

Cesium相机移动操作

Cesium摄像机的移动有两种方式,一种就是单纯设置其移动属性,比如前进后退,一种就是设置聚焦到某一模型。

1:Cesium设置摄像机聚焦

(1)viewer.flyTo

使用方法viewer.flyTo(target, options)

可以看到上一结有一个window.viewer.flyTo,其实flyto就是聚焦模型的方式之一。

将摄像机飞到提供的实体、实体或数据源。 如果数据源仍在加载过程中,或者可视化仍在加载, 此方法在执行飞行之前等待数据准备就绪

偏移是位于边界球体中心的局部东北向上参考系中的航向/俯仰/范围。 航向和俯仰角在局部的东北偏上参考系中定义。 航向是从 y 轴开始向 x 轴递增的角度。俯仰是从 xy 平面开始的旋转。正音高 角度在平面上方。负俯仰角位于平面下方。范围是与中心的距离。如果范围是 零,将计算一个范围,以使整个边界球体可见。

在这里插入图片描述

for一个exemple(this.tilesetModel是要飞去聚焦的模型位置)

window.viewer.flyTo(this.tilesetModel, {
    offset : {
        heading : Cesium.Math.toRadians(-198 * (Math.PI/180)),//方向,以弧度为单位的航向角。
        pitch : Cesium.Math.toRadians(-180 * (Math.PI/180)),//倾斜角度,以弧度为单位的俯仰角。
        range : 450,	//	距离市中心的距离(米)。
    }
});

(2)camera.flyTo

使用方法camera.flyTo(options)

将摄像机从当前位置飞到新位置。

在这里插入图片描述

(3)camera.lookAt

使用目标和偏移设置相机位置和方向。目标必须在世界坐标。偏移可以是笛卡尔或以目标为中心的局部东北向上参考系中的航向/俯仰/范围。 如果偏移量是笛卡尔,则它是与变换矩阵定义的参考系中心的偏移量。如果偏移量是航向/俯仰/范围,则航向和俯仰角在变换矩阵定义的参考系中定义。 航向是从 y 轴开始向 x 轴递增的角度。俯仰是从 xy 平面开始的旋转。正音高 角度位于平面下方。负俯仰角位于平面上方。范围是与中心的距离。 在 2D 中,必须有一个自上而下的视图。相机将放置在目标上方向下看。高于 目标将是偏移量的大小。标题将从偏移量确定。如果标题不能 根据偏移量确定,航向将为北。

使用方式lookAt(target, offset)

参数解释

  1. target:笛卡尔3(Cartesian3)——世界坐标中的目标位置。
  2. offset:笛卡尔3(Cartesian3)/航向间距范围(HeadingPitchRange)——以目标为中心的局部-北向上参考系中与目标的偏移。

关于笛卡尔3参加笛卡尔3 - 铯文档 (cesium.com)

关于航向间距范围参见标题间距范围 - 铯文档 (cesium.com)

使用HeadingPitchRange设置相机偏移量,其中range参数表示相机的偏移距离。

例如聚焦到某一车辆(变量lon就是经纬度,angle就是车辆转向角,(0, -50, 25)表示摄像机飞到车辆的后面50m上面25m的位置,也就是俯视图。

let positions = new Cesium.Cartesian3.fromDegrees(lon, lat, 0)
let headingPitchRolls = new Cesium.HeadingPitchRoll(angle,0,0)
let orientations = Cesium.Transforms.headingPitchRollQuaternion(positions,headingPitchRolls)

let transform = Cesium.Transforms.eastNorthUpToFixedFrame(positions);
transform = Cesium.Matrix4.fromRotationTranslation(Cesium.Matrix3.fromQuaternion(orientations), positions);
window.viewer.camera.lookAtTransform(transform, new Cesium.Cartesian3(0, -50, 25))

(4)trackedEntity跟随

id为要跟随的车辆编号

let entity = window.viewer.entities.getById(id)
window.viewer.trackedEntity = entity

ps: 该方法简单,但是会出现两个问题:
1、偏航角度无法更随
2、移动物体可能会出现抖动现象

(5)解除聚焦跟随

通过使用setView或lookAt设置视角后,视角将锁定,鼠标无法拖动画面
需要再次调用如下方向,可解除视角锁定。

window.viewer.trackedEntity = undefined;
window.viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);

2:摄像机移动

CesiumJS中的Camera控制场景的视图。有很多方法可以操作Camera,如旋转(rotate)、缩放(zoom)、平移(pan)和飞到目的地(flyTo)。CesiumJS有鼠标和触摸事件用来处理与Camrea的交互,还有API来以编程方式操作摄像机。

在初始状态下Cesium的鼠标就已经注册了如下操作

鼠标操作 3D Columbus视角
左键+ 拖拽 旋转地球 在地图上移动
右键 + 拖拽 缩放 缩放
中键滚轮 缩放 缩放
中键 + 拖拽 倾斜地球 倾斜地球
平移pan

moveRate为移动距离

// 向前
camera.moveForward(moveRate);
// 向后
camera.moveBackward(moveRate);
// 向上
camera.moveUp(moveRate);
// 向下
camera.moveDown(moveRate);
// 向左
camera.moveLeft(moveRate);
// 向右
camera.moveRight(moveRate);

Camera给定范围或位置

函数设置Camera给定范围或位置和目标的Camera位置和方向。例如:

var west = Cesium.Math.toRadians(-77.0);
var south = Cesium.Math.toRadians(38.0);
var east = Cesium.Math.toRadians(-72.0);
var north = Cesium.Math.toRadians(42.0);
var extent = new Cesium.Extent(west, south, east, north);
camera.viewExtent(extent, Cesium.Ellipsoid.WGS84);

常用的方法

Camera一些最常用的方法如下:

Camera.setView(options):在特定位置和方向立即设置相机。
Camera.zoomIn(amount): 沿着视角矢量移动摄像机。
Camera.zoomOut(amount)]: 沿视角矢量向后移动摄像机。
Camera.flyTo(options): 创建从当前相机位置到新位置的动画相机飞行。
Camera.lookAt(target, offset): 定位并定位摄像机以给定偏移量瞄准目标点。
Camera.move(direction, amount): 朝任何方向移动摄像机。
Camera.rotate(axis, angle): 绕任意轴旋转相机。
置的动画相机飞行。
Camera.lookAt(target, offset): 定位并定位摄像机以给定偏移量瞄准目标点。
Camera.move(direction, amount): 朝任何方向移动摄像机。
Camera.rotate(axis, angle): 绕任意轴旋转相机。

本文转自 https://blog.csdn.net/m0_55534317/article/details/127960492,如有侵权,请联系删除。

标签:Holmes,相机,camera,偏移量,摄像机,Camera,Cesium,Addam
From: https://www.cnblogs.com/hustshu/p/16937899.html

相关文章

  • cesium动态改变primitive,entity模型颜色
    pick.id.point.color=newCesium.Color(1.0,0.0,0.0,1);参考:https://blog.csdn.net/A873054267/article/details/103879210(Cesium实时动态渲染更新物体的颜色)(轮询......
  • vite 集成 cesium
    教程原文:https://www.cnblogs.com/LiZiheng/p/16295263.html安装依赖vite-plugin-cesiumhttps://github.com/nshen/vite-plugin-cesium/blob/main/src/index.tspnpm......
  • Cesium阴影相关
    目的记录一下自己学习Cesium阴影相关的内容,避免以后又重复踩坑阴影的加载阴影的加载其实很简单,只需要加载地球的时候设置对应的参数即可viewer.scene.globe.enableLi......
  • Cesium调试技巧
    起因感觉每次想要去debugger的时候都得查文档,感觉很麻烦,干脆归纳一些到目前为止个人使用较多的一些Cesium查错技巧,方便以后回顾3dTiles属性查询针对3dTiles的封装,其实C......
  • Cesium关于3Dtiles的细节分享
    介绍介绍一下Cesium中有关3dTiles的奇淫技巧,存在一些埋坑的地方,以下内容仅为自己摸索的细节和方法,仅供参考,若有更好的办法欢迎讨论通用快速获取feature中包含的属性信息......
  • Cesium通用的平移方法
    原理通过eastNorthUpToFixedFramem,获取包围盒中心点的东北天矩阵,再通过偏移向量的点乘该东北天矩阵获取到最终的位置,最后让最终的位置与模型包围盒的中心点相减得到模型真......
  • Cesium获取BIM模型整栋与每一层的高度信息
    原因最近因为有这样的需求,但是BIM模型内部又没有Height的高度字段,因此只能通过加载模型中的包围盒去获取整栋及每一层之间的高度。记录一下。缺点获取的层的高度并不是......
  • Cesium之ColorMaterialProperty颜色材质属性
    Cesium自定义材质Material以及一些思考:https://blog.csdn.net/GhostPaints/article/details/124382690Cesium中自定义材质(以飞线材质为例):https://blog.csdn.net/qq_332352......
  • Cesium通过离屏渲染获取实现无人机侦察
    所需知识1、一定的WebGL原理,懂得帧缓冲区原理即FBO2、对Cesium源码有一定的研究原理创建飞机下方摄像机的视图,在Cesium渲染的时候,多获取一帧,把这一帧渲染到飞机下方视......
  • Cesium积雪效果
    Cesium积雪效果原理参考PS:以下默认为自定义着色器的做法--Cesium1.87后的版本;之前的版本做法为后处理,但后处理实现的话鼠标移动会出现闪屏的现象,故不作考虑。1、获取视......