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

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

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

Сообщение 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
Старожил
 
Сообщения: 796
Зарегистрирован: 05 янв 2014, 15:44

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

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

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

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

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

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

Карта 25 х 25 км.
Изображение
Изображение
У вас нет доступа для просмотра вложений в этом сообщении.
sledo
Старожил
 
Сообщения: 796
Зарегистрирован: 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
Старожил
 
Сообщения: 796
Зарегистрирован: 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)
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 867
Зарегистрирован: 24 мар 2017, 18:33

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PS а что делать атеистам ???? 8()
другое мое творчество: samlib.ru/u/us_w/
Аватара пользователя
Valentinus
Старожил
 
Сообщения: 867
Зарегистрирован: 24 мар 2017, 18:33

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

Сообщение sledo 27 июл 2017, 22:49

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

Конечно, закон нарушать нельзя. Проблема в том, что карты высот которые используются по всему миру (да да, и Гугл тоже их использует), которые в свою очередь снял очень, очень дорогой спутник, как правило принадлежат НАСА и находятся в свободном доступе. Наверняка есть такие энтузиасты которые готовы послать и послали на орбиту спутник для сканирования высот Земли, но вот понять что вот эта карта высот от компании "Пупкин Корпорейшен", а вот эта точно такая же карта высот от компании "Все высоты мы купили" довольно затруднительно на столько, что их даже не продают.
Оффтоп:
Woolf писал(а):

Каждый волен верить в то что хочет. Кто то верит что Бог есть. Кто то верит что Бога нет. Это их выбор.
sledo
Старожил
 
Сообщения: 796
Зарегистрирован: 05 янв 2014, 15:44

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

Сообщение snezhok_13 28 июл 2017, 12:04

Это как с фотографиями с фотостоков, контент по идее тоже богом сделанный - божественный закат или виды (что там фотографы щелкают обычно). Но фото (как и снимок сделанный гуглом) принадлежит фотографу и права на снимок.
Блог разработчика игр, программиста — _coremission.net
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 438
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

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

Сообщение sledo 08 июл 2018, 07:52

Давно делал программку для переноса карт высот на Юнити с текстового гео файла ASCII. Саму програмку найти пока не удалось, но вот описание что да как работает есть. Вдруг кому то приспичит создать новый велосипед)
Тут все не просто ;) (Хотя для гениев проще не куда)

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

Основные особенности работы с расширением.
Одно из основных ограничений в работе с переносом данных, это то, что большее всегда может стать меньшим, а вот меньшее стать большим никогда не может. Предположим у вас есть карта высот разрешением 100х100, которую нужно перенести на карту высот разрешением 10х10. Очевидно что при переносе, не понадобится 90% информации от исходной карты высот которая будет проигнорирована, после чего восстановить исходник не представляется возможным, поскольку будет доступно лишь 10% исходной информации. Таким образом, когда вы перенесете карту высот 100х100, на карту высот 10х10, вы всякий раз получите совсем не то что было в исходнике, а лишь какую то часть от исходника.
Еще нерешаемая проблема состоит в том, что в числовом исчислении есть числа которые не делятся друг на друга без бесконечного остатка. Так если два разделить на три, то получится бесконечное число которое придется округлить т.е. либо добавить к числу того что у него не было, либо отнять то что было. После этого из округленного числа, мы никогда снова не получим двойку обратным действием без каких либо дополнительных действий, которые нивелируют наши действия по округлению. Точно так же можно утверждать, что даже не округлив результат, из бесконечного числа снова не получится получить исходное число, по скольку и вычисление бесконечных чисел будет проходить бесконечно.
Как это влияет на карту высот? Представим, что есть исходная карта высот разрешением 50х50, а карта высот Террейна на который надо ее перенести, 33х33. Очевидно, что исходная карта высот больше чем карта высот Террейна и если необходимо уместить ее полностью на Террейне, то придется соблюдать соотношения, что подразумевает под собой деление одного на другое, где как раз и получаем бесконечное число, которое нужно будет округлить, а значит потерять какое либо значение.
Для простоты примера, возьмем сетку 3х3, на которую нужно перенести сетку 5х5. Пока масштаб сеток равен 1к1, никаких трудностей с переносом не возникает — перенесется часть сетки 5х5 максимально корректно. Сложности возникнут, если нужно перенести всю сетку 5х5 на сетку 3х3 и уже придется проигнорировать каких либо два значения на каждой линии у сетки 5х5. Предположим, что нижний левый угол сеток и есть их начало. Пересечения линий сеток, условно обозначим как «ключевые точки с каким то номером». Итак, ключевая точка номер 1 сетки 5х5, точно совпадает с ключевой точкой сетки 3х3 и переносится без проблем. Далее идет ключевая точка 2 сетки 5х5, которая не совпадает с ключевой точкой 2 сетки 3х3. Более того, ключевая точка 2 сетки 3х3 лежит ровно посередине между ключевыми точками 2 и3 сетки 5х5 и с точки зрения человека возникает дилемма, какую из двух лежащих точек сетки 5х5, перенести на точку 2 сетки 3х3. Однако с точки зрения программы все намного проще. Есть точка отсчета и следующее число. Поскольку изменяемая сетка 3х3, то и счет будет идти именно по этой сетке, которая будет принимать значения сетки 5х5. Что бы корректно рассчитать шаг по сетке которая больше, придется разделить 5/3=1,666667. Т.е. сложив число 1,67 три раза, мы должны получить число 5. Поскольку все ключевые точки по счету имеют целое число, нужно результат округлять до целого, в большую или меньшую степень, что бы получить номер ключевой точки из которой нужно взять значение. Итак, попробуем узнать, какие значения будут приняты, а какие проигнорированы. Считаем - 0+1,67 = 2, 1,67+1,67 = 3 и 3,34+1,67 = 5. Значение ключевой точки 1 у сетки 3х3 примет значение ключевой точки 2 (1,67) у сетки 5х5, затем значение ключевой точки 2 у сетки 3х3 примет значение ключевой точки 3 (1,67+1,67) и значение ключевой точки 3 у сетки 3х3 примет значение ключевой точки 5 (3,34+1,67). Счет закончен и были проигнорированы ключевые точки 1 и 4 у сетки карты высот 5х5.
На меньших масштабах проблемы с округлением чисел не так существенны, но вот на бОльших, уже могут приобрести серьезные проблемы. Предположим что нужно перенести сетку не 5х5, а 5 000 х 5 000. Соотношение то же, но итераций сложения округленных чисел, намного больше и в результат конечный результат будет уже не 5,01, а 5010. Очевидно, что округлить целое число без дополнительных вычислений и логики, уже не представляется возможным, что может привести к непредвиденным ошибкам.
В случае если исходная карта высот больше чем изменяемая, то потерь информации не происходит, она лишь дублируется. Тем не менее, восстановить исходник без дополнительных данных, все так же не представляется возможным.
Тот же пример, но уже исходная карта высот 3х3, а изменяемая 5х5. Теперь будет пять итераций по изменяемой карте высот, со счетом в 3/5=0,6. Первое число равно 0+0,6= 1, затем 0,6+0,6 = 1, 1,2+0,6 = 2, 1,8+0,6 = 2 , 2,4+0,6 = 3. Получаем что дважды повторилось значение 1 и 2, а счет закончился без остатка. Проекция меньшего на большее, всегда будет создавать как бы лесенки из повторяющихся значений. Что бы этого избежать, можно использовать интерполяцию между ключевыми значениями. Т.е. в нашем случае это три значения, между которыми нужно брать среднее. Предположим что значения ключевых точек 1 и 2 сетки 3х3 равно 30 и 20. Следовательно, что бы вычислить среднее между ними, нам нужно взять разницу разделить ее на два и прибавить к меньшему значению. т. е. (30 — 20) / 2 + 20 = 25. Соответственно, вместо присваивания второй ключевой точке изменяемой сетке 5х5, значения второй ключевой точки исходной сетки 3х3, надо присвоить среднее, что бы создать плавный переход между ключевыми точками 1 и 3 у сетки 5х5. Но даже использовав интерполяцию, невозможно получить пропорциональную проекцию на сетку, которая не делится без остатка. Т.е. в таком случае, вы всегда получите искажение исходника на проекции. Эти особенности надо учитывать при построении рельефа, особенно, если вы хотите добиться идеальной точности.

Как это выглядит на практике.
У меня есть рисунок 3х3 пикселя, который я буду проецировать на некоторый участок, заведомо бОльший чем разрешение рисунка. Настраиваем и создаем. Как видите, повторяющиеся значения создают ровные поверхности в местах, где их не должно быть. Теперь, создадим рельеф 1к1. Как видите, это именно то, что должно быть. Теперь используя интерполяцию, добьемся такого же результата но на большем разрешении. Как видите, интерполяция сгладила все ровные поверхности и привела рельеф в наиболее похожий вид к исходнику.

Теперь пройдемся по основному функционалу.
Работать с расширением очень просто, все основные функции интуитивно понятны. В верхней части меню функции предварительного просмотра карты высот, затем идут настройки создаваемого террейна и непосредственно создание карты высот на выбраном террейне.
Выбираем карту высот. Расширение автоматически попытается определить разрешение выбранной карты высот и результат запишет в соответствующие позиции. Следует помнить, что если вы работаете с файлами ASCII, то необходимо соблюдать правильность заполнения их заголовков, особенно если вы вручную их создали.
Если вам не нужно создавать всю карту высот, а только ее часть, то в полях «Начальные и конечные размеры карты высот» надо задать участок который вам необходим.
По нажатию кнопки «Создать на сцене рисуок карты высот», будет создан Plane и на нем будет нарисовано то, что получилось бы на террейне. В основном это нужно когда вы работаете с большими объемами данных, что намного быстрее чем если бы вы создавали высоты непосредственно на террейне. Но конечно, никто не запрещает использовать эту функцию в других случаях.
Созданный на сцене «HeightMapPlane», будет не только наглядным примером для вас, но и точкой отсчета для программы, если нужно создать рельеф на каком то участке террейна, нескольких террейнов или же проецировать маленькую карту высот на бОльшее разрешение карты высот террейна.
Затем идет функционал по созданию новых террейнов. Тут все просто, задаем параметры террейнов, их количество, смотрим его размеры и создаем. Террейны будут созданы и добавлены к родительскому объекту, который представляет из себя пустышку. Terrain Data террейнов, так же попадут в отдельно созданную папку с названием FolderTerrainData. Следует помнить, что Unity не будет заменять Terrain Data в FolderTerrainData всякий раз, как вы создадите новый террейн, поэтому если вам нужно сохранить уже созданные Terrain Data, то перемещайте их в свои папки.

Затем приступаем непосредственно к созданию рельефа. К этому делу надо подходить с осторожностью и всегда делать копии вашего уже существующего рельефа и вообще проекта, на всякий случай. Для начала, потренируйтесь изменять рельеф на каком то отдельном проекте, а уже как освоетесь с расширением, изменять его непосредственно на готовом проекте.
Так же следует помнить, что работа с картами высот, подразумевает под собой обработку десятков миллионов данных, поэтому процессы могут занимать продолжительное время. Так например карта высот размером 6000х6000, потребует обработки 36 000 000 данных, только непосредственно на исходнике.
Ну что же, давайте что нибудь изменим.
В паке Demo, есть файлы для примеров, первый с которым поработаем это Test1_3х3. Это обычный рисунок 3х3 пикселя. Он отлично делиться на 33х33, поэтому никаких артефактов с ним быть не должно.
Затем возьмем Test2_5х5. Это тоже обыкновенный рисунок, но тут уже видны артефакты с делением с остатком которые описаны выше.
То же самое можно проделать и с файлами ASCII. (открыть и показать). Однако они созданы для работы с бОльшими объемами данных и в таком формате работать с ним не удобно, поэтому как пример, возьмем скаченный файл разрешением 6001х6002 и создадим рельеф.
Формат файла ASCII, как вы успели заметит, работает непосредственно с числами и в отличии от изображений, имеет ограничения которые имеет непосредственно сам компьютер или программа которая с этим форматом работает. В случае же с изображением, то ограничение черно белых рисунков достигает 255, по числу серых оттенков, а цветных изображений 16 777 216 по числу общих оттенков и цветов. Диапазона цветных рисунков вполне достаточно что бы создавать очень детальные рельефы, но единой дешифровки высот по цветам без дополнительных данных, нет.
Убедимся в этом, создав тот же самый рельеф, но по черно-белому рисунку. Как видите, рельеф тот же, но вот уже есть лесенки.
Так же есть возможность зеркально отразить высоты, наложить рельеф на уже существующий и создать нечто среднее между существующим и накладываемым. Это полезно например если вам нужно добавить гору или равнину, приподнять какую то часть рельефа и т.п.

Знакомый записал видео с этим текстом -
sledo
Старожил
 
Сообщения: 796
Зарегистрирован: 05 янв 2014, 15:44


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

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

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