前言
本文将讲解如何通过球形全景图上的二维坐标通过换算得到三维坐标系上的三维坐标。具体场景就是,已知道一张全景图上某个点的像素位置(px,py),最终可以算出该点对应在球体上的三维坐标(X,Y,Z)。
相关概念
在说明原理之前,有几个概念是必须了解的。 首先是全景图研究中几个比较常见/常听的三维坐标系:
1. 三维直角坐标系(三维笛卡尔坐标系)
在二维笛卡尔坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的。 不过多介绍了,从小学到大的东西。
球坐标系是三维坐标系的一种,用以确定三维空间中点、线、面以及体的位置,它以坐标原点为参考点,由方位角、仰角和距离构成。 球坐标的几何意义:原点到 P 点的距离 r ,原点到点 P 的连线与正 z-轴之间的天顶角θ以及原点到点 P 的连线,在 xy-平面的投影线,与正 x-轴之间的方位角φ。 易混淆点: 经纬度与球面坐标系上的“方位角”和“天顶角”的是否一致? 两者不同,经纬度是通过由椭球面为基准面的坐标地理坐标系统(大地坐标系)计算得到。说白了,就是一个是对椭球体的空间关系的表示,一个是对球体的空间关系的表示。
3. Unity的世界坐标系(左手坐标系)
Unity的世界坐标系其实就是左手坐标系,也就是Z轴为正,X轴为右,Y轴为上。
坐标转换原理
转换的前提条件:
完整的转换流程为: 二维坐标 ——> 球面坐标系坐标 ——> 直角坐标系
1. 全景图二维坐标与球面坐标系的对应关系
如下图所示,因为全景图是直接投影到球体上来显示的,也就是说平面的二维信息是直接对应着球体上的三维信息。 (里面用的是球面坐标系)
按照全景图投影的原理,想象一下你现在站在坐标系的原点上,你正面朝着X轴的正方向望去,全景平面图的最左边到最右边的内容相当于以你水平位置-180°到180°的内容,从最上边到最下边内容相当于以你垂直位置90°到-90°的内容。 对于平面上的二维坐标,根据全景图的长和宽,就可以映射出对应球面上的天顶角θ和方位角φ。
计算出(φ,θ)的公式为:
注意这个的方位角φ是与y轴的夹角,也就是说φ不是我们平时理解的二维坐标系的0到y轴上的值,而是π/2到y轴上的值(可以理解为等于py线段的值)。
2. 球面坐标系与直角坐标系的转换
在上一步算出天顶角和方位角之后,根据球体的半径(r)计算出直角坐标系上的三维坐标就很简单了,无非就是三角函数的计算,下面直接跳过公式推导过程。【需要注意的是,输出的目标三维坐标系不同,计算的方式略有不同!】
- 计算直角坐标系(三维笛卡尔坐标系)的三维坐标
- 计算Unity的世界坐标系(左手坐标系)的三维坐标
至此,由平面二维坐标转换到三维坐标系上的三维坐标已经结束,其实原理很简单,只是说比较容易搞混淆要输出的坐标系和一些概念导致算错结果。 反之,从三维坐标转换到二维坐标原理也是一样,这里就不做论述了。
|