Unity中如何将TMS瓦片映射到3D地球球体并计算其位置与旋转
场景
我正在使用Unity C#开发类谷歌地球的项目,用户拖动相机环绕地球浏览时,会从网络异步加载新的瓦片。目前我已经可以根据瓦片的x、y坐标和缩放级别加载所有TMS瓦片。当前我尝试通过瓦片的x、y坐标计算其在地球“球体”上的摆放位置时变得非常繁琐,我推测是欧拉角和四元数之间的差异导致的。
- 我通过
Camera.main的角度判断任意时刻需要显示的瓦片,该功能目前运行正常 - 出于内存管理需要,我必须动态加载/卸载瓦片,因为10级缩放下会产生超过100万张512x512的瓦片,无法全部常驻内存
- 我正在尝试将下载的2D瓦片x、y坐标转换为3D空间中的位置与旋转值
问题
仅使用瓦片的TMS坐标(范围0,0到63,63),我如何计算出瓦片对应“地球”上的xyz位置,以及对应的xyz旋转值?
补充信息
- 附件截图中我使用的是4级缩放,共64张瓦片
- y轴0对应球体底部,y轴15对应球体顶部
- 目前我主要使用
Mathf.Sin和Mathf.Cos计算位置与旋转

编辑
我已经找到了正确计算瓦片位置的方法,现在卡在了瓦片正确旋转的计算上。
对我帮助最大的代码来自一个用Python生成球体的相关问题,我修改后的代码如下:
// 便捷变量定义 @jkr float ti = tilesInfo["tilesXY"]; // 对应任意轴方向上的瓦片总数量 @jkr float ti2 = ti / 2; float pi = Mathf.PI; float pi2 = pi / 2; float pipi = pi * 2; // 3D瓦片坐标计算 @jkr float phi = keyY / ti * pi; float theta = keyX / ti * pipi; x = Mathf.Sin(phi) * Mathf.Cos(theta) * ER; y = Mathf.Sin(phi) * Mathf.Sin(theta) * ER; z = Mathf.Cos(phi) * ER;

编辑2
添加了@Ruzihm提供的法线计算方案后,瓦片朝向已正确。
编辑3
添加了@Ruzihm提供的shader后,我还做了多处调整让效果更适配,目前仍有优化空间但已经取得了重大进展。
内容的提问来源于stack exchange,提问作者Jacksonkr
相关产品推荐
相关产品推荐

