前言

本文将讲解如何通过球形全景图上的二维坐标通过换算得到三维坐标系上的三维坐标。具体场景就是,已知道一张全景图上某个点的像素位置(px,py),最终可以算出该点对应在球体上的三维坐标(X,Y,Z)。

相关概念

在说明原理之前,有几个概念是必须了解的。
首先是全景图研究中几个比较常见/常听的三维坐标系:

1. 三维直角坐标系(三维笛卡尔坐标系)

在二维笛卡尔坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的。
不过多介绍了,从小学到大的东西。

2. 球坐标系[摘自百度]

球坐标系是三维坐标系的一种,用以确定三维空间中点、线、面以及体的位置,它以坐标原点为参考点,由方位角、仰角和距离构成。
球坐标的几何意义:原点到 P 点的距离 r ,原点到点 P 的连线与正 z-轴之间的天顶角θ以及原点到点 P 的连线,在 xy-平面的投影线,与正 x-轴之间的方位角φ。

易混淆点:
经纬度与球面坐标系上的“方位角”和“天顶角”的是否一致?
两者不同,经纬度是通过由椭球面为基准面的坐标地理坐标系统(大地坐标系)计算得到。说白了,就是一个是对椭球体的空间关系的表示,一个是对球体的空间关系的表示。

3. Unity的世界坐标系(左手坐标系)

Unity的世界坐标系其实就是左手坐标系,也就是Z轴为正,X轴为右,Y轴为上。

坐标转换原理

转换的前提条件:

  • 完整的全景平面图
  • 全景平面图比例是2:1

完整的转换流程为:
二维坐标 ——> 球面坐标系坐标 ——> 直角坐标系

1. 全景图二维坐标与球面坐标系的对应关系

如下图所示,因为全景图是直接投影到球体上来显示的,也就是说平面的二维信息是直接对应着球体上的三维信息。 (里面用的是球面坐标系)

按照全景图投影的原理,想象一下你现在站在坐标系的原点上,你正面朝着X轴的正方向望去,全景平面图的最左边到最右边的内容相当于以你水平位置-180°到180°的内容,从最上边到最下边内容相当于以你垂直位置90°到-90°的内容。
对于平面上的二维坐标,根据全景图的长和宽,就可以映射出对应球面上的天顶角θ和方位角φ。

计算出(φ,θ)的公式为:

注意这个的方位角φ是与y轴的夹角,也就是说φ不是我们平时理解的二维坐标系的0到y轴上的值,而是π/2到y轴上的值(可以理解为等于py线段的值)。

2. 球面坐标系与直角坐标系的转换

在上一步算出天顶角和方位角之后,根据球体的半径(r)计算出直角坐标系上的三维坐标就很简单了,无非就是三角函数的计算,下面直接跳过公式推导过程。【需要注意的是,输出的目标三维坐标系不同,计算的方式略有不同!】

  • 计算直角坐标系(三维笛卡尔坐标系)的三维坐标
  • 计算Unity的世界坐标系(左手坐标系)的三维坐标

至此,由平面二维坐标转换到三维坐标系上的三维坐标已经结束,其实原理很简单,只是说比较容易搞混淆要输出的坐标系和一些概念导致算错结果。
反之,从三维坐标转换到二维坐标原理也是一样,这里就不做论述了。

Unity学习笔记 球形全景图平面像素坐标与三维坐标系上的坐标之间的转换相关推荐

  1. Unity学习笔记 解决Cinemachine AutoDolly的虚拟相机在轨道上不按轨道前进方向运动的问题

    问题 在使用Cinemachine提供的Tracked Dolly来做路径运动时,若绘制的轨道有交错或者相对接近的地方,可能会出现摄像机没有按照轨道前进的方向实时移动而跳回到了原来的轨道上的情况. 解 ...

  2. Unity学习笔记1 简易2D横版RPG游戏制作(一)

    这个教程是参考一个YouTube上面的教程做的,原作者的教程做得比较简单,我先参考着做一遍,毕竟我也只是个初学者,还没办法完全自制哈哈.不过我之前也看过一个2D平台游戏的系列教程了,以后会整合起来,做 ...

  3. 千锋Unity学习笔记

    学习笔记:[千锋合集]史上最全Unity3D全套入门教程|匠心之作 文章目录 初级 1.0数学 1.0点乘叉乘 1.点乘: 2.叉乘: 2.0Mathf 3.0Vector 4.0旋转 2.0组件 3 ...

  4. 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码

    [Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...

  5. unity学习笔记-番外(3d模型的动作设计以及导入-2018版)材质的替换以及动作穿模(自己的手穿模到自己的其他部位)

    unity学习笔记-番外(3d模型的动作设计以及导入) 动作设计白嫖方法 方法一:小k网 需要注意的地方 方法二:mixamo 需要注意的地方 材质的替换 一 动作的穿模 2021.5.13更新 -2 ...

  6. 【Unity学习笔记】b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别)

    [Unity学习笔记]b站Unity架构课Unity3D 商业化的网络游戏架构(高级/主程级别) 自己跟着学完了,写了不少代码,会放在CSDN代码库,因为老师并没有提供源码,录屏也不是完全连续,所以难 ...

  7. Unity学习笔记——Mesh

    Unity学习笔记--Mesh Unity中的Mesh组件是一个很好玩的东西,这次的目标是根据高程图创建出一个平面. 1.用脚本创建一个简单的三角形 新建空的物体,挂上MeshFilter.MeshR ...

  8. [Unity学习笔记:FPS游戏制作(3)]子弹拖尾,碰撞与枪口火焰效果

    往期博客[Unity学习笔记:FPS游戏制作(2)] 发射子弹----(2021.6.20学习笔记) 文章目录 一,实现思路 二,粒子效果的实现 (1)子弹拖尾特效的实现 (2)枪口火焰特效的实现 ( ...

  9. [Unity学习笔记:FPS游戏制作(2)] 发射子弹————(2021.6.20学习笔记)

    往期博客 [Unity学习笔记:FPS游戏制作(1)]角色的移动,旋转与推进上升----(2021.6.13学习笔记) 文章目录 一,实现思路 二,实现代码 三,脚本的使用方法 四,最终效果 一,实现 ...

最新文章

  1. 细粒度语义分割:ICCV2019论文解析
  2. OpenCV神经网络ANN代码编译运行与解读(二)
  3. dalvik Java类库中本地类
  4. 计算机组成要素三:时序逻辑:构建计算机随机存取单元RAM及计数器PC
  5. Laravel 学习笔记之 Query Builder 源码解析(下)
  6. 一款非常好看的雷姆背景的时间单页(附雷姆图片)
  7. 整理 linux常用命令及工具
  8. 抓包工具Charles —— 绿化、抓包入门
  9. 怎样固定计算机桌面背景,Win7桌面背景老是被修改如何将其锁定不让他人随意修改...
  10. Redis客户端Lettuce深度分析介绍
  11. 中国富豪第一桶金挖掘的九大方式
  12. Coding(码市)教程(一):基础配置
  13. 郑州轻工业大学 2021-2022(1)期末模拟测试一 答案
  14. Theano安装教程
  15. 两步解决macbook电池不充电
  16. 服务器返回状态码说明
  17. GlusterFS扩展操作及性能测试工具
  18. IDEA怎么使折叠合并的文件夹分开
  19. 传智播客设计学院简介网页代码
  20. RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播之EasyNVR流媒体服务器系列产品直播延时问题解析

热门文章

  1. 橘子学ES12之DSL搜索
  2. STM32芯片ADC内部的CH17参考电压的用途
  3. 基于DES和RSA算法自动分配密钥的加密聊天程序
  4. 智能车入门——‘教程引导’ <新手从零做车>
  5. 常用照片尺寸和纸张尺寸参考
  6. Perl操作excel2007的模块
  7. 通信原理|Chapter1.绪论
  8. Ng-Alain 菜单图标引入iconfront 版本9.5.5
  9. Python 将一个已知的 utc时间字符串 转换为东八区时间
  10. 女人是这样哄的,学以致用