На днях тут напоролся на одну статью про парсер местности (далее будет понятнее) на одном форуме. Чувак тупо рассказал как криво парсить файлы .h32 в клиенте, вывел это всё в OpenGL и всё на этом. Никакого профита, на деле не было показано.
Из-за долгих споров с местными "топ" разработчиками, эго которых я зацепил своей постоянной критикой
, автор самоудалился, а модеры почистили тему и не оставили следов интересных событий. Какие же все обиженки.
![1689051572354.png 1689051572354.png](https://syntax-gc.org/data/attachments/0/1-3308a230f11d9f57db3083416b947125.jpg?hash=MwiiMPEdn1)
Переходим к теме данной темы.
"Земля/terrain" по которой бегают персонажи, мобы и так далее, это генерируемый mesh из карты высот heightMap. Почитать об этом можно в гугле, тут я не буду расписывать. На скрине terrain сгенерированный из карты высот в клиенте.
![1689051680537.png 1689051680537.png](https://syntax-gc.org/data/attachments/0/2-47935f3f968908bd77ec131e6352e90c.jpg?hash=R5NfP5aJCL)
Генерируется это из файла который находится в Levels\'location'\terrain\land_map.h32
Файл читать можно любым языком программирования (java, python, c#).
Ничего сложного в этом файле нет, если считывать его побитово, то получаем следующий формат
2 байта - float значение, 1 байт - цвет (но это не точно)
Python
где:
byte_data - это файл land_map.h32
z - координата высоты точки (vertex)
vertex_color - цвет точки (но это не точно)
Java
где:
byteData - это файл land_map.h32
heightmap - заполнение массивы высот (далее будет подробнее)
vColor - цвет точки
С# код можно посмотреть у zzsort по ссылке
Далее самое интересное и вкусно, как применить то что мы считываем.
В JMonkeyEngine есть отличная статья
Добавляем h32 файл и получаем примерно такой код:
По итогу мы получаем готовый mesh вот такого вида:
![1689051728951.png 1689051728951.png](https://syntax-gc.org/data/attachments/0/4-d79d2655d856d2920262b7cc24c39a99.jpg?hash=150mVdhW0p)
Это упрощенный пример, но на основе его вы можете построить вполне рабочий вариант.
Переходим к варианту с blender. В принципе тут код сложнее, но реализация проще, её можно описать одним скрином
![1689051704419.png 1689051704419.png](https://syntax-gc.org/data/attachments/0/3-fc4b03d3dcf7e8da54a6bbe25aa68f02.jpg?hash=_EsD09z36N)
Будут вопросы, пишите!)
Из-за долгих споров с местными "топ" разработчиками, эго которых я зацепил своей постоянной критикой
![Slightly smiling face :slight_smile: 🙂](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
![1689051572354.png 1689051572354.png](https://syntax-gc.org/data/attachments/0/1-3308a230f11d9f57db3083416b947125.jpg?hash=MwiiMPEdn1)
Переходим к теме данной темы.
"Земля/terrain" по которой бегают персонажи, мобы и так далее, это генерируемый mesh из карты высот heightMap. Почитать об этом можно в гугле, тут я не буду расписывать. На скрине terrain сгенерированный из карты высот в клиенте.
![1689051680537.png 1689051680537.png](https://syntax-gc.org/data/attachments/0/2-47935f3f968908bd77ec131e6352e90c.jpg?hash=R5NfP5aJCL)
Генерируется это из файла который находится в Levels\'location'\terrain\land_map.h32
Файл читать можно любым языком программирования (java, python, c#).
Ничего сложного в этом файле нет, если считывать его побитово, то получаем следующий формат
2 байта - float значение, 1 байт - цвет (но это не точно)
Python
Python:
Please,
Вход
or
Регистрация to view codes content!
byte_data - это файл land_map.h32
z - координата высоты точки (vertex)
vertex_color - цвет точки (но это не точно)
Java
Java:
Please,
Вход
or
Регистрация to view codes content!
byteData - это файл land_map.h32
heightmap - заполнение массивы высот (далее будет подробнее)
vColor - цвет точки
С# код можно посмотреть у zzsort по ссылке
Please,
Вход
or
Регистрация
to view URLs content!
Далее самое интересное и вкусно, как применить то что мы считываем.
В JMonkeyEngine есть отличная статья
Please,
Вход
or
Регистрация
to view URLs content!
а так же очень удобный функционал построения местности по карте высотДобавляем h32 файл и получаем примерно такой код:
Java:
Please,
Вход
or
Регистрация to view codes content!
По итогу мы получаем готовый mesh вот такого вида:
![1689051728951.png 1689051728951.png](https://syntax-gc.org/data/attachments/0/4-d79d2655d856d2920262b7cc24c39a99.jpg?hash=150mVdhW0p)
Это упрощенный пример, но на основе его вы можете построить вполне рабочий вариант.
Переходим к варианту с blender. В принципе тут код сложнее, но реализация проще, её можно описать одним скрином
![1689051704419.png 1689051704419.png](https://syntax-gc.org/data/attachments/0/3-fc4b03d3dcf7e8da54a6bbe25aa68f02.jpg?hash=_EsD09z36N)
Будут вопросы, пишите!)