美文网首页
cesium 平滑切换二三维

cesium 平滑切换二三维

作者: haibalai | 来源:发表于2022-01-28 14:24 被阅读0次

很多人用sceneMode 来进行二三维切换 ,其实这样不好用,位置什么的 图层状态都不好绑定,给人体验非常差

对于arcgis 引擎 可以锁视角实现平滑切换,mapbox 引擎也可以锁视角实现,但是对于cesium 也是可以的

首先我们要知道获取中心点方法

function getCenter(viewer: any) {

// debugger

const scene = viewer.scene;

const target = pickCenterPoint(scene);

let bestTarget = target;

const globe = scene.globe;

const carto = scene.camera.positionCartographic.clone();

const height = globe.getHeight(carto);

carto.height = height || 0;

bestTarget = Cesium.Ellipsoid.WGS84.cartographicToCartesian(carto);

const result = formatPosition(bestTarget);

// 获取地球中心点世界位置 与 摄像机的世界位置 之间的距离

const distance = Cesium.Cartesian3.distance(bestTarget, viewer.scene.camera.positionWC);

result.cameraZ = distance;

return result;

}

function pickCenterPoint(scene: any) {

const canvas = scene.canvas;

const center = new Cesium.Cartesian2(canvas.clientWidth / 2, canvas.clientHeight / 2);

const ray = scene.camera.getPickRay(center);

const target = scene.globe.pick(ray, scene);

return target || scene.camera.pickEllipsoid(center);

}

function formatPosition(position) {

const carto = Cesium.Cartographic.fromCartesian(position);

const result = {};

result.y = formatNum(Cesium.Math.toDegrees(carto.latitude), 6);

result.x = formatNum(Cesium.Math.toDegrees(carto.longitude), 6);

result.z = formatNum(carto.height, 2);

return result;

}

function formatNum(num, digits) {

return Number(num.toFixed(digits || 0));

}

第二我们要知道屏幕中心点位置

function getScreenCenter(_viewer: any) {

const viewer = _viewer;

const result = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(viewer.canvas.clientWidth / 2, viewer.canvas.clientHeight / 2));

const curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(result);

const lon = (curPosition.longitude * 180) / Math.PI;

const lat = (curPosition.latitude * 180) / Math.PI;

const height = curPosition.height;

return {

x: lon,

y: lat

};

}

下面我们来定义调用切换二三维的方法, 其中mapType 我定义为mapView和sceneView类型, 哈哈学习arcgis模式

```javascript

type mapType = 'mapView' | 'sceneView';

public changeSV23D(viewer: any, type: mapType) {

const viewer = viewer;

const result: any = getCenter(viewer);

const curPosition = getScreenCenter(viewer);

const center = Cesium.Cartesian3.fromDegrees(curPosition.x, curPosition.y);

if (type === 'sceneView') {

if (viewer.view === 'sceneView') {

return;

}

viewer.scene.screenSpaceCameraController.enableTilt = true;

viewer.view = 'sceneView';

let x = -90;

let pitch;

const range = result.cameraZ * 1.2;

 更多参考 https://xiaozhuanlan.com/topic/7459016328

相关文章

  • cesium 平滑切换二三维

    很多人用sceneMode 来进行二三维切换 ,其实这样不好用,位置什么的 图层状态都不好绑定,给人体验非常差 对...

  • Vue中集成Cesium

    1.Cesium是什么? Cesium是一个地图可视化框架,只是支持三维场景[渲染三维地球] Cesium中的图层...

  • 基于Cesium的单独三维模型浏览

    最近一直在学习Cesium三维GIS框架,今天Cesium交流群中有好友问怎么样用Cesium来开发单独三维模型浏...

  • cesium编程入门(一)cesium简介

    cesium编程入门 cesium是什么 Cesium 是一个跨平台、跨浏览器的展示三维地球和地图的 javasc...

  • cesium 模拟地球自转

    cesium 模拟地球自转 cesium 现有的机制分析 默认情况下,cesium 的球体其实在三维中是保持静止的...

  • Cesium开发基础篇 | 01加载影像数据

    Cesium中的影像图层类 无论是二维地图还是三维地图,如果缺少了底图影像或电子地图,都是不完整的。Cesium为...

  • cesium 切换瓦片地图的加载方式

    cesium 切换瓦片地图的加载方式 如果你熟悉 cesium,那么你或多或少应该用过或者了解如何用 cesium...

  • Cesium的扩展工具包-EarthSDK使用指南1

    Cesium的扩展工具包-EarthSDK使用指南1 前言 Cesium作为三维GIS和BIM应用的主力引擎,目前...

  • 每日一更626--平滑切换,酷炫技

    Day 12、切换-平滑 今天学习并练习的是切换-平滑功能。以前经常使用切换里的页面转换效果,比如大家很常用的卷帘...

  • CesiumJS入门

    一、cesium 基本了解 cesium 是一个跨平台、跨浏览器的展示三维地球和地图的开源 JavaScript ...

网友评论

      本文标题:cesium 平滑切换二三维

      本文链接:https://www.haomeiwen.com/subject/paqtkrtx.html