大家好,
我试图将基于经度和纬度的位置转换为vector3位置,该位置将放置在Unity中的球体上。但是,该位置似乎一直处于关闭状态(与实际位置相比)。
我现在使用以下代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class testPosLatLong : MonoBehaviour {
public float longi;
public float lati;
public float radius;
public Transform marker;
// Use this for initialization
void Start () {
// Transfer to Radians from Degrees
float templongi = longi * Mathf.PI / 180;
float templati = lati * Mathf.PI / 180;
float Xpos = radius * Mathf.Cos(templati) * Mathf.Cos(templongi);
float Ypos = radius * Mathf.Cos(templati) * Mathf.Sin(templongi);
float Zpos = radius * Mathf.Sin(templati);
Debug.Log ("X, Y, Z" + Xpos + " " + Ypos + " " + Zpos);
// Set the X,Y,Z pos from the long and lat
Instantiate(marker);
marker.position = new Vector3 (Xpos, Zpos, Ypos);
}
// Update is called once per frame
void Update () {
}
}
我试图将经度和纬度设置为零,看起来它在球体上的位置正确:
但是当我尝试阿姆斯特丹的经度和纬度时,例如它给出了以下结果(左侧),而它应该是右侧的结果。
我错过了什么或者这里出了什么问题?我试过谷歌搜索,但无法找到任何可以解释我当前问题的东西。项目本身可以在这里找到:https://wetransfer.com/downloads/31303bd353fd9fde874e92338e68573120171205170107/1208ac%3E
希望有人可以提供帮助。
答案 0 :(得分:3)
我认为你的地球是错的。很难从你的图像中看到,但对我来说,赤道看起来像是在一个错误的位置,北极看起来太拥挤了格陵兰岛。我怀疑是否与您用于将地球图像粘贴到球体上的投影有关。
通常,有非常复杂的方法将2D地图/图像投影到3D表面上。关于如何准确地做到这一点,有一整个地理空间分析领域。这是一个棘手的问题。
此外,实际的地球并不是一个球体,所以这也可能会给你带来错误,但我猜这些会导致你描述的错误要小得多。准确的地图将3D地球视为“大地水准面”。为了获得本地精确的地图,人们通常在小范围内以不同方式投影数据,以最大限度地提高当地规模否则你会看到很大的扭曲。因此,当您放大全局地图时,预测实际上会发生显着变化。
测试问题来源的一种可能方法是在地图图像和地球上设置已知坐标的控制点,然后测试它们是否排成一行。就像在阿姆斯特丹应该在地球上的地方,以及它在实际图像上的位置,将尖峰伸出世界。如果这两个没有对齐,那么你可以非常确定你的问题所在。这称为“地理配准”。
我认为对于3D投影,您可能至少需要4个这样的“控制点”。您可以查看stackexchange上的地理空间社区,了解有关投影地图和在坐标系之间交换的更多详细信息。