Название: [РЕШЕНО] Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 01, 2013, 11:30 Бодрого всем времени суток.
Может у кого есть наброски или работающий код по наложении тайлов карт (google, OpenStreetMap etc.) на сферу? Столкнулся со следующей проблемой - строю сферу, используя qt3d, при этом хорошо накладываются тайлы в меркаторе, но если перевожу координаты в сферическую проекцию, то необходимо смещать и вертексы, к которым крепится текущая текстура. Если необходимо, могу скинуть код, но надеюсь, что кто-то этим уже занимался и поможет=) Спасибо. Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: ssoft от Март 01, 2013, 12:01 Все достаточно просто, необходимо
- каждый тайл представить в виде сетки точек I x J. - для каждой точки 1. выполнить преобразование из проекции Меркатора на геоид WGS84 2. выполнить преобразование из геоида WGS84 в 3D декартовые координаты - наложить текстуру тайла на сетку точек в декартовых координатах. Формулы для преобразования можно посмотреть, например, на http://gis-lab.info (http://gis-lab.info) Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Март 01, 2013, 13:05 Отвечал на подобный вопрос, тогда помню разобрались. Поищите по форуму "меркатор". Вертексы двигать не надо, просто пересчитать UV
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 05, 2013, 13:50 Отвечал на подобный вопрос, тогда помню разобрались. Поищите по форуму "меркатор". Вертексы двигать не надо, просто пересчитать UV http://www.prog.org.ru/index.php?topic=23408.msg166006#msg166006 в этом сообщении как раз перевод из Меркатора в геоид WGS84? Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Март 05, 2013, 16:32 http://www.prog.org.ru/index.php?topic=23408.msg166006#msg166006 в этом сообщении как раз перевод из Меркатора в геоид WGS84? Там перевод из UV сферических в UV меркатораНазвание: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 05, 2013, 17:21 http://www.prog.org.ru/index.php?topic=23408.msg166006#msg166006 в этом сообщении как раз перевод из Меркатора в геоид WGS84? Там перевод из UV сферических в UV меркатораТочно не наоборот из меркатора в сферические? Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Март 05, 2013, 19:14 Точно не наоборот из меркатора в сферические? Точно, Вы же тогда и спрашивали. Столкнулся со следующей проблемой - строю сферу, используя qt3d, при этом хорошо накладываются тайлы в меркаторе, но если перевожу координаты в сферическую проекцию, то необходимо смещать и вертексы, к которым крепится текущая текстура. Какую текстуру Вы хотите наложить на модель сферы? Текстуру меркатора умеете, сферическая текстура ложится по умолчанию. Что же нужно?Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 06, 2013, 13:16 Какую текстуру Вы хотите наложить на модель сферы? Текстуру меркатора умеете, сферическая текстура ложится по умолчанию. Что же нужно? Вся проблема в том, что текстуры в проекции меркатора, а мне нужно наложить их в обычной (текстуры openstreetmap, но и у google maps такие же). Для первых двух зумов всё отлично, но потом идёт смещение, так как тайл проекции меркатора накладывается на отличные координаты от тех, на которые наложился бы тайл в сферической проекции. Вот в этом проблема, как к вертексам сферы наложить новые тайлы (текстуры). Сейчас буду пробовать совет ssoft. Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: ssoft от Март 06, 2013, 14:40 Пробуй - у нас все получилось и работает. ;)
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Март 06, 2013, 17:09 Вся проблема в том, что текстуры в проекции меркатора, а мне нужно наложить их в обычной (текстуры openstreetmap, но и у google maps такие же). Для первых двух зумов всё отлично, но потом идёт смещение, так как тайл проекции меркатора накладывается на отличные координаты от тех, на которые наложился бы тайл в сферической проекции. Вот в этом проблема, как к вертексам сферы наложить новые тайлы (текстуры). Сейчас буду пробовать совет ssoft. Неудобно приставать с вопросами, но все же: я так вижу это дело- текстура (картинка) подготовлена для проекции меркатора - ну значит и UV должны быть рассчитаны для меркатора - текстура (картинка) сферическая - ну значит и UV должны быть сферические Тайл (tile) - это кусочек картинки, возможно для его повторения. В каком контексте Вы здесь используете этот термин - не понимаю. Может как-то хотите пересчитать картинку - ну это обычно дело долгое и мутное. В общем, я растерялся и не понимаю о чем речь :) Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 13, 2013, 11:00 Тайл (tile) - это кусочек картинки, возможно для его повторения. В каком контексте Вы здесь используете этот термин - не понимаю. Может как-то хотите пересчитать картинку - ну это обычно дело долгое и мутное. В общем, я растерялся и не понимаю о чем речь :) http://tile.openstreetmap.org/2/2/1.png - вот тайл, он в меркаторе. Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 13, 2013, 11:03 Пробуй - у нас все получилось и работает. ;) У вас случайно нельзя именно этот небольшой кусок попросить посмотреть? Вчера переписал полностью создание сферы и наложение. Для одной картинки круто, даже быстрее, чем в примерах получилось. А вот если несколько тайлов, то всё равно немного не правильно рассчитывается. Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 13, 2013, 14:26 Вот мой код:
В этом методе я просто вычисляю количество тайлов для текущего зума и накладываю каждый тайл: Код: QGLSceneNode *Earth::buildEarthNode(qreal radius, int divisions, int cur_zoom) А вот здесь уже строится и накладывается текстура (каждый тайл из http://tile.openstreetmap.org/z/x/y.png): Код: void Earth::addTileNode(QGLBuilder* builder, qreal radius, int divisions, int cur_zoom, После этого всё равно накладывается в меркаторе. Подскажите, что не правильно? Или как правильно?=) Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 13, 2013, 15:37 Кажется понял. При указании текстурной координаты нужно брать меркаторовскую координату, так как текстура в меркаторовской проекции. И накладывать её на вертекс (точку сферы) в декартовой проекции, которая получена из сферической. Но так африка выглядит нормально, а вот европа сужена по вертикали, антарктида всё равно нереально здоровая..
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Март 13, 2013, 16:06 Насколько я понял по приведенному коду Вы хотите наложить меркаторскую текстуру (тайл) на часть сферы (как бы суб-модель) которую сами же и строите. При этом UV должны быть от 0 до 1 (в рамках этой части). Верно?
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 13, 2013, 16:12 Да. У меня декартовые координаты сферы (переведённые из сферических координат) от -1 до 1. А текстурные координаты от 0 до 1.
Я для каждого тайла (текстуры) строю часть сферы (именно поэтому у меня на полюсах дырки, так как в меркаторе там нет ничего). Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Март 13, 2013, 17:10 Да. У меня декартовые координаты сферы (переведённые из сферических координат) от -1 до 1. Та как будто OpenGL понимает вертекс и в полярных координатах! :) Ясно что x, y, z А текстурные координаты от 0 до 1. Строите часть сферы (все углы в радианах)Я для каждого тайла (текстуры) строю часть сферы (именно поэтому у меня на полюсах дырки, так как в меркаторе там нет ничего). Код
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 21, 2013, 11:29 Строите часть сферы (все углы в радианах) Сделал по вашему примеру. Сфера строится правильно, но вот текстура накладывается неверно. Немного изменил код, так как в нём были неточности, и соответственно подстроил под мой случай, получилось: Код: QGLSceneNode* Earth::BuildSpherePart(qreal startU, qreal stepU, int numU, // широта (0..2*PI) Во вложении прикрепил скриншот сферы. Видимо текстуры накладываются вдоль меридиан, сейчас буду разбираться почему так. Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 21, 2013, 11:32 Если же не делать prim.clear(); то получается не менее интересное наложение
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Март 21, 2013, 11:42 Код
Для расчёта uv.v точно не Код: uv.v = angleV / (M_PI) + 0.5; Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Март 21, 2013, 19:13 Для расчёта uv.v точно не Совершенно верно, делить надо на PI, это я насвистел :) Код: uv.v = angleV / (M_PI) + 0.5; У Вас типичная ситуация - ничего сложного, но трудно отладить, хз где ошибка. Советую делать шаг за шагом. 1) Закомментите все вызовы меркатора, возьмите сферическую текстуру и постройте с ней полную сферу 2) Отладьте кусочки - опять-таки пока на сфере 3) Включите меркатор и с ним постройте всю сферу 4) Ну и в конце-концов... Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 08, 2013, 18:01 никак я не справлюсь с этим. У вас нормально работает наложение с этим кодом?
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Апрель 08, 2013, 18:12 никак я не справлюсь с этим. У вас нормально работает наложение с этим кодом? Что-то Вы просыпаетесь раз в 2 недели :) Нет, это конкретно не тестировал, но "наложить текстуру на часть" делал часто. На сферу у Вас все норм ? Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 08, 2013, 18:18 никак я не справлюсь с этим. У вас нормально работает наложение с этим кодом? Что-то Вы просыпаетесь раз в 2 недели :) Нет, это конкретно не тестировал, но "наложить текстуру на часть" делал часто. На сферу у Вас все норм ? Мне вот что из вашего кода удалось сделать (см. вложение, скриншот для 4-х тайлов - 2х2). Это я сделал, добавив ещё один вертекс сразу, то есть добавляя не каждый по цепочке, а сразу два из параллельных цепочек вертексов: Код: QGLSceneNode* Earth::BuildSpherePart(qreal startU, qreal stepU, int numU, // широта (0..2*PI) Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 08, 2013, 18:24 Нашёл, вместо
Код: // получаем V меркатора Код: // получаем V меркатора Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 09, 2013, 11:46 Нет, это конкретно не тестировал, но "наложить текстуру на часть" делал часто. На сферу у Вас все норм ? А можете ли Вы поделиться своим кодом, который у Вас работает? Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Апрель 09, 2013, 15:35 А можете ли Вы поделиться своим кодом, который у Вас работает? Ну вырезать его нереально. В принципе все то же самое - нормирование UV, просто др маппинги. Дайте небольшой проект - попробую помочьНазвание: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 10, 2013, 12:17 Дайте небольшой проект - попробую помочь Вот минимальное, что смог сделать. (переделал стандартный пример solarsystem) PS. В директории /tmp должны лежать 4 файла http://tile.openstreetmap.org/1/0/0.png, http://tile.openstreetmap.org/1/0/1.png, http://tile.openstreetmap.org/1/1/0.png, http://tile.openstreetmap.org/1/1/1.png с именами 1-0-0.png 1-0-1.png 1-1-0.png и 1-1-1.png соответственно. Спасибо. Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Апрель 10, 2013, 15:22 Дайте небольшой проект - попробую помочь Вот минимальное, что смог сделать. (переделал стандартный пример solarsystem) PS. В директории /tmp должны лежать 4 файла http://tile.openstreetmap.org/1/0/0.png, http://tile.openstreetmap.org/1/0/1.png, http://tile.openstreetmap.org/1/1/0.png, http://tile.openstreetmap.org/1/1/1.png с именами 1-0-0.png 1-0-1.png 1-1-0.png и 1-1-1.png соответственно. Спасибо. Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 10, 2013, 16:32 сорри=) теперь здесь.
Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 11, 2013, 11:40 // получаем V меркатора Но uv.v = Mercator2SphereAnalytic(maxUV.v); qreal startV, qreal stepV, int numV // долгота (-PI/2 .. +PI/2) Разве проекция меркатора влияет на долготу? она же широту искажает?Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: Igors от Апрель 12, 2013, 08:41 Разве проекция меркатора влияет на долготу? она же широту искажает? Давайте определим систему координат чтобы не путаться (аттач). U текстуры соответствует углу в плоскости XZ (азимут) меняется от 0 до 2PI. V текстуры соответствует углу с осью Y (от -PI/2 до +PI/2). Это стандарт для spherical map. А что там чему соответствует в предметной части - то уже Ваше дело :)По поводу Вашего проекта - все еще "инсталлюсь", быстро не будет Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора) Отправлено: spirits25 от Апрель 12, 2013, 13:57 Разве проекция меркатора влияет на долготу? она же широту искажает? Давайте определим систему координат чтобы не путаться (аттач). U текстуры соответствует углу в плоскости XZ (азимут) меняется от 0 до 2PI. V текстуры соответствует углу с осью Y (от -PI/2 до +PI/2). Это стандарт для spherical map. А что там чему соответствует в предметной части - то уже Ваше дело :)По поводу Вашего проекта - все еще "инсталлюсь", быстро не будет Спасибо большое, у меня, кажется всё получилось=) Благодаря Вашим многочисленным советам я разобрался, правда переделал не Ваш код, а сделал сам, но всё работает=) Правда на стыках малюсенькие полоски, но это видимо из-за деления и неточности (ввиду округлений компьютером), но это уже не такая проблема, решу как-нибудь=) Спасибо=) |