经度和纬度到 Unity 球体上的位置
Longitude and Latitude to location on sphere in Unity
大家好,
我正在尝试将基于经度和纬度的位置转换为 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
希望有人能提供帮助。
我觉得你的地球仪出了什么问题。从你的照片上很难看出来,但对我来说,赤道的位置有点不对,北极看起来挤满了格陵兰岛。我怀疑这与您用来将地球图像粘贴到球体上的投影有关。
通常有非常复杂的方法可以将 2D maps/images 投影到 3D 表面上。整个地理空间分析领域都在研究如何准确地做到这一点。这是一个棘手的问题。
此外,实际的地球并不完全是一个球体,因此这也可能会给您带来错误,但我猜这些会导致比您描述的小得多的错误。准确的地图将 3D 地球表示为 "geoid"。为了获得局部准确的地图,人们通常会在小区域以不同方式投影数据,以最大限度地提高局部范围内的准确性。否则你会看到很大的扭曲。因此,当您放大全球地图时,投影实际上会发生显着变化。
测试问题出处的一种可能方法是在地图图像和地球上设置已知坐标的控制点,然后测试它们是否对齐。就像在阿姆斯特丹在地球上应该在的位置以及在实际图像上的位置放置一个尖刺。如果这两个不一致,那么您可以很确定问题出在哪里。这叫做"Georeferencing".
我认为对于 3D 投影,您可能至少需要 4 个这样的 "control points"。您可以查看 stackexchange 上的地理空间社区,了解有关投影地图和坐标系之间交换的更多详细信息。
大家好,
我正在尝试将基于经度和纬度的位置转换为 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
希望有人能提供帮助。
我觉得你的地球仪出了什么问题。从你的照片上很难看出来,但对我来说,赤道的位置有点不对,北极看起来挤满了格陵兰岛。我怀疑这与您用来将地球图像粘贴到球体上的投影有关。
通常有非常复杂的方法可以将 2D maps/images 投影到 3D 表面上。整个地理空间分析领域都在研究如何准确地做到这一点。这是一个棘手的问题。
此外,实际的地球并不完全是一个球体,因此这也可能会给您带来错误,但我猜这些会导致比您描述的小得多的错误。准确的地图将 3D 地球表示为 "geoid"。为了获得局部准确的地图,人们通常会在小区域以不同方式投影数据,以最大限度地提高局部范围内的准确性。否则你会看到很大的扭曲。因此,当您放大全球地图时,投影实际上会发生显着变化。
测试问题出处的一种可能方法是在地图图像和地球上设置已知坐标的控制点,然后测试它们是否对齐。就像在阿姆斯特丹在地球上应该在的位置以及在实际图像上的位置放置一个尖刺。如果这两个不一致,那么您可以很确定问题出在哪里。这叫做"Georeferencing".
我认为对于 3D 投影,您可能至少需要 4 个这样的 "control points"。您可以查看 stackexchange 上的地理空间社区,了解有关投影地图和坐标系之间交换的更多详细信息。