首页 > 其他分享 >Cesium 二三维视图联动

Cesium 二三维视图联动

时间:2023-01-20 00:22:05浏览次数:60  
标签:viewer3D .# 三维 视图 scene let Cesium

近期做了二三维视图联动,简单记录一下。

主要功能就是同时开启二维和三维视图一起查看。

大概思路就是新创建一个 2D 视图,将相机进行同步(其实部分资源也应该同步,不过这需要做一个数据状态管理的功能,让数据在两个视图同步,懒得做了,后面要做资源管理的功能再说吧)。

二维和三维视图其实相机焦点是有区别的,因为二维视图只有平移和缩放,没有旋转,故如何正确找到三维视图中的相机焦点是关键。

方法一:获取屏幕中心坐标,转为世界坐标

// canvas 中心位置为相机焦点
let viewCenter = new Cesium.Cartesian2(
    Math.floor(this.#viewer3D.canvas.clientWidth / 2),
    Math.floor(this.#viewer3D.canvas.clientHeight / 2)
);

// 给定中心的像素,获取世界位置
let worldPosition = this.#viewer3D.scene.camera.pickEllipsoid(
    viewCenter,
    this.#viewer3D.scene.globe.ellipsoid
);

方法二:通过射线求交获取坐标

构建射线:

// 构建相机射线
let ray = new Cesium.Ray(
    this.#viewer3D.camera.positionWC,
    this.#viewer3D.camera.directionWC
);

求射线与椭球交点:

方法1:

使用IntersectionTests,获取射线与椭球交点,注意,Intercal 属性包括两个标量,因为交点应该是两个,正面与反面,我们取正面的交点,然后通过 getPoint 方法获取具体坐标

let interval = Cesium.IntersectionTests.rayEllipsoid(
    ray,
    this.#viewer3D.scene.globe.ellipsoid
);
let worldPosition = Cesium.Ray.getPoint(ray, interval.start);

方法2:

 使用 global 中的 pick 方法直接获取

let worldPosition = this.#viewer3D.scene.globe.pick(
    ray,
    this.#viewer3D.scene
)

其实方法还有很多,不一一列举了

获取到坐标后,我们需要获取缩放距离

 Cartesian3 提供了计算方法,我们只需要计算出高度,设置 camera 即可

// 同步相机视角
if (Cesium.defined(worldPosition)) {
    // 计算高度
    let distance = Cesium.Cartesian3.distance(
        worldPosition!,
        this.#viewer3D.camera.positionWC
    );
    this.#viewer2D!.camera.lookAt(
        worldPosition!,
        new Cesium.Cartesian3(0, 0, distance)
    );
}

若想只保存 3D 视图的移动,让 2D 视图跟随,也可关闭 2D 视图的鼠标控制

// 禁止移动缩放
this.#viewer2D.scene.screenSpaceCameraController.enableZoom = false;
this.#viewer2D.scene.screenSpaceCameraController.enableTranslate = false;

完整版请移步LiZzhi/cesium-plugin (github.com),如果对您有帮助,请给我一颗star,谢谢。

标签:viewer3D,.#,三维,视图,scene,let,Cesium
From: https://www.cnblogs.com/xt112233/p/17062346.html

相关文章

  • Cesium + mapv 可视化
    最近将mapv一些官方示例移植到了Cesium上,记录一下问题mapv示例:mapv(baidu.com)mapv本身没有提供类型定义文件,直接通过npm下载的mapv库也只有build好的文件,故......
  • 【C++】【Ctrl+CV即可食用】三维点拟合空间直线
    前景概述网上三维点拟合空间直线的代码很多大多数都是python或者matlab这里贴一个C++的代码原目的是拟合出直线之后任取两个点手动计算一下斜率数学原理最小二乘拟合......
  • 【三维重建系列】相机模型部分公式详解记录
    相机模型P矩阵公式:\[P=KR[I|-C^{\backsim}]\]其中\(C^{\backsim}\)表示平移矩阵为齐次坐标即世界坐标系原点到相机坐标系原点的距离\(R\)同样表达的也是这个关系......
  • 【SLAM与多视图几何】【Fundamental Matrix】F矩阵代数推导详解
    核心图片详解两个视角同时看到了三维空间点中的X在两个视角中分别为二维点x、x'。e'认为是左边相机光心在右边的投影l'可能是对极直线?不过名称不重要重要的是e'和......
  • Cesium源码之Label(二)
    我们查看Cesium源码时,有时会发现源码中有大量的includeStart开头的注释,如下图所示。这里面大多是调试信息,当使用gulp打包时,removePragmas参数设置为true,则会删除includeSt......
  • machsim 三维弯管机干涉检验 仿真模拟软件
      三维弯管机防干涉检验仿真软件: (1)可以集成进windows编程环境,比如C#,dephi,vc,vb等; (2)实时监测干涉位置,并提示干涉部件; (3)支持单步运动,以及连续运动; (4)支持G代......
  • 数字孪生三维可视化场景搭建如何搭建?
    数字孪生不仅是物理世界的镜像,还需接受物理世界的实时信息,反过来实时驱动物理世界,进化为物理世界的先知、先觉甚至超体。这个演变过程被称为成熟进化,即数字孪生体的生长发......
  • BI 可视化工具不只有视图,还有报表
    前言:对于市面上常见的BI可视化工具而言,如FineBI、观远BI、SmartBI、DataEase等,它们所提供的功能并不仅仅是局限于柱状图、折线图、地图、饼图、散点图、热力图等视图。......
  • 3. DRF进阶之DRF视图和常用功能
    DRF视图和常用功能DRF视图DRF视图类介绍在DRF框架中提供了众多的通用视图基类与扩展类,以简化视图的编写。View:Django默认的视图基类,负责将视图连接到URL,HTTP请求方法......
  • Cesium 添加图片无法正常显示,显示为白色
    问题使用Cesium在地球上添加图片,打开控制台(勾选disablecache)时图片正常显示,关闭控制台则显示为白色。(背景:使用Cesium在球上添加图片(四个坐标点)的方法添加了图片)关闭d......