Создание системы координат и наложение текстур в OpenGL
Зачем мне это особо никому не интерсно , так что я начну с главного.
Мне необходимр создать что то типа Google Earth. Вот сфера, на нее накладывается текстура и с приближением текстура меняется на более точную. Сами текстуры я из гугла накачал вот только проблема в том как их наложить на сферу. Мне необходимо чтоб когда я мызкаю по сфере мышкой то мне высвечивалось координаты курсора как широта и долгота. Сначала думал что это можно сделать преобразовав меровые координаты, которые получаешь через ReadPixel . но как только меняешь место обзора так сразу все сыпется. Это первая проблема.
А вторая заключается в том что если при увеличении зума мне необходимо подгружать другие карты более мелкого масщтаба. а как мне привязывать рисунок на котором изображен квадрат поверхности коодинаты которой известны(например квадрат в размере 1 градус Х 1 градус земных координат а именем рисунка будет координаты правого верхнего угла рисунка) к моей сфере??? Это надо использовать текстурные координаты??? помогите пожалуйста!!! столько литературы напокупал и накачал и так особого ничего не нашел. Очень нужна помощь, диплом горит!!:( :( !!
Заранее всем благодарен за оказаную поддержку.
кури MegaTexture
а как поступать с координатами?
ТК тебе нужны в единственном экземпляре, текстура ведь у тебя будет одна общая..
а для широты-долготы разумнее было бы искать точку пересечения сферы и луча "глаз - центр_сферы" и получившийся вектор уже сравнивать с системой координат сферы. Там ты сможеш получить угол между осью "Земли" и точкой на поверхности, откуда можно найти широту. А там и до долготы недалеко.
Кстати, если тебе позарез нужно обклеивать шарик отдельными картинками, то для поиска уровней детализации можно было бы применить что нибуть на подобии восьмеричного дерева (octree).... хотя это моё ИМХО.
ЭЭЭ тут пожалуйста поподробнеее. Просто я в сфере программирования графики новичок и для это все и диковинку. можешь пояснее объяснить о чем идет речь
лучше всего тебе поможет учебник по АГиЛА
ЭЭЭ а можно по русски расшифровать?!!!:o
аналитическая геометрия и линейная алгебра
Ну в плане математики у меня тут хватает учебников и по навигации и по теории полетов КА. разобраться в этой вот мега текстуре, как она строиться!!
Хоть дайте какую нибудь ссылку по этой теме. Где не посмотрю кругом одна вода а по делу ничего нету. Может кто то знает где пример исходников есть , хотя бы понять с какого места прыгать!!!:(
Я, конечно, не гугл... В общем есть такое:
За ссылку конечно спасибо , но я ее уже читал. там просто там общие понятия, с мне нужны конкретные функциии, в каком месте начсинать это все делать и тд!!!
В основной же программе рендерим объект по группам, установив для каждой из них соответствующий набор текстур с уровнями детализации. А дальше - дело техники...
Пишу я пока на C++ Bilder. Куски текстуры получаю из гугла. Есть одна прога, MapBilder, ты суешь в нее координаты необходимого прямоугольника а он тебе его качает с сервера гугла.
Замудреным в программе пока ничем не пользуюсь, тк основываюсь только на учебной литературе а не опыте. Проекция ортографическая!!!
с определением координат на земле при движении мыши разобрался. осталось с текстурой. Я вот читал у себя в книге что есть такая вещь как множественная текстура. Скажи это и есть та самая мегатекстура. Тут тоже уровни и разные текстуры на каждую детализацию. Или я что то путаю????
А как это MapBuider делает ортографическую проекцию? Ты область задаёшь на сфере? Или на экране? Получение ортографической проекции нормальным образом возможно лишь в последенм случае, но тогда, для получения готовой тексурной карты, необходимо знать ещё и радиус (кривизну) сферы, плюс положение камеры относительно сферы да плюс ещё и поле её зрения (field of view, FOV, имеряется в градусах)... MapBuilder предусматривает возможность всё это получить?
MapBilder ничего этого не делает. ты ему просто задаешь кооодинаты куска Земли и он тебе его качает с гугла и сохраняет как джепег или бмп. Это надо для дальнейшего создания текстуры. Думаю тоже самое можно сделать если брать куски карты из MapInfo. Сама тестура накладывается на сферу. при вращении вращается не сама сфера а меняются координаты глаза. Приближение к сфере также осуществляется засчет "подлета " к ней. C mipmaps я уже познакомился но еще не использовал на практике. Вот думаю у меня от такой текстуры машина не задымится? там ведь еще кроме тестуры еще и спутники летают и их коодинаты в реальном маштабе времени вычилсяются. да еще и объкты на саму сферу наносятся. Не будет ли машина тормозить при перерисовке????????:confused: :confused: :confused:
Использование мипмэпов предусматривает улучшение качество рендера в ущерб расходу памяти. Поскольку в нашем случае это недопустимо, постольку я и предложил некий компромисс в виде управления уровнем
детализации текстур вручную.
Предположим, что твоя прога предусматривает пять уровней детализации. Предположим далее, что элементарный сегмент текстуры наивысшей степени детализации расчитан на наложение на один квадратный полигон, тектура следующего уровня - на четыре соседних полигона, третьего - на четыре четвёрки и т. д. Тогда получим, что текстура последнего - пятого - уровня будет уладываться на 256 полигонов (кажется, это сфера, имеющая по 16 сегментов в каждом направлении). Оранизуем полигоны в дерево, экземпляр нижнего узла которого будет содержать полигон (тупо индекс или два индека треугольников, если твой графический интерфейс не поддерживает полигональные объекты) и указатель на тектуру наивысшего уровня детализации, ему соответствующую. Узел следующего уровня - четыре группы предыдущего уровня + текстура для всей группы с пониженным уровнем детализации (скажем, в полтора - два раза уменьшеную) и т. д. Полигоны в районе каждого из двух полюсов выделим в отдельные группы, поскольку полюс есть одна точка и оптимизацию их прорисовки придётся выполнять вручную (можно сделать сферу другого типа, основанную на равносторонних треугольниках, но её текстурировать ещё сложнее). Далее, определим для каждого из узлов всех уровней вектор направления, являющийся средним арифметическим координат всех подчинённых треугольников минус вектор точки опоры (в нашем случае её проще принять за центр сферы и совместить её с началом координат). Наличие такого вектора существенно ускорит подбор соответствующего уровня детализации текстуры.
Такого рода дерево достаточно посчитать один раз и и можно сохранить полученную структуру, например, в файл.
Далее, задаём некоторую функцию соответствия расстояния от камеры до точки опоры сферы уровням детализации (замути для начала линейную), и по координатам направления, посчитанным на предварительном этапе, определяем ближайший узел второго уровня (на этот раз начиная сверху) к камере. Определяем по функции соответствия суммарный уровень детализации (LOD) для всей гуппы и движемся дальше вглубь, выясняя, можно ли подобрать более высокий уровень. Если это получилось, движемся дальше, если нет, то рисуем группу целиком, используя соответствующую текстуру. Движение по дереву выполняем рекурентно.
Теперь к полюсам. Поскольку для них мы используем тектуры наивысшего разрешения, постольку явно невидимые треугольники придётся отсечь вручную. Но, поскольку полюс сходится в одной точке, постольку выполнить это будет несложно (просто не отрисовываем треугольники, две "свободные" вершины которых находятся за плоскостью, проходящей через центр сферы и перпендикулярной направлению камеры).
После отрисовки необходимо будет выполнить постпроцессинг, наложив эффект наподобие radial blur (можешь даже погуглить в поисках шейдера), либо, если машина позволяет, задействовать аппаратный антиалиасинг.
Такая вот замута...
я нарежу куски все карту с самой точной детализацией. Затем нарежу с детализацией в 4 раз слабее и в 4 раз больше по размеру и тд на 5 уровней.
Затем закидаю это все в mipmap в котором есть такая функция как привязка к координатам. также там есть ссылка на следующий уровень детализации, то есть если каждый грубый кусок карты состоит из 4-х точный то нам необходимо указать 4 указателя на 4 рисунка!!!!!
так или не так я все понял??????:o :o :o
Ха, геймдев предлагает то же самое, что и я, но рендер LODов там осуществляет пиксельный шейдер. В принципе, это отличный вариант, поскольку не потребуется постпроцессинг картинки.
а у тя случайно никаких ссылок нет, где исходники хотя бы примитивов есть ?????
Давай сообразим и разложим все по порядку. Ты мне предлагашь создать сферу не стандартной функцией а с помощью маленьких прямоугольников. Чем меньше тем больше "Земля" похожа на сферу. Тогда из вершин прямоугольников у нас появятся текстурные координаты. Теперь в зависимости от расстояния между глазом и поверхностью мы накладываем либо на каждый прямоугольник свою высокодетализированную текстуру, либо текстуру меньшей детализации, но большей в размере и на несколько прямоугольников сразу! я так все понял?????
GLUquadricObj *quadObj;
quadObj=gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_LINE);
glColor3f(1,1,1);
gluSphere(quadObj, 10,xn,yn);
то есть переменными xn yn я меняю количество линий и следовательно и прямоугольников. А при этом можно найти текстурные координаты пересечений этих линий?
если да то можно просто изменяя количество линий в зависимости от приближения глаза, тем самым уменьшая количество прямоугольников. соответственно и накладывать на них тектуры!!!
как на это смотришь????
Цитата: maxFM
а вот такой вопрос если я создаю эту сферу вот так
GLUquadricObj *quadObj;
quadObj=gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_LINE);
glColor3f(1,1,1);
gluSphere(quadObj, 10,xn,yn);
то есть переменными xn yn я меняю количество линий и следовательно и прямоугольников. А при этом можно найти текстурные координаты пересечений этих линий?
если да то можно просто изменяя количество линий в зависимости от приближения глаза, тем самым уменьшая количество прямоугольников. соответственно и накладывать на них тектуры!!!
как на это смотришь????
GLUquadricObj *quadObj;
quadObj=gluNewQuadric();
gluQuadricDrawStyle(quadObj, GLU_LINE);
glColor3f(1,1,1);
gluSphere(quadObj, 10,xn,yn);
то есть переменными xn yn я меняю количество линий и следовательно и прямоугольников. А при этом можно найти текстурные координаты пересечений этих линий?
если да то можно просто изменяя количество линий в зависимости от приближения глаза, тем самым уменьшая количество прямоугольников. соответственно и накладывать на них тектуры!!!
как на это смотришь????
Текстурные-то координаты можно вычислить относительно легко, но в твоём случае вся сфера отрисовывается за один проход, и мы лишаемся возможности управлять детализацией. К тому же, переход от одного уровня детализации к другому будет чрезвычайно резким. В нашем случае, создание сферы вручную явно предпочтительнее.
ТО есть ты предлаегаешь создать сферу из множества прямоугольников?