奇技指南

本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员

本文转载自奇舞周刊

引言

在实现3D地球时,球面是通过地理贴图渲染的。所以我们所说的地理坐标和三维空间坐标的转换,是指将地理贴图上的坐标,转换为球面坐标(https://en.wikipedia.org/wiki/Spherical_coordinate_system),即three.js中的三维坐标。

在介绍他们之间如何转换之前,我们先来了解下这两种坐标。

地理坐标(贴图坐标)

一个完整的地理贴图坐标 (https://zh.wikipedia.org/wiki/%E5%9C%B0%E7%90%86%E5%9D%90%E6%A0%87%E7%B3%BB)如下,其中第一张为简图,能够帮我们快速理解经纬度与地理坐标,第二张为详细经纬度分布图。

可以看出贴图横向表示经度,范围[-180(西经),180(东经)],竖向表示纬度[-90(南纬), 90(北纬)],因此坐标转化就成了经纬度到球面坐标的转化。

球面坐标

在three.js中,创建球体时有以下几个重要参数:

  • 半径(radius)以及分段数
  • 水平方向起始角度(phiStart)
  • 水平方向角度大小(phiLength)
  • 垂直方向起始角(thetaStart)
  • 垂直方向角度大小(thetaLength)

其中phiStart的默认值0,起始点为x轴负方向。thetaStart的默认值也为0,起始点为z轴正方向。如下图所示:

如上图,其中phi的值为0-Math.PI*2,对应的经度范围为-180到180,所以与经度对应的phi应为180+lng(lng为经度longitude)。theta的值为0-Math.PI,对应的纬度为90到-90,所以与纬度对应的theta值应为90-lat(lat为纬度latitude)。

坐标转换

三角函数计算法

基于上述得出的经纬度和球体创建时角度的对应关系,结合三角函数,我们应该可以很方便地算出对应的三维坐标,如下:

x = - r * sin(theta) * cos(phi)y = r * cos(theta)z = r * sin(theta) * sin(phi)

如下转换为JS代码:

function lglt2xyz(lng, lat, radius) { const phi = (180 + lng) * (Math.PI / 180) const theta = (90 - lat) * (Math.PI / 180) return { x: -radius * Math.sin(theta) * Math.cos(phi), y: radius * Math.cos(theta), z: radius * Math.sin(theta) * Math.sin(phi), }}

three.js自带方法

除了上述直接用三角函数来算以外,我们也可以通过Three.js中的提供的方式来计算。主要涉及THREE.Spherical和THREE.Vector3

THREE.Spherical

THREE.Spherical是three.js中的球面坐标类,用法如下:

var spherical = new THREE.Spherical(radius,phi,theta)

其中的三个参数含义分别如下:

  • radius:半径,默认为1
  • phi: 以y轴正方向为起点的垂直方向弧度值,默认0
  • theta: 以z轴正方向为起点的水平方向弧度值,默认0

可以看出,这里的球面坐标类与我们在定义球时所用的球面坐标中的角是有区别的。phi和theta与上面恰恰相反。对应关系分别为(加’的为此处的角度):

  • phi’ = theta = 90 - lat
  • theta’ = phi - 90 = 90 + lng

THREE.Vector3

THREE.Vector3用于表示三维向量,它有一个setFromSpherical的方法,顾名思义,表示可以从球面坐标得到三维向量坐标。其实,three.js中可以可以实现球面坐标和三维坐标的相互转换,THREE.Spherical也存在类似的setFromVector3方法。

综上,通过three.js自带的方法来转换经纬度时可以用以下方法:

lglt2xyz(lng, lat, radius) { const theta = (90 + lng) * (Math.PI / 180) const phi = (90 - lat) * (Math.PI / 180) return (new THREE.Vector3()).setFromSpherical(new THREE.Spherical(radius, phi, theta))},

2d与2.5d坐标转换_Three.js 地理坐标和三维空间坐标的转换相关推荐

  1. 三维坐标转经纬度_Three.js 地理坐标和三维空间坐标的转换

    编者按:本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员. 一.引言 在实现3D地球时,球面是通过地理贴图渲染的.所以我们所说的地理坐标和三维空间坐标的转换,是指将地理贴图上的 ...

  2. Three.js 地理坐标和三维空间坐标的转换

    奇技指南 本文作者高峰,360奇舞团前端工程师,W3C性能工作组/WOT工作组成员 本文转载自奇舞周刊 引言 在实现3D地球时,球面是通过地理贴图渲染的.所以我们所说的地理坐标和三维空间坐标的转换,是 ...

  3. 2d与2.5d坐标转换_ArcGIS中坐标系统定义与投影转换(包含定义三参七参)

    坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统的GIS数据是不完善的,因此在ArcGI ...

  4. 2D与2.5D坐标转换公式推导

    2D与2.5D的关系可以看成X轴与Y轴旋转了指定的角度后形成的新的平面. 首先需要知道坐标旋转算法: 通过矩阵的知识可以知道,X轴的基向量为[1,0]:Y轴的基向量为[0,1].有X和Y轴基向量组成的 ...

  5. 2d与2.5d坐标转换_视觉SLAM:搞定坐标系、三角测量、PnP

    1.正文 四个坐标系:世界坐标系.相机坐标系.图像坐标系.像素坐标系. 世界坐标系:机器人或相机运动过程中,肯定需要知道它的位置,因此需要设定世界坐标系,认定固定不动,作为 参考坐标系,描述世界中的任 ...

  6. 时间戳显示为多少分钟前,多少天前的JS处理,JS时间格式化,时间戳的转换

    var dateDiff = function (timestamp) {// 补全为13位var arrTimestamp = (timestamp + '').split('');for (var ...

  7. js实现网页简繁体自动转换

    js实现网页简繁体自动转换 页面内容如下: <!DOCTYPE html> <html lang="en"> <head><meta ch ...

  8. php时间戳和js时间戳,js和PHP时间戳与日期转换

    js 时间戳转日期: function getYMDhms(time){ var date = new Date(parseInt(time) * 1000); //获取一个时间对象 注意:如果是ui ...

  9. three 天空球_three.js添加场景背景和天空盒(skybox)

    本文我们介绍在three.js中如何给3D场景添加背景,我们有3种方式来实现这个目的.通过html添加背景元素,这实际上一个2D背景: 在three.js加载图片并设置为scene.backgroun ...

最新文章

  1. SSPL的MongoDB再被抛弃,GUN Health也合流PostgreSQL
  2. 大型网站架构模式之二
  3. java 跟踪错误程序_Java异常处理 如何跟踪异常的传播路径
  4. vue项目中遇到的一些问题
  5. 并联匹配和串联匹配的原理和选择
  6. 使用Vitamio打造自己的Android万能播放器(1)——准备
  7. CSS浏览器兼容性----Hack
  8. 鸿蒙硬件HI3861开发环境搭建
  9. awk -f 分隔符 命令_Linux awk命令详解(详解版)
  10. java用JDBC连接数据库的方式
  11. 汇编学习--7.17--键盘输入和磁盘读写
  12. UISearchBar背景透明,去掉背景,自定义背景
  13. 六自由度机械臂参数化设计
  14. 树莓派+内网穿透实现远程监控
  15. 购买完域名之后能干什么事儿?
  16. 【Java】工作流框架JBPM
  17. oracle12清理内存,ORACLE 12.1 内存消耗完宕机
  18. 1521端口 mysql_Linux开放1521端口允许网络连接Oracle Listener
  19. 【2.0版】监测数据处理系统-自动导出监测日报表、周报表及月报表(基坑监测、地铁监测)V2.0
  20. 函数msgsnd()及函数msgrcv()参数详解

热门文章

  1. caffe 人脸关键点检测_全套 | 人脸检测 人脸关键点检测 人脸卡通化
  2. python基础教程:将一个列表切分成多个小列表
  3. Python:序列的copy() 方法和 copy 模块
  4. python编程面试题
  5. linux 命令读db文件格式,使用linux的db_load命令生成db数据库
  6. nginx报错:nginx: [alert] could not open error log file: open() “/var/log/nginx/error.log“ failed (2: N
  7. linux ubuntu QT 下载和安装(Qt Creator)
  8. python如何删除文件夹下文件和文件夹?
  9. Markdown如何插入LaTeX公式?(在线LaTeX公式编辑器)
  10. 机器学习中 True Positives(真正例TP)、False Positives(假正例FP)、True Negatives(真负例TN)和 False Negatives(假负例FN)指什么