forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Генерация и представление гексагональной решетки (http://forum.boolean.name/showthread.php?t=18709)

maewyn 14.11.2013 00:15

Генерация и представление гексагональной решетки
 
Здравствуйте. Написал небольшой скрипт для создания гексагональной решетки с заданным по вертикали и горизонтали количеством гексов. Сейчас у меня каждый гекс - это отдельный gameObject(точнее инстанциированный префаб). Но мне кажется такой подход не самый лучший с точки зрения производительности. При сторонах решетки 1000x1000 уже получается миллион gameObject'ов, а ещё, насколько я понял, есть ограничение на количество меш коллаидеров, хотя gameObject'ам удобно назначать материал и проверять клики по ним.

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

Хочу узнать, можно ли их сделать одним объектом на котором была бы возможность склеить тот же условный миллион текстур(как если бы я назначил текстуру каждому gameobject'у)

Помимо этого планирую каждому гексу назначать определенные атрибуты вроде занят/не занят и т. п. Хранить их хочу, например 64-битным числом, каждый бит которого соответствует какому-нибудь атрибуту.
Так же сделать двумерный массив, где будут храниться все гексы.

pax 14.11.2013 07:58

Ответ: Генерация и представление гексагональной решетки
 
Ну так что мешает сгенерировать Mesh для поля, пускай не один, а поделить поле например на части 100х100 (какие будут приемлемы)? Как хранить - сам ответил на вопрос - массив.

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

maewyn 28.11.2013 01:57

Ответ: Генерация и представление гексагональной решетки
 
Спасибо за ответ, так и сделал. Создаю меши в виде гексового поля. Программа теперь сама определяет на сколько мешей поделить карту, в зависимости от указанной длины и ширины карты(в гексах) и максимального количества гексов в одном меше, а также правильно стыкует соседние меши.
Сделал 2 способа наложения текстуры.
В первом случае используется алтас и для каждых 6 вершин гексов в меше задется uv(пока что тайлы гексов из атласа выбираются наугад). Получается много мешей, на которых одна и та же текстура атласа, но разные uv.
А во втором случае берется все тот же атлас и на его основе создается новая текстура(тоже тайлы наугад), которая накладывается на меш грубо говоря 1 в 1. Получается много мешей, каждый со своей уникальной текстурой.

Вопрос, какой из способов посоветуете оставить, или может есть лучшие варианты?
Пока склоняюсь ко второму, т.к. мне кажется миникарту будет делать проще. Но есть вопросы, какой максимальный размер генерируемой текстуры лучше выставить (пока 1024x1024) и какой оптимальный размер на ваш взгляд для одного тайла в атласе). Да и производительность лучше в первом случае.

Генерирую типы местности(трава, вода, песок и т. д.) для гексов и храню их в массиве. Далее исходя из типа местности выбираю из атласа нужный тайл местности или тайл перехода.
Большие трудности вызывает алгоритм для генерации типов местности, а вернее его отстутствие)) А еще большие - создание правильных переходов. Поделитесь, пожалуйста, опытом или статьями.

Интереснее всего узнать о построении береговой линии. В цивилизации 5 она очень красива, при этом, насколько я помню, карты там тоже генерируются.

Если делать анимацию воды, то всю воду стоит разнести в отдельные меши?

pax 28.11.2013 15:08

Ответ: Генерация и представление гексагональной решетки
 
Чем меньше текстур тем лучше. Атлас лучше всего с одним материалом и генерацией меша с нужными uv. Вода сложный вопрос, я наверное пока ничего не посоветую по этому поводу.

maewyn 28.11.2013 17:01

Ответ: Генерация и представление гексагональной решетки
 
Ок. А если в атласе все не поместится? Сейчас размер атласа 1024x1024, а одного тайла 128x128. Получается вмещается всего 64 варианта. С учетом всех типов местности и переходов между ними может не хватить одного.

pax 28.11.2013 17:05

Ответ: Генерация и представление гексагональной решетки
 
А не получится переход делать шейдером с маской?

maewyn 28.11.2013 18:25

Ответ: Генерация и представление гексагональной решетки
 
Если жизнь заставит, то, конечно, получится) А вообще планировалось их рисовать вручную и вносить в атлас(ы)(если имелся в виду типа такого шейдер http://habrahabr.ru/post/180743/ ).

maewyn 16.01.2014 04:19

Ответ: Генерация и представление гексагональной решетки
 
Появился еще вопрос по поводу визуализации сетки поверх меша из гексов. Сделал с помощью gl quads(чтобы толщину обводки гекса можно было задавать), но число вершин увеличилось в 2 раза и соответственно drawcalls тоже, fps упало до 20)) Как быть?)

Вот картинка, что я имею в виду


pax 16.01.2014 07:44

Ответ: Генерация и представление гексагональной решетки
 
Используй не GL, а генерируй Mesh на группу хексов сразу. Тогда ты снизишь количество дравколов. Либо рисуй хексы более сложным шейдером с текстурой обводки

maewyn 17.01.2014 00:43

Ответ: Генерация и представление гексагональной решетки
 
Попробую с мешем. Сначала пытался использовать шейдер, который бы определял пиксели, которые находятся по краям каждого гекса и закрашивал их, но получалось, что при достаточно большом отдалении камеры обводка была не видна.

А что, если вместо редактора будет ландшафт с неровностями и и деревьями?

pax 17.01.2014 08:01

Ответ: Генерация и представление гексагональной решетки
 
Второй текстурой или декалью, повторяющей геометрию тогда. Скорее всего декалью.


Часовой пояс GMT +4, время: 19:31.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot