用threejs做3D应用时,很经常会接触到球状物体,比如说地球,要定义球上的一点,用经纬度是常用的办法。现在,我们要在北京这个地方标一个点,北京的坐标为——北纬39.9”,东经116. 3”,该怎么做呢?
其实这就要用到“经纬度转换成xyz坐标”,因为在threejs中时以xyz来定义物体位置的。
坐标分析法
如下图所示,要求球上一点D的xyz坐标:
从上面的图就可以直观分析出D点的xyz坐标:
y=OE=ODsin∠DOB
OB=ODcos∠DOB
z=OA=OBcos∠AOB
x=OC=OBsin∠AOB
下面是一个实现:
/*** 经纬度转xyz* @param longitude 经度* @param latitude 纬度* @param radius 半径*/
function lglt2xyz(longitude,latitude,radius){var lg = degToRad(longitude) , lt = degToRad(latitude);var y = radius * Math.sin(lt);var temp = radius * Math.cos(lt);var x = temp * Math.sin(lg);var z = temp * Math.cos(lg);// console.log(x+","+y+","+z);return {x:x , y:y ,z:z}
}
旋转法
在threejs中位置本质是一个向量,因此也可以通过向量的旋转来获得最终位置,如下所示:
先选一个特殊的向量作为旋转的起点,如在Z轴上的向量 OA,其经纬度都为0,那么∠AOB 就是经度,∠BOC 就是纬度,这样,
(1)让 OA 先以y轴为轴,旋转经度角度,得到 OB
(2) 将 OB 顺时针旋转 90 度 ,就能得到平面 BOC 的法向量 OD (这里没有画出,它是在OA 的左侧)
(3)让 OB 以 OD 为轴 ,旋转纬度角度,就得到 OC
这个可以直接通过向量的旋转就得到目标的坐标位置,还未用代码验证。