地球球体
一个带经纬网的球体,纹理由 Canvas 逐像素生成,北京、上海、广州三个坐标按经纬度落在球面上。 这个示例把「经纬度 → 三维坐标」讲完整。
说明
纹理是一张 1024 × 512 的 Canvas,横轴对应经度 −180° 到 180°,纵轴对应纬度 90° 到 −90°。 每个像素用三组正弦叠加判断陆地与海洋,再叠上每 30 度一条的经纬网。 这张图只用于演示材质与坐标换算,形状并不对应真实大陆。
城市标记用同一个换算函数得到球面位置:经度决定绕 Y 轴的角度,纬度决定从北极向下的极角。 标记由球面点、外挑的细杆与顶端小球组成,侧视时更容易辨认。
| 设置 | 取值 | 说明 |
|---|---|---|
| 球体半径 | 1.6 | 场景单位,不代表真实比例 |
| 球体分段 | 96 × 64 | 近看仍平滑,顶点数可控 |
| 纹理尺寸 | 1024 × 512 | 2:1 的等经纬度展开 |
| 标记半径 | 1.608 / 1.728 | 底部贴球面,顶端抬高约 8% |
| 初始朝向 | 绕 Y 轴 180° | 让东经 100° 附近正对镜头 |
| 各向异性 | 硬件上限 | 斜看球面时纹理更清晰 |
经纬度换算的关键
换算核心只有三行:极角 phi = (90 − lat) × π / 180,
方位角 theta = (lon + 180) × π / 180,半径是球半径加高度。
球面坐标转直角坐标时,三个分量的正负号必须与纹理的经度方向一致,
否则标记会左右镜像,看起来「在北京的位置出现了广州的点」。
示例里把整个地球组绕 Y 轴转了 180 度,只是调整初始观察面,不改变换算公式。 如果换成自己提供的底图,需要检查纹理的经度零点与公式是否匹配; 不匹配时,可以整体旋转组来修正,而不是逐个改坐标。
标记为什么抬高
标记球心正好落在球面上时,一半在里一半在外,远看只是一个点。 把它抬到半径的 1.005 倍,再向外拉一根细杆到 1.08 倍, 既不会穿模,又能让标记在球体轮廓之外被看清。
换成真实底图
把 Canvas 换成一张等经纬度的地球影像即可,例如带版权许可的 Natural Earth 或 NASA 蓝色弹珠。
纹理的 colorSpace 要设为 sRGB,经度零点在图片左边。
如果要显示国界、道路,最好在服务端按经纬度切片,而不是用一张超大图硬贴。
球面适合看全球,不适合量距离。半径 1.6 的球让你看清分布, 但屏幕上量出的长度没有地理意义。需要距离、面积时,回到局部平面并使用真实比例。