首页 > 其他分享 >Cesium常见设置视角所用到函数

Cesium常见设置视角所用到函数

时间:2024-07-03 22:00:43浏览次数:20  
标签:视角 const cartographic 所用 四元 pitch Cesium Math

 1.左键拾取经纬度坐标

const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas)
      // 监听鼠标点击事件
      handler.setInputAction(function (click) {
        // 使用pick函数获取点击位置的实际位置
        var cartesian = viewer.scene.pickPosition(click.position);
        if (Cesium.defined(cartesian)) {
          // 将笛卡尔坐标转换为经纬度坐标
          var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
          var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
          var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
          var heightString = cartographic.height.toFixed(2);
          console.log('经度:' + longitudeString + ',纬度:' + latitudeString + ',高度:' + heightString)
        }
        // 使用Scene.pick来获取3D Tiles的实际高度
        var pickedObject = viewer.scene.pick(click.position);
        if (Cesium.defined(pickedObject)) {
          // 获取到3D Tiles的高度
          const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
          const height = cartographic.height;
          const lon=Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
          const lat =Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
          console.log('点击位置的经度是: ' + lon);
          console.log('点击位置的纬度是: ' + lat);
          console.log('点击位置的高度是: ' + height);
        }
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK)

2.获取当前视角heading\pitch\roll 

function getPostion() {
        const camera = viewer.scene.camera
        const cartographic = Cesium.Cartographic.fromCartesian(camera.position)
        const x = Cesium.Math.toDegrees(cartographic.longitude)
        const y = Cesium.Math.toDegrees(cartographic.latitude)
        const z = cartographic.height
        let pt = Cesium.Cartographic.fromDegrees(x, y, z);
        let ellipsoid = viewer.scene.globe.ellipsoid;
        let cartesian3 = ellipsoid.cartographicToCartesian(pt);
        let objinfo = {
            "经度": x,
            "维度": y,
            "高度": z,
            "x": cartesian3.x,
            "y": cartesian3.y,
            "z": cartesian3.z,
            "heading": camera.heading,
            "pitch": camera.pitch,
            "roll": camera.roll
        }
        console.log(objinfo)
    }

3.设置视角至指定位置(相机)

  • setView方法:用于设置相机的位置、朝向和视角。可以一次性设置相机的目标位置(destination)和朝向(orientation
  • flyTo方法:与setView类似,但它是平滑地飞到指定位置,可以设置飞行时间(duration)和完成后的回调函数。
  • lookAt方法:使相机对准指定的位置或实体,但不改变相机的当前高度。它也可以接受一个orientation参数来设置相机的朝向。
  • zoomTo()方法的基本形式接受一个目标参数(如实体、数据源等)和一个可选的HeadingPitchRange对象,用于指定相机的姿态。目标参数可以是EntityEntity[](实体数组)、EntityCollectionDataSource等。
//flyto()
viewer.camera.flyTo({  
    destination: position,  
    orientation: {  
        heading: Cesium.Math.toRadians(0.0), // 正北  
        pitch: Cesium.Math.toRadians(-10.0), // 稍微向下倾斜以更好地观察地面  
        roll: 0.0  
    },  
    duration: 5000  
});

//zoomtTo()
 
var headingPitchRange = new Cesium.HeadingPitchRange(heading, pitch, range);  
viewer.zoomTo(entity, headingPitchRange);

//setViewer()
viewer.camera.setView({  
    destination: Cesium.Cartesian3.fromDegrees(lon, lat, height), // 相机目标位置  
    orientation: { // 相机朝向  
        heading: Cesium.Math.toRadians(heading), // 偏航角  
        pitch: Cesium.Math.toRadians(pitch), // 俯仰角  
        roll: Cesium.Math.toRadians(roll) // 翻滚角  
    }  
});
//lookAt()
var target = Cesium.Cartesian3.fromDegrees(lon, lat, height);  
viewer.camera.lookAt(target, new Cesium.HeadingPitchRange(heading, pitch, range));

3.设置视角至指定位置(实体)

  • 如果你正在添加一个实体(如模型、点、线等)到Cesium中,并且想要设置它的方向(即视角),你可以通过设置该实体的orientation属性来实现。这通常涉及到使用四元数(Quaternion)来表示旋转,但Cesium也提供了HeadingPitchRoll类来简化这个过程。
//orientation属性
var position = Cesium.Cartesian3.fromDegrees(lon, lat, height);  
var entity = viewer.entities.add({  
    position: position,  
    model: {  
        uri: 'path/to/model.gltf',  
        scale: 1.0  
    },  
    orientation: Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(heading, pitch, roll))  
});

Cesium中的四元数(Quaternion)是一种用于表示三维空间中旋转的数学工具,它由四个分量组成,通常表示为(w, x, y, z),其中w是实部,x、y、z是虚部。在Cesium中,四元数主要用于描述物体的旋转和姿态,具有精确、高效和稳定的特点。以下是对Cesium中四元数的详细解释:

一、四元数的基本概念

  • 组成:四元数由一个实部和三个虚部组成,表示为(w, x, y, z)。
  • 旋转表示:在Cesium中,四元数常用于表示物体的旋转。通过四元数,可以精确地描述物体在三维空间中的旋转,且相比欧拉角,四元数没有万向锁问题,能够避免由于旋转顺序引起的计算错误。

二、四元数的应用

  1. 旋转表示
    • 在Cesium中,通过四元数可以精确地描述物体在三维空间中的旋转方向和角度。
    • 使用Transforms.headingPitchRollQuaternion(position, hpr)等方法,可以根据物体的位置(position)和欧拉角(hpr,包括航向heading、俯仰pitch、横滚roll)来计算朝向四元数。
  2. 插值计算
    • 四元数可以用于实现旋转的平滑插值计算。通过对两个四元数进行插值运算,可以实现物体在旋转过程中的平滑过渡,提升视觉效果和用户体验。
  3. 姿态控制
    • 在飞行器模拟、虚拟现实和游戏开发等领域,四元数常用于控制物体的姿态。通过调整四元数的参数,可以精确地控制物体的旋转和姿态,使其符合预期的运动轨迹和角度变化。
  4. 坐标变换
    • 在Cesium中,四元数也常用于实现坐标系之间的变换。通过四元数的乘法运算,可以方便地实现不同坐标系之间的旋转变换,从而实现物体在不同坐标系下的准确定位和旋转。

三、四元数的计算与转换

  • 从欧拉角到四元数:可以使用Cesium提供的Transforms.headingPitchRollQuaternion等方法,根据物体的欧拉角和位置来计算朝向四元数。
  • 从四元数到欧拉角:虽然Cesium直接提供了从欧拉角到四元数的转换方法,但从四元数反推欧拉角可能需要手动计算或使用特定的函数库。
  • 四元数的乘法和归一化:在进行四元数运算时,需要注意四元数的乘法和归一化操作,以确保旋转的正确性和稳定性。

四、结论

Cesium中的四元数作为一种用于描述旋转的数学工具,具有广泛的应用价值。掌握四元数在Cesium中的应用,对于开发基于Cesium的三维应用具有重要意义。通过合理使用四元数,可以精确地描述和控制物体的旋转、姿态和坐标变换,提升三维场景中物体运动的真实感和视觉效果。

标签:视角,const,cartographic,所用,四元,pitch,Cesium,Math
From: https://blog.csdn.net/m0_55049655/article/details/140163062

相关文章

  • CesiumJS【Basic】- #053 绘制渐变填充多边形(Entity方式)-使用canvas
    文章目录绘制渐变填充多边形(Entity方式)-使用canvas1目标2代码2.1main.ts绘制渐变填充多边形(Entity方式)-使用canvas1目标使用Entity方式绘制绘制渐变填充多边形-使用canvas2代码2.1main.tsimport*asCesiumfrom'cesium';constviewer......
  • CesiumJS【Basic】- #054 绘制渐变填充多边形(Entity方式)-使用shader
    文章目录绘制渐变填充多边形(Entity方式)-使用shader1目标2代码2.1main.ts绘制渐变填充多边形(Entity方式)-使用shader1目标使用Entity方式绘制绘制渐变填充多边形-使用shader2代码2.1main.tsimport*asCesiumfrom'cesium';constviewer......
  • 舞会无领导:一种树形动态规划的视角
    没有上司的舞会Ural大学有......
  • Cesium 3DTiles customshader的使用-动态高度设置
    之前要编辑3DTiles 的shader来实现一些例如压平之类的操作 还需要更改源码Cesium新版本更新了3Dtiles的自定义着色器 可以直接定义两个着色器并往里面传uniform新版本添加3dtiles的方式发生了改变 原有的方式不能用了新版本必须通过fromurl函数进行异步添加即asyncfu......
  • AI绘画Stable Diffusion 3.0大模型解锁AIGC写实摄影:摄影构图与视角关键提示,SD3模型最
    大家好,我是设计师阿威在现实摄影领域中,创作出优秀的摄影图像会涉及很多关键技术要素,如:光影效果、摄影构图(摄影机位置:相机与主体的距离)和摄影角度(相机相对于主体的位置)等的选择。这些核心要素对于AIGC绘图(StableDiffusion1.5/XL、Playground、Midjourney)创作也极为重要......
  • 前端视角下的Go语法学习:demo-crud 实现增删改查
    今日话题基于go+gin实现增删改查,仅仅只是提供接口不涉及数据库增删改查作者:云层上的光时间:2024年6月22日10时15分14秒主线任务一、项目创建1、创建demo-crud文件夹2、编辑器打开demo-crud项目,提示设置gosdk,这里我设置了1.22.43、声明go.mod文件go......
  • Cesium 实现可视域分析
    *前言:尝试了网上好多个版本的可视域分析,感觉都有一些问题,我这个也可能不是最完美的,但是我觉得对我来说够用了,实现效果如下*此示例基于vue3上实现,cesium版本1.101.0,vite-plugin-cesium版本1.2.22新建一个名为ViewshedAnalysis.js的JS文件importglslfrom'./glsl2'/**......
  • cesium 添加 Echarts图层(航线图)
    cesium添加Echarts航线图(下面附有源码)1、实现思路1、在scene上面新增一个canvas画布2、通坐标转换,将经纬度坐标转为屏幕坐标来实现3、将ecarts中每个series数组中元素都加coordinateSystem:‘cesiumEcharts’2、示例代码<!DOCTYPEhtml><htmllang=......
  • 云海中的坚固灯塔:等保测评视角下的混合云安全策略与合规性深度剖析
    在数字化浪潮的推动下,混合云架构以其独特的优势成为企业转型升级的得力助手。然而,随着数据资产向云端迁移,安全风险与合规挑战亦如影随形,成为企业前行的绊脚石。等保测评作为我国网络安全的一道坚实屏障,对于护航云环境中数据的安全性具有举足轻重的作用。本文将以等保测评为镜,透......
  • 塑造卓越企业家IP:多维度视角下的策略解析
    在构建和塑造企业家IP的过程中,我们需要从多个维度进行考量,以确保个人品牌能够全面、立体地展现企业家的独特魅力和价值。以下是从不同角度探讨如何做好一个企业家IP的策略。一、从个人特质出发深入了解自我:企业家需要清晰地认识到自己的优势、劣势、价值观和愿景,确保IP能够......