奇技指南

本文作者高峰,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))

},

界世的你当不

只做你的肩膀

360官方技术公众号

技术干货|一手资讯|精彩活动

空·

Hi 新朋友,记得扫描二维码关注我们哟

Three.js 地理坐标和三维空间坐标的转换相关推荐

  1. 2d与2.5d坐标转换_Three.js 地理坐标和三维空间坐标的转换

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

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

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

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

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

  4. 【仓库物资识别】二、将三维点云转换成二维图像

    实习第一个任务其中的一个小步骤是将三维点云转换成二维图像,今天刚好复习PCL的点云滤波部分,发现了一个具有类似功能的平面模型投影滤波--ModelCoefficients 平面参数模型的形式是:ax+ ...

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

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

  6. MATLAB 一二三维矩阵之间转换

    MATLAB 一二三维矩阵之间转换 MATLAB 一二三维矩阵之间转换 低维转高维 高维转低维 前言:今天总结一下MATLAB一二三矩阵或数组之间的转换. 低维转高维   使用reshape函数,执行 ...

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

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

  8. 三维空间坐标的旋转算法详解_视觉slam | 三维空间刚体运动的五种表达:旋转矩阵 变化矩阵 欧拉角 旋转向量 四元数及互相转换...

    原po:高翔slam十四讲-刚体运动 1.旋转矩阵 考虑一次旋转 Before: 坐标系(e1,e2,e3), 向量(a1,a2,a3) After: 坐标系(e1',e2',e3'), 向量(a1' ...

  9. Three.js+GeoJSON实现三维地图显示

    目录 1.GeoJSON 1.1 GeoJSON介绍 1.2 GeoJSON数据获取 2. Three加载GeoJSON数据 2.1 加载并解析GeoJSON 2.2 对JSON数据中的地理坐标进行转 ...

最新文章

  1. C# 参考之访问关键字:base、this
  2. NET插件系统之四——提升系统搜索插件和启动速度的思考
  3. 基于傅里叶算子的手势识别
  4. Java 多条件复杂排序小结
  5. leetcode第一刷_Word Search
  6. 深度强化学习之稀疏奖励(Sparse Reward)
  7. win10任务栏不合并图标如何设置
  8. 关于累加偶数奇数的c语言程序,c语言 在1-100之间,求所有奇数和偶数的个数和所有奇数和偶数的和(写到一个里面)...
  9. 使用M25或M26进行FTP文件下载的程序设计与实现
  10. Ubuntu出现System policy prevents modification of network settings for all users该怎么解决
  11. 存储历史(从古老的绳子记忆到如今)
  12. C语言socket重连和心跳,c# socket 心跳 重连
  13. Scrapy框架的使用之Scrapy入门
  14. delete和delete[]引发的问题
  15. qspi(spi四线模式)
  16. python将数据导出为csv文件时,出现PermissionError: [Errno 13] Permission denied:问题
  17. 第一周 Web开发入门(下)
  18. Android App Bundle 自动打包原理
  19. python_pyecharts画三维折线图
  20. excel自TXT中获取数据

热门文章

  1. 原美团创始人王慧文进军人工智能;极氪完成7.5亿美元A轮融资;Meta正在准备新一轮裁员丨每日大事件...
  2. 免签出国,我们这些懒人的长假有救了
  3. uniapp 登入功能 vuex使用 通俗易懂
  4. 怎么使用ArcMap进行洪水淹没分析
  5. 惠普HP Deskjet 3054 - J610a 一体机驱动
  6. android 5.0 apk 安装失败提示INSTALL_FAILED_INVALID_URI
  7. 店铺推广前准备工作有哪些?
  8. 项目管理 - PM、 SRS、SOW简介及范例
  9. Java 并发编程 常见面试总结
  10. 新一代DirectX10前瞻