You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后,我还做了多处调整让效果更适配,目前仍有优化空间但已经取得了重大进展。
应用Ruzihm的shader后的截图

内容的提问来源于stack exchange,提问作者Jacksonkr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:24:05