Показать широты / долготы на экране, в 3d - PullRequest
0 голосов
/ 05 октября 2009

Прошло много времени с моей математики в университете, и теперь я стал нуждаться в ней, как будто никогда не думал, что буду.

Итак, вот чего я хочу достичь: Имея набор трехмерных точек (географические точки, широта и долгота, высота не имеет значения), я хочу отобразить их на экране, учитывая направление, которое я хочу принять во внимание. Это будет использоваться вместе с камерой и компасом, поэтому, когда я указываю камеру на север, я хочу отобразить на моем компьютере точки, которые камера должна «увидеть». Это своего рода дополненная реальность.

По сути, мне нужен (как мне кажется) способ преобразования трехмерных точек, просматриваемых сверху (например, просмотра точек на картах Google), в набор трехмерных точек, видимых со стороны.

Ответы [ 5 ]

4 голосов
/ 05 октября 2009

Преобразование широты и долготы в трехмерные декартовы (x, y, z) координаты может быть выполнено с помощью следующего (Java) фрагмента кода. Надеюсь, он легко конвертируется на ваш язык. lat и lng - это изначально широта и долгота в градусах:

lat*=Math.PI/180.0;
lng*=Math.PI/180.0;
z=Math.sin(-lat);
x=Math.cos(lat)*Math.sin(-lng);
y=Math.cos(lat)*Math.cos(-lng);

Вектор (x, y, z) всегда будет лежать на сфере радиуса 1 (т.е. радиус Земли был масштабирован до 1).

Оттуда требуется трехмерная перспективная проекция для преобразования (x, y, z) в (X, Y) экранные координаты с учетом положения и угла камеры. См. Например, http://en.wikipedia.org/wiki/3D_projection

2 голосов
/ 05 октября 2009

Может кто-нибудь объяснить мне, что именно означают эти параметры? Я пробовал, и результаты были очень странными, так что, я думаю, я неправильно понял некоторые параметры для перспективной проекции

*  {a}_{x,y,z} - the point in 3D space that is to be projected.
* {c}_{x,y,z} - the location of the camera.
* {\theta}_{x,y,z} - The rotation of the camera. When {c}_{x,y,z}=<0,0,0>, and {\theta}_{x,y,z}=<0,0,0>, the 3D vector <1,2,0> is projected to the 2D vector <1,2>.

* {e}_{x,y,z} - the viewer's position relative to the display surface. [1]
2 голосов
/ 05 октября 2009

Это действительно зависит от степени точности, которую вы требуете. Если вы работаете над точными точками зрения в любой точке земного шара, вам необходимо принять во внимание эллипсоидальную форму Земли. Обычно это делается с использованием алгоритма, аналогичного описанному здесь, на странице 38 в разделе «Преобразование между географическими и декартовыми координатами»:

http://www.icsm.gov.au/gda/gdatm/gdav2.3.pdf

Если вам не нужна высокая точность, методы, упомянутые выше, прекрасно работают.

0 голосов
/ 05 октября 2009

Ну, просто совет, вы можете построить эти точки в трехмерном пространстве (вы можете легко сделать это, используя openGL). Вы должны преобразовать широту / долготу в другую систему, например, полярную или декартовую. Итак, начиная с широты / долготы, вы помещаете начало своего пространства в центр сердца, а затем преобразуете свои данные в декартову координату:

z = R * sin (long) x = R * cos (long) * sin (lat) y = R * cos (long) * cos (lat) R - радиус мира, вы можете установить его в 1, если вам нужно только указать направление между вашей точкой зрения и точкой, которую вам нужно «увидеть»

, затем поместите виртуальную камеру в точку созданного вами пространства и свяжите данные вашей реальной камеры (просто вектора) с данными виртуальной.

Следующий шаг, чтобы получить то, что вы хотите сделать, это попытаться нарисовать изображения для вашей камеры, наложенной на ваше «виртуальное пространство», определенно, у вас должна быть настоящая камера, которая служит для управления виртуальной камерой в виртуальном пространстве .

0 голосов
/ 05 октября 2009

Что ж, вам понадобится некоторая трехмерная векторная арифметика для перемещения вашего начала координат и, возможно, некоторые функции вращения на основе кватернионов для поворота векторов в соответствии с вашим направлением. Существует множество хороших руководств по использованию кватернионов для поворота трехмерных векторов (поскольку они часто используются для рендеринга и тому подобное), а трехмерные векторные объекты довольно просты, если вы помните, как представлены векторы.

...