Как легко получить реальный рельеф местности

Научился сам? Помоги начинающему.

Как легко получить реальный рельеф местности

Сообщение sledo 13 окт 2014, 23:11

Про то, как легко получить реальный ландшафт, от нашей матушки земли.

Открываем сайт Сайт (надо жмякнуть). Выбираем континент, скачиваем какой нибудь архив. Они сгруппированы по квадратам, предположительно по меридианам, номера которых указаны в названии.
Скачиваем программу для открывания этого архива - Microdem
Открываем ее, открываем наш файл - File > Open > Open DEM > выбираем скаченный архив.
Много раз жмем Ok (повышает и очищает карму), смотрим на рисунок карты высот.
Понравился? Значит можно сохранять
Нужна в формате 3D? Жмем File > Save DEM > Caveat emptor > 3D (OBJ)
Нужна карта высот в виде изображения? Можно и так, но перед этим увеличиваем до максимального размера, который может позволить ваша совесть и самосознание (+- на панели инструментов окна рисунка карты высот). Дальше жмем правой кнопкой мышки по рисунку, выбираем первую строчку Displey parameter > Elevation > слева сверху колонка Displey colors нужна кнопочка Gray scale > Ok. Теперь рисунок черно белый, что и нужно было для Unity.
Теперь идем в File > Save image.

Если сохранили в формате 3D то открываем в любом подходящем редакторе и редактируем как хочется. Но надо помнить, что размер модели карты 70 х 110 х 1 КМ, поэтому не каждый редактор ее переварит. Я открывал с помощью Cinema4d, получается довольно качественный рельеф. 1 440 000 полигонов.

Сохранили в качестве изображения? Значит открываем его в любом подходящем редакторе изображений, уменьшаем размер рисунка карты (или участок карты) до необходимого, но не больше 4056 х 4056 поскольку больше unity не съест. Теперь надо конвертировать все это хозяйство в формат RAW. Программу которая это делает, я приложу в приложении (ан нет, низя добавлять EXEшник, вот отсюда качаем BMP2RAW), но она работает только в 32х битной системе. Поэтому для меня нужен был другой конвертор, и после долгих поисков, я его нашел таки. Он правда не настолько мощный и хороший как в приложении, но все же. В общем, открываем Adobe Photoshop, выбираем сохранение по каналам и сохраняем в формате RAW. Правда, как я понял, он не умеет сохранять в 16 битном формате, поэтому придется пользоваться тем что есть.

Вот какая карта высот получается у фотошопа. 8 бит.
Изображение

Ну а вот это, исходник. Результат фотошопа, прямо скажем, печальный.
Изображение

Сохранили. Открываем Unity, идем в Террейн > настройки > самый низ > import RAW. Ставим 8 бит, задаем размеры нашего рисунка, размеры карты, кратную размерам рисунка, жмякаем import. Получаем реальный рельеф местности без плясок и бубнов, генераторов и тысяч часов ручной работы, практически неограниченных размеров. Оле!

P.S. Сгенерированный ландшафт, будет намного уступать по качеству (т.е. не повторять оригинал, по крайней мере 8 бит) ландшафту сохраненному в 3D формате из Microdem, но и его более чем достаточно.

Частые ошибки:
1) При импорте RAW надо указывать битность равную битности импортируемого файла, иначе у вас будет два ландшафта, на одной карте.
2) Если сгенерированная карта получилась в виде стиральной доски, гиганских размеров и изрядно помятая, то скорее всего вы проигнорировали фразу "выбираем сохранение по каналам". Сохраняем по каналам.
3) Если террайн больше чем ваша карта высот, то террейн будет ступеньками. Лечится выравниваем рельефа.
Последний раз редактировалось sledo 19 окт 2014, 04:13, всего редактировалось 1 раз.
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Как легко получить реальный рельеф местности

Сообщение sledo 14 окт 2014, 17:29

Некоторое дополнение к тому, что уже есть.

К сожалению не всегда удается получить высокое качество ландшафта с помощью карты высот. Поэтому так или иначе придется использовать руки что бы доработать его.
Однако, и из этого есть выход - использование Terrain Toolkit. Ландшафт у нас есть. Поэтому единственно что трогаем во вкладке Create - это сглаживание, если таковое нужно. Основная вкладка с которой можно работать - Erode - задаем "шумы" нашему ландшафту или как говорят в простонародье - мелкие неровности. Но самая большая помощь от этого расширения от вкладки Texture. Там мы раскрашиваем наш рельеф, чем экономим себе, страшно представить сколько времени.
К сожалению автор по всей видимости забросил сие чудесное творение, поэтому из документации осталось только видео и версия 1.0.2, которую я постараюсь прикрепить в приложении.

В особенности расширения надо записать, что оно не может работать в картами у которых heightmap resolution больше 2048.

Вот такой симбиоз естественного и искусственного, на выходе которого получается неплохие творения.

Карта 25 х 25 км.
Изображение
Изображение
У вас нет доступа для просмотра вложений в этом сообщении.
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Как легко получить реальный рельеф местности

Сообщение sledo 28 апр 2016, 02:45

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

Использование в Unity сырца в виде формата Raw (который как раз и означает сырец) пожалуй одно из немногих хороших решений для создания хорошо детализированного ландшафта. А если быть точнее, то единственное. Видимо именно по этой причине, Unity так до сих пор и не сделали поддержку каких то других форматов карт высот, хотя считывание многих форматов не представляется сложной задачей, а самих форматов весьма много. Причина тому — меньший уровень детализации.
Формат RAW содержит в себе все необходимое для создания каких то иных форматов, которые будут содержать лишь часть из него и по этой же причине, собрать обратно RAW например из BMP, можно, но не имеет смысла, поскольку он будет содержать только какую то часть от исходника.

Возьмем для примера широко распространенную практику в качестве карт высот - форматы изображений. У нас есть определенная палитра цветов, которая на первый взгляд кажется достаточно широка и при прямом подсчете например палитры RGB, получится что она предоставляет нам 16 581 375 различных цветов и оттенков. Кажется что этого достаточно, однако наиболее часто, используются простые цвета, например серый, у которых ограничение по оттенкам достигает значения 255, на что есть свои причины.
Т.е. если взять даже равнинный перепад высот в 255м, то один оттенок там будет давать разницу в высоте в 1м, что весьма существенно и только усугубляется при гористой местности. Именно по этой причине, что бы мы не делали, как бы мы не правили и какое бы не давали разрешение карте высот, всякий раз детализация по высоте не будет превышать значения в 255 при простых цветах.

Более того, даже если мы используя программу MicroDEM, переведем картинку в другую палитру, где на первый взгляд будет вся палитра RGB, то достаточно посмотреть на шкалу цветовых высот и станет ясно, что она занимает все те же 255 пикселей. Т.е. все равно, ограничение в 255, не преодолевается, а значит все так же используются простые цвета и не задействованы оттенки (кстати там формат не RGB, а CMYK, но сути это не меняет).

Кому интересно посмотреть это на практике, я накидал скриптик который задает высоты Террейна опираясь на цвет пикселя.
Скрытый текст:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class TestDeformTerrain : MonoBehaviour {

    public bool включитьИзменениеТеррейна;
    public Terrain изменяемыйТеррейн;
    public TerrainData датаТеррейна;
    //если слишком высокие горы - увеличить, низкие - уменьшить
    public int коэфициентВысот = 1;

    public Texture2D Ч_Б_картаВысот;
    public int mapHeight;
    public int mapWidth;

    public int x1;
    public int y1;

    public float height;

    float[,] heights;


    public int номерПикселяПоХ;
    public int номерПикселяПоХZ;

    public float значениеПикселя;
    public Color testColor;

    // Use this for initialization
    void Start ()
    {
        изменяемыйТеррейн = this.GetComponent<Terrain>&#40;&#41;;
        датаТеррейна = изменяемыйТеррейн.terrainData;

        //получаем разрешение высот для терраина
        x1 = датаТеррейна.heightmapWidth;
        y1 = датаТеррейна.heightmapHeight;

        //получаем размер текстуры
        mapHeight = Ч_Б_картаВысот.height;
        mapWidth = Ч_Б_картаВысот.width;

        //устанавливаем карту высот
        heights = датаТеррейна.GetHeights&#40;0, 0, x1, y1&#41;;
    }
       
        // Update is called once per frame
        void Update &#40;&#41;
    {
        значениеПикселя = Ч_Б_картаВысот.GetPixel&#40;номерПикселяПоХ, номерПикселяПоХZ&#41;.grayscale;
        testColor = Ч_Б_картаВысот.GetPixel&#40;номерПикселяПоХ, номерПикселяПоХZ&#41;;

        if &#40;включитьИзменениеТеррейна&#41;
        {
            /*
            //устанавляваем высоты по размеру текстуры
            for &#40;int y = 0; y < heightmapHeight; y++&#41;
            {
                for &#40;int x = 0; x < heightmapWidth; x++&#41;
                {
                    heights[x, y] = heightmap.GetPixel&#40;x, y&#41;.grayscale / 20;
                }
            }
           
*/

            //устанавляваем высоты по размеру терраина
            for &#40;int y = 0; y < x1; y++&#41;
            {
                for &#40;int x = 0; x < y1; x++&#41;
                {
                    //берем значение цвета пикселя в сером диапазоне и считаем что это и есть наша высота
                    heights[x, y] = Ч_Б_картаВысот.GetPixel&#40;x, y&#41;.grayscale / коэфициентВысот;
                }
            }

            //применяем новые высоты к террейну
            изменяемыйТеррейн.terrainData.SetHeights&#40;0, 0, heights&#41;;
            включитьИзменениеТеррейна = false;
        }
        }
}
 


Что еще важно знать.

Очень часто новички не представляют что такое разрешение карты высот террейна, которое задается в heightmap resolution в настройках террейна. Если говорить коротко, то к примеру максимальное значение в 4097, создаст нам сетку разделив террейн на равные части. Т.е. если террейн будет 4100м, то значит одна клетка heightmap будет равна примерно 1м. Это важно понимать если вы хотите добиться большой детализации ландшафта и используете большое расширение карт высот. Даже если вы будете использовать формат с точностью до 10см по высоте, то не сможете получить ту же детализацию при heightmap resolution с разрешением 4097, при размере терейна в 4100. Что бы получить большее разрешение, придется делать меньше террейн. Меньше террейн, значит ваша карта может не помешаться на нем и именно по этой причине, есть возможность создавать дополнительные террейны и использовать эту фичу в качестве основного инструмента (кстати об этом не догадываются даже многие опытные пользователи Unity. Можете поэкпериментировать — задайте им вопрос «Зачем делать много террейнов» и вы услышите самые разнообразные ответы и может один - два ответят — для большей детализации при меньших затратах ресурсов).

Почему же нельзя сделать у террейна разрешение карты высот больше чем 4097? Все дело в том, сколько памяти будет занимать подобный ГО. Для практического примера достаем Blender.
Тут я не буду описывать досконально все действия, тема не о Blender. Если что то не знаете, в интернетах куча всяких уроков.
Итак запустили Blender, почистили сцену если нужно и создаем Plane. Увеличиваем его размер до разумных пределов, создаем для Plane материал и кидаем на него черно-белую текстуру карту высот. Переходим в режим редактирования, нажимаем кнопочку W и раз 10-12 выбираем пункт Subdivide (подразделять пер. гугл) внимательно следя за квадратичным увеличением полигонов, а так же объемом оперативной памяти которое все это хозяйство начинает кушать. В моем случае, я довел количество вершин до примерно 4 000 000, что требовало около 6,5гб оперативной памяти. Не хило, да? После выхода из режима редактирования, цифра снизилась до 3гб оперативки. И это просто при плоском Plane. Но раз мы разработчики, то и железо у нас как минимум среднее и что нам каких то 6.5гб оперативки, верно? Идем дальше! Переключаемся на вкладку Tools, выбираем кнопочку Noise (Шум – пер. гугл), и начинаем выдавливать высоты. И одно нажатие на кнопку, начинает сжирать еще по 350 мб. Красота? И вы думаете, мы получим крайне хорошо детализированный ландшафт? Как бы не так. Переходим в обычный режим и наблюдаем полное разочарование — сплошные лесенки, которые так или иначе приходится сглаживать.

Это очень показательный пример, который полностью дает представление о том, почему в Unity есть ограничение на сетку высот террейна, а так же ограниченность черно-белой карты высот.

Выходов несколько:
1) Переводить из географических карты высот в изображения с чудовищным расширением и полной палитрой цветов для хорошей детализации, что неизбежно приведет к чудовищным размерам занимаемого пространства на диске.
2) Создавать очень много маленьких карт высот, так что бы ограничения в 255 оттенков хватало для ваших нужд в каждом конкретном участке карты, что крайне неудобно и займет теже чудовищные объемы на диске.
3) Использовать географические форматы напрямую или именно их переводить в RAW.
4) Использовать сам RAW. Правда где достать его с реальными рельефами, я не в курсе.

Интересные ссылки по теме:
Вытаскивание карты высот http://www.gamedev.ru/code/forum/?id=210361
На всякий случай продублирую пост:
AlexBobkov
31 янв. 2016
15:46
#6
MindShifter, на сайте http://srtm.csi.cgiar.org/ слева пункт меню "SRTM Data Search and Download". Откроется карта. Тыкаешь нужные тайлы и нажимаешь "Click here to begin search". Появится список выбранных тайлов и ссылки на скачивание GeoTIFF-файлов с разрешением 90 метров.
Также есть ASTER GDEM с разрешением 30 м. Его можно скачать с http://earthexplorer.usgs.gov/, но вертикальная точность низкая.

Сам сайт с которого грузить карты высот (странно, но точность превышает заявленных 90м) http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp
Создание ландшафта в Блендер по картам высот http://blender-empire.ru/blender-tutori ... ender.html
Динамическое изменение ландшафта (надо подправить три стройки под Unity 5) http://blog.almostlogical.com/2010/06/1 ... n-unity3d/
sledo
Старожил
 
Сообщения: 771
Зарегистрирован: 05 янв 2014, 15:44

Re: Как легко получить реальный рельеф местности

Сообщение micvsm 14 окт 2016, 12:40

Есть профессиональный инструмент работы с реальными топографическими данными, из которого можно реально вытянуть не только рельеф местности но и сами карты. Это ГИС "Карта 2011". Скачать ее можно http://gisinfo.ru/download/download.htm. Она бесплатная на сайте производителя КБ "Панорама" http://gisinfo.ru. Там же и карты и матрицы высот.
И есть еще одна мулька - конвертер матриц высот в RAW съедобный Unity. Это UTCreator. Скачать демку можно здесь http://neurocod.ru/.
На сайте есть подробная инструкция как создать реальный ландшафт, привязанный к РЕАЛЬНЫМ координатам, в том числе и по высотам.
micvsm
UNец
 
Сообщения: 1
Зарегистрирован: 14 окт 2016, 12:01

Re: Как легко получить реальный рельеф местности

Сообщение Valentinus 04 апр 2017, 15:22

небольшое примечание - выдержка из общих правил использования контента Гугла на сайтах и приложениях:
При использовании нашего контента необходимо указывать, что он принадлежит компании Google и ее партнерам. Текст с указанием авторства должен быть разборчивым, чтобы его мог прочитать любой пользователь. Эту информацию нельзя скрывать через несколько секунд после начала показа или приводить ее только в финальных титрах.
то есть, у вас в игре на террайне должна быть разборчивая надпись, например, "Картографические данные © Google, 2017" (popcorn1)
Аватара пользователя
Valentinus
UNITрон
 
Сообщения: 217
Зарегистрирован: 24 мар 2017, 18:33

Re: Как легко получить реальный рельеф местности

Сообщение Woolf 04 апр 2017, 22:04

Этот контент не принадлежит гуглу. Это принадлежит Господу Богу, который создал Землю со всеми рельефами. ну, или Природе с её ветрами и дождями, тут кому как нравится.

Гугл - это лишь инструмент. Права на инструмент не переносятся на контент, создаваемый при помощи этого инструмента. Будь то картинка из фотошопа, или обработанная карта из гугл.
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Аватара пользователя
Woolf
Адепт
 
Сообщения: 6156
Зарегистрирован: 02 мар 2009, 16:59

Re: Как легко получить реальный рельеф местности

Сообщение DbIMok 05 апр 2017, 01:14

Woolf писал(а):Будь то картинка из фотошопа, или обработанная карта из гугл.

нужно читать лицензионные соглашения. на эту тему не один десяток лет флудят на хабре. вот свежая https://habrahabr.ru/post/322912/
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Уведомления о новых версиях, статьях в блоге и на хабре, книги в Telegram @unity3d_ru > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 5548
Зарегистрирован: 31 июл 2009, 14:05
Откуда: RU.61
  • Сайт

Re: Как легко получить реальный рельеф местности

Сообщение Valentinus 10 апр 2017, 09:13

Woolf писал(а):Этот контент не принадлежит гуглу. Это принадлежит Господу Богу, который создал Землю со всеми рельефами. ну, или Природе с её ветрами и дождями, тут кому как нравится.

Гугл - это лишь инструмент. Права на инструмент не переносятся на контент, создаваемый при помощи этого инструмента. Будь то картинка из фотошопа, или обработанная карта из гугл.

бггг. а авторские права на книги и фильмы тоже принадлежат Господу Богу, ведь это он создал писателей, сценаристов и режиссеров? :))

незнание вами законов не освобождает вас от ответственности.

PS а что делать атеистам ???? 8()
Аватара пользователя
Valentinus
UNITрон
 
Сообщения: 217
Зарегистрирован: 24 мар 2017, 18:33

Re: Как легко получить реальный рельеф местности

Сообщение Woolf 10 апр 2017, 14:39

незнание вами законов не освобождает вас от ответственности.


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

а что делать атеистам ?

Всё, что хотите: прыгать с мостов, трахать гусей, травиться наркотой и все такое прочее. Бога ж нет, всё можно. И особо не рефлексируйте, атеизм - это юношеское заболевание, доживете до 40+, сами всё поймете.
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Аватара пользователя
Woolf
Адепт
 
Сообщения: 6156
Зарегистрирован: 02 мар 2009, 16:59

Re: Как легко получить реальный рельеф местности

Сообщение Valentinus 10 апр 2017, 16:47

вы такой бред несете, что не вижу смысла вам что-то отвечать. удачи с гусями.
Аватара пользователя
Valentinus
UNITрон
 
Сообщения: 217
Зарегистрирован: 24 мар 2017, 18:33

Re: Как легко получить реальный рельеф местности

Сообщение Woolf 10 апр 2017, 19:08

Valentinus писал(а):вы такой бред несете, что не вижу смысла вам что-то отвечать. удачи с гусями.


с гусями это к вам )) Это ж вы атеист, а не я. Мало вам религий в мире, придумали очередную, верите в то, что бога нет. Ну, людям в молодости вообще свойственно верить во всякую чушь. В макаронных монстров, инопланетян, мировое правительство и в повальную коррупцию.

На правах троллинга: Бог с вами, идите и не грешите
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Аватара пользователя
Woolf
Адепт
 
Сообщения: 6156
Зарегистрирован: 02 мар 2009, 16:59

Re: Как легко получить реальный рельеф местности

Сообщение DbIMok 10 апр 2017, 19:19

Woolf писал(а):людям в молодости вообще свойственно верить во всякую чушь

старички тоже не все как вы. только некоторые завсегдатаи aftershock
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Уведомления о новых версиях, статьях в блоге и на хабре, книги в Telegram @unity3d_ru > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 5548
Зарегистрирован: 31 июл 2009, 14:05
Откуда: RU.61
  • Сайт


Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8