Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: spirits25 от Март 01, 2013, 11:30



Название: [РЕШЕНО] Алгоритм наложения тайлов на сферу (проекция меркатора)
Отправлено: 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)
{
    qreal separation = qPow(2, cur_zoom);
    QGLBuilder builder;

    for (int lonTileNum = 0; lonTileNum < separation; lonTileNum++)
    {
        for (int latTileNum = 0; latTileNum < separation; latTileNum++)
        {
            addTileNode(&builder, radius, divisions, cur_zoom, lonTileNum, latTileNum);
        }
    }
    return builder.finalizedSceneNode();
}

А вот здесь уже строится и накладывается текстура (каждый тайл из http://tile.openstreetmap.org/z/x/y.png):

Код:
void Earth::addTileNode(QGLBuilder* builder, qreal radius, int divisions, int cur_zoom,
                        qint32 lonTileNum, qint32 latTileNum)
{
    int separation = qPow(2, cur_zoom);

    // degrees for one tile
    qreal NTLat = 2*maxAbsLat / separation;
    qreal NTLon = 2*maxAbsLon / separation;

    // min and max tile degrees
    qreal minLat = latTileNum * NTLat - maxAbsLat;
    qreal maxLat = (latTileNum+1) * NTLat - maxAbsLat;
    qreal minLon = lonTileNum * NTLon - maxAbsLon;
    qreal maxLon = (lonTileNum+1) * NTLon - maxAbsLon;

    // calculate spherical min and max lon and lat
    int signMinLat = (minLat<0)?-1:1;
    int signMaxLat = (maxLat<0)?-1:1;
    qreal minSphereLat = Mercator2SphereAnalyticDegrees(qAbs(minLat))*signMinLat;
    qreal maxSphereLat = Mercator2SphereAnalyticDegrees(qAbs(maxLat))*signMaxLat;

    qreal minSphereLon = minLon;
    qreal maxSphereLon = maxLon;

    // all stacks and slices
    int stacks = 32;
    int slices = 32;
    if (cur_zoom > 6)
    {
        stacks *= qPow(2, cur_zoom - 6);
        slices *= qPow(2, cur_zoom - 6);
    }

    // stacks and slices for one tile
    int stacksForOne = stacks/separation;
    int slicesForOne = slices/separation;

    // degrees for one stack (slice)
    qreal oneStackDegrees = (maxLat - minLat)/(qreal)stacksForOne;
    qreal oneSliceDegrees = (maxLon - minLon)/(qreal)slicesForOne;

    qreal curSphereLat, curSphereLatNext, curSphereLon;

    QVector3D curDecart;
    QVector3D curDecartNext;

    QGLBuilder tempBuilder;
    for (qreal curMerLat = maxLat; curMerLat >= (minLat+0.2); curMerLat-=oneStackDegrees) {
        qreal curMerLatNext = curMerLat - oneStackDegrees;
        QGeometryData prim;

        double yTexCoord;
        double yTexCoordNext;
        double xTexCoord;
        double xTexCoordNext;

        prim.clear();
        for (qreal curMerLon = minLon; curMerLon <= maxLon; curMerLon += oneSliceDegrees)
        {
            int signLat = (curMerLat >= 0)?1:-1;
            int signLatNext = (curMerLatNext >= 0)?1:-1;

            // перевод текущих широт в сферическую проекцию
            curSphereLat = Mercator2SphereAnalytic(qAbs(curMerLat)/90.0)*signLat*90;
            curSphereLatNext = Mercator2SphereAnalytic(qAbs(curMerLatNext)/90.0)*signLatNext*90;

            // широты не изменяются
            curSphereLon = curMerLon;

            // перевод из lat и lon в декартовые (h = 0)
            curDecart = llh2xyz(curSphereLat, curSphereLon);
            curDecartNext = llh2xyz(curSphereLatNext, curSphereLon);

            prim.appendVertex(curDecart);
            prim.appendNormal(curDecart);
            xTexCoord = (curSphereLon - minSphereLon)/(maxSphereLon - minSphereLon);
            yTexCoord = (curSphereLat/90.0 - minSphereLat)/(maxSphereLat - minSphereLat);
            prim.appendTexCoord(QVector2D(xTexCoord, yTexCoord));

            prim.appendVertex(curDecartNext);
            prim.appendNormal(curDecartNext);
            xTexCoordNext = (curSphereLon - minSphereLon)/(maxSphereLon - minSphereLon);
            yTexCoordNext = (curSphereLatNext/90.0 - minSphereLat)/(maxSphereLat - minSphereLat);
            prim.appendTexCoord(QVector2D(xTexCoordNext, yTexCoordNext));
        }

        tempBuilder.addQuadStrip(prim);
    }
.....
//проверяется существование текстуры (тайла), если нужно скачивается и применяется.
.....
}

После этого всё равно накладывается в меркаторе. Подскажите, что не правильно? Или как правильно?=)


Название: 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.
Я для каждого тайла (текстуры) строю часть сферы (именно поэтому у меня на полюсах дырки, так как в меркаторе там нет ничего).
Строите часть сферы (все углы в радианах)

Код
C++ (Qt)
struct UV {
qreal u, v;
};
 
UV GetUV( qreal angleU, qreal angleV )
{
 UV uv;
 uv.u = angleU / (M_PI * 2);
 uv.v = angleV / (M_PI / 2) + 0.5;
 return uv;
}
 
void BuildSpherePart(
                         qreal startU, qreal stepU, qreal int numU,   // широта (0..2*PI)
                         qreal startV, qreal stepV, qreal int numV,   // долгота (-PI/2 .. +PI/2)
                         // ... др параметры
{
// находим диапазон
  UV minUV = GetUV(startU, startV);
  UV maxUV = GetUV(startU + stepU * (numU - 1), startV + stepV * (numV - 1));
  minUV.v = Mercator2SphereAnalytic(minUV.v);  
  maxUV.v = Mercator2SphereAnalytic(maxUV.v);  
 
// вычисляем UV координаты для сферы
 for (int i =  0; i < numU; ++i)
  for (int j =  0; j < numV; ++j) {
 
    qreal angleU = startU + stepU * i;
    qreal angleV = startV + stepV * j;
 
   // добавляем вертекс
    qreal y = sin(angleV);
    qreal len = sqrt(1 - y * y);
    qreal x = cos(angleU) * len;
    qreal z = sin(angleU) * len;
    prim.appendVertex(QPoint3D(x, y, z) * radius);
 
   // получаем сферические UV
    UV uv = GetUV(angleU, angleV);
 
   // получаем V меркатора
    uv.v = Mercator2SphereAnalytic(maxUV.v);  
 
  // нормируем UV
    uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u);
    uv.v = (uv.c - minUV.v) / (maxUV.v - minUV.v);
    prim.appendTexCoord(QVector2D(UV.u, UV.v));
 }
}
}


Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора)
Отправлено: spirits25 от Март 21, 2013, 11:29
Строите часть сферы (все углы в радианах)

Сделал по вашему примеру. Сфера строится правильно, но вот текстура накладывается неверно.

Немного изменил код, так как в нём были неточности, и соответственно подстроил под мой случай, получилось:
Код:
QGLSceneNode* Earth::BuildSpherePart(qreal startU, qreal stepU, int numU,   // широта (0..2*PI)
                     qreal startV, qreal stepV, int numV   // долгота (-PI/2 .. +PI/2)
                    )
{
// находим диапазон
    UV minUV = GetUV(startU, startV);
    UV maxUV = GetUV(startU + stepU * (numU - 1), startV + stepV * (numV - 1));
    minUV.v = Mercator2SphereAnalytic(minUV.v);
    maxUV.v = Mercator2SphereAnalytic(maxUV.v);

    QGLBuilder tempBuilder;
    QGeometryData prim;

// вычисляем UV координаты для сферы
    for (int i =  0; i < numU; ++i)
    {
        for (int j =  0; j < numV; ++j)
        {
            qreal angleU = startU + stepU * i;
            qreal angleV = startV + stepV * j;

            // добавляем вертекс
            qreal y = sin(angleV);
            qreal len = sqrt(1 - y * y);
            qreal x = cos(angleU) * len;
            qreal z = sin(angleU) * len;
            prim.appendVertex(QVector3D(x, y, z) * a);
            prim.appendNormal(QVector3D(x, y, z) * a);

            // получаем сферические UV
            UV uv = GetUV(angleU, angleV);

            // получаем V меркатора
            uv.v = Mercator2SphereAnalytic(maxUV.v);

            // нормируем UV
            uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u);
            uv.v = (uv.v - minUV.v) / (maxUV.v - minUV.v);

            prim.appendTexCoord(QVector2D(uv.u, uv.v));
        }
            tempBuilder.addQuadStrip(prim);
            prim.clear();
    }
    return tempBuilder.finalizedSceneNode();
}

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


Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора)
Отправлено: spirits25 от Март 21, 2013, 11:32
Если же не делать prim.clear(); то получается не менее интересное наложение


Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора)
Отправлено: spirits25 от Март 21, 2013, 11:42

Код
C++ (Qt)
struct UV {
qreal u, v;
};
 
UV GetUV( qreal angleU, qreal angleV )
{
 UV uv;
 uv.u = angleU / (M_PI * 2);
 uv.v = angleV / (M_PI / 2) + 0.5;
 return uv;
}

Для расчёта uv.v точно не
Код:
uv.v = angleV / (M_PI) + 0.5;
нужно? там ведь диапазон PI составляет?


Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора)
Отправлено: Igors от Март 21, 2013, 19:13
Для расчёта uv.v точно не
Код:
uv.v = angleV / (M_PI) + 0.5;
нужно? там ведь диапазон PI составляет?
Совершенно верно, делить надо на PI, это я насвистел  :)

У Вас типичная ситуация - ничего сложного, но трудно отладить, хз где ошибка. Советую делать шаг за шагом.

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)
                     qreal startV, qreal stepV, int numV   // долгота (-PI/2 .. +PI/2)
                     // ... др параметры
                    )
{
// находим диапазон
    UV minUV = GetUV(startU, startV);
    UV maxUV = GetUV(startU + stepU * (numU - 1), startV + stepV * (numV - 1));
    minUV.v = Mercator2SphereAnalytic(minUV.v);
    maxUV.v = Mercator2SphereAnalytic(maxUV.v);

    QGLBuilder tempBuilder;
    QGeometryData prim;
// вычисляем UV координаты для сферы
    for (int i =  0; i <= numU; ++i)
    {
        prim.clear();
        for (int j =  0; j <= numV; ++j)
        {
            qreal angleU = startU + stepU * i;
            qreal angleV = startV + stepV * j;

            // добавляем вертекс
            qreal y = sin(angleV);
            qreal len = sqrt(1 - y * y);
            qreal x = cos(angleU) * len;
            qreal z = sin(angleU) * len;
            prim.appendVertex(QVector3D(x, y, z) * a);
            prim.appendNormal(QVector3D(x, y, z) * a);

            // получаем сферические UV
            UV uv = GetUV(angleU, angleV);

            // получаем V меркатора
            uv.v = Mercator2SphereAnalytic(maxUV.v);

            // нормируем UV
            uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u);
            uv.v = (uv.v - minUV.v) / (maxUV.v - minUV.v);

            prim.appendTexCoord(QVector2D(uv.u, uv.v));

            // second vertex
            angleU = startU + stepU * (i+1);
            angleV = startV + stepV * j;

            // добавляем вертекс
            y = sin(angleV);
            len = sqrt(1 - y * y);
            x = cos(angleU) * len;
            z = sin(angleU) * len;
            prim.appendVertex(QVector3D(x, y, z) * a);
            prim.appendNormal(QVector3D(x, y, z) * a);

            // получаем сферические UV
            uv = GetUV(angleU, angleV);

            // получаем V меркатора
            uv.v = Mercator2SphereAnalytic(maxUV.v);

            // нормируем UV
            uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u);
            uv.v = (uv.v - minUV.v) / (maxUV.v - minUV.v);

            prim.appendTexCoord(QVector2D(uv.u, uv.v));
        }
        tempBuilder.addQuadStrip(prim);
    }
    return tempBuilder.finalizedSceneNode();
}


Название: Re: Алгоритм наложения тайлов на сферу (проекция меркатора)
Отправлено: spirits25 от Апрель 08, 2013, 18:24
Нашёл, вместо
Код:
// получаем V меркатора
            uv.v = Mercator2SphereAnalytic(maxUV.v);
нужно
Код:
// получаем V меркатора
            uv.v = Mercator2SphereAnalytic(uv.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. А что там чему соответствует в предметной части - то уже Ваше дело  :)

По поводу Вашего проекта - все еще "инсталлюсь", быстро не будет

Спасибо большое, у меня, кажется всё получилось=) Благодаря Вашим многочисленным советам я разобрался, правда переделал не Ваш код, а сделал сам, но всё работает=) Правда на стыках малюсенькие полоски, но это видимо из-за деления и неточности (ввиду округлений компьютером), но это уже не такая проблема, решу как-нибудь=)

Спасибо=)