当前位置: 首页 > java >正文

计算机图形学:(五)坐标系

"全局"坐标系 

  • ① ECEF坐标系(蓝色)

        地心地固坐标系(Earth-Centered, Earth-Fixed,简称ECEF)简称地心坐标系,是一种以地心为原点的地固坐标系,是一种笛卡儿坐标系。其原点为地球的质心,z轴延伸通过的北极(即与地球旋转轴重合),x轴延伸通过本初子午线(0度经度)和赤道(0度纬度)的交点,y 轴垂直于xOz平面(即东经90度与赤道的交点)构成右手坐标系。

        引入ECEF坐标系的主要原因是为了在全球范围内提供统一的三维坐标参考系。这在卫星导航、地球观测和全球地理信息系统中非常重要。在计算机图形学中,三维笛卡尔坐标系更适合进行旋转、缩放等几何变换。

  • ② BLH(橙色)

        大地坐标系,其中B、L、H分别代表纬度、经度、高程。

        两者都可用于表达空间中的某点,只不过一个是经纬度坐标(BLH),一个是笛卡尔坐标(XYZ),而两者是可以相互转换的。篇幅有限,推导部分可参看 👇

        链接:大地经纬度坐标与地心地固坐标的的转换-CSDN博客

"局部"坐标系

  • ① ENU(绿色)

        简介:站心坐标系,指通过给定一个世界坐标点来创建一个局部坐标系。这个局部坐标系以X轴指向东,Y轴指向北,Z轴指向垂直向上的方向,它是一种局部空间直角坐标系。

        用处:引入ENU,是为了方便局部测量和导航。它直观地反应了观测者周围的空间关系,便于理解和使用。

        注意:站心天向(Z轴)与赤道面相交不一定会经过球心。

        比较:相较于用ECEF表示物体位置,ENU可以精简数据体量,比如倾斜摄影数据会有一个xml文件记录建模原点,这个建模原点很多就是ENU坐标系原点在地球上的位置,而此时倾斜摄影的顶点数据就是在ENU坐标系进行描述的,极大的减少了顶点数据的体量,便于进行空间计算。

        ENU与ECEF的转换同样可参看 👇

        链接:地心地固坐标系(ECEF)与站心坐标系(ENU)的转换-CSDN博客

示例

        通常我们会给模型数据一个模糊的大致位置,但放入场景中有时必须给模型定位、微调位置以适应场景。

        当模型定位的位置不是我们想要的位置,可以通过修改该3dtiles的矩阵来改变它,如平移:

/**基于本地的ENU坐标系的偏移,也就是垂直于地表向上为Z,东为X,北为Y* @param tileset Cesium3DTileset* @param dx x轴偏移量。单位:米* @param dy y轴偏移量。单位:米* @param dz z轴偏移量。单位:米*/
function translate(tileset: Cesium3DTileset, dx: number, dy: number, dz: number) {if (dx === 0 && dy === 0 && dz === 0) return// 对于3DTileset,我们需要的结果是一个模型矩阵,那么平移就是计算一个世界坐标下的平移矩阵。// 获取中心点const origin = tileset.boundingSphere.center// 以该点建立ENU坐标系const toWorldMatrix = Transforms.eastNorthUpToFixedFrame(origin)// 该坐标系下平移后的位置const translatePosition = new Cartesian3(dx, dy, dz)// 获取平移后位置的世界坐标const worldPosition = Matrix4.multiplyByPoint(toWorldMatrix, translatePosition, new Cartesian3())// 计算世界坐标下的各个平移量const offset = Cartesian3.subtract(worldPosition, origin, new Cartesian3())// 从世界坐标下的平移量计算世界坐标的平移矩阵const translateMatrix = Matrix4.fromTranslation(offset)// 应用平移矩阵。这里应该与原本的模型矩阵点乘,而不是直接赋值tileset.modelMatrix = Matrix4.multiply(translateMatrix, tileset.modelMatrix, new Matrix4())
}

图源: https://juejin.cn/post/7474809400232280076

        同理对模型做旋转操作:

/**基于本地的ENU坐标系的偏移,也就是垂直于地表向上为Z,东为X,北为Y* @param tileset Cesium3DTileset* @param rx X轴方向旋转角度(单位:度)* @param ry Y轴方向旋转角度(单位:度)* @param rz Z轴方向旋转角度(单位:度)*/
function rotation(tileset: Cesium3DTileset, rx: number, ry: number, rz: number) {const origin = tileset.boundingSphere.center;// 以该点建立ENU坐标系const m = Transforms.eastNorthUpToFixedFrame(origin);//旋转var mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(rx));var my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(ry));var mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(rz));var rotationX = Cesium.Matrix4.fromRotationTranslation(mx);var rotationY = Cesium.Matrix4.fromRotationTranslation(my);var rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);// 旋转矩阵相乘Cesium.Matrix4.multiply(m, rotationX, m);Cesium.Matrix4.multiply(m, rotationY, m);Cesium.Matrix4.multiply(m, rotationZ, m);// 赋值给tilesettileset._root.transform = m;
}

http://www.xdnf.cn/news/9761.html

相关文章:

  • 排序算法-归并排序与快速排序
  • 如何避免客户频繁更换对接人
  • vue3项目 前端文件下载的两种工具函数
  • spring的多语言怎么实现?
  • OSI 七大层详解
  • vue element日期范围选择器只能选择指定天数内的
  • shell脚本实现字符串子网掩码转为位数
  • mqtt协议连接阿里云平台
  • 基于多模态脑电、音频与视觉信号的情感识别算法【Nature核心期刊,EAV:EEG-音频-视频数据集】
  • Deepseek应用技巧-Dify本地化搭建合同审批助手
  • Delphi 导入excel
  • 【东枫科技】KrakenSDR 测向快速入门指南
  • Vision Transformer网络结构
  • 【穷举】数字方格
  • 文件系统与文件管理:从磁盘到内核的全链路解析
  • 高效工具-tldr
  • 网络安全的守护者:iVX 如何构建全方位防护体系
  • 镍钯金PCB有哪些工艺优势?
  • 五、web安全--XSS漏洞(2)--XSS相关payload
  • 《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡
  • Parsel深度解析:从入门到高阶的网页数据抓取艺术
  • python同步mysql数据
  • WPS 免登录解锁编辑
  • 安全访问 std::tuple 的容错方法及气象领域应用
  • R3GAN利用配置好的Pytorch训练自己的数据集
  • Vue-Router中的三种路由历史模式详解
  • MCP入门实战(极简案例)
  • eNSP企业综合网络设计拓扑图
  • linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)
  • 挖洞日记 | Js中的奇妙旅行