Sandbox часть 2
Здравствуйте! Не смотря на то что большого интереса к первому посту не было, все пару человек предложили мне более подробно остановиться на концепциях и механиках задуманной "песочницы" посему я решил продолжить. Рейтинга по прежнему не хватает для ка того чтобы публиковать картинки, поэтому будет только текст.
И так по порядку: Ландшафт!. Я определил для себя 10 пунктов:
1 Программная генерация ландшафта, точнее его Mrsh(почему опишу ниже).
2 Разделение ландшафта на "Ячейки взаимодействия".
3 Объединение ячеек в группы(чанки) .
4 Терраформинг (понижение/ повышение) высоты в заданной точке.
5 выравнивание поверхности.
6 При возникновении значительных перепадов высоты осыпание сыпучих материалов.
7 Хранение изменений в ландшафте в постоянной памяти.
8 Туннели.
9 Вскапывание поверхности для посадки растений
10 трава.
На данный момент полностью или почти полностью реализованы первые 7 пунктов кроме пятого.
Первой задачей которую я перед собой поставил это ландшафт. Конечно же мне хотелось чтобы он был огромен, полностью изменяем, но при этом не кубическим, мне хотелось получить все возможности тераформинга, при этом сохранив реалистичный, ну или хотя бы максимально приближенный к реалистичному вид. Долгие поиски по форумам, как по русскоязычным, так и по забугорным, практически не дали ответа на мой вопрос, так как именно то что я себе напридумывал, если кто то и написал, то делиться своими наработками не спешит(ога:) халявы захотел, их нет у меня, сам сам). Но время не было потрачено зря, все советы сводились к тому что если хочешь делать с поверхностью то что хочется тебе, значит пиши свой Mesh и прописывай как он будет меняться.
Попытаюсь рассказать простыми словами что такое Mesh для тех кто не в курсе. Mesh является основой(каркасом) практически любого элемента графики и представляет из себя набор вершин, треугольников, нормалей, текстурных координат (UV), и прочих страшных слов, он как бы является каркасом. Если представить себе квадрат с диагональю(тут бы не помешала картинка но увы) закрашенный скажем синим цветом, то у него есть четыре вершины, и они соединены в два треугольника это и есть каркас, а синяя заливка это текстура, и если я хочу скажем согнуть квадрат, то я могу его согнуть, но только по диагонали. хочется гнуть в ту сторону где нет диагонали? Да без проблем, добавляем вершину в центре, пере соединяем уже 5 вершин в 4 треугольника и т. д. чем будет больше вершин и треугольников, тем больше свободы действий мы получим и тем сильнее будет загружен о наше устройство чтобы все это просчитать и отрисовать (так сказать хочешь пряник получи и кнут).Я остановился на системе где одна клетка состоит из 9-ти вершин и 8 треугольников соответственно, где игрок взаимодействует только с центральной вершиной, а остальные являются вспомогательными и рассчитываются в зависимости от окружающего ландшафта. Наверное на этом моменте с мешем я приторможу, так как далее объяснить без картинок будет крайне сложно.
Вторая проблема которая стала передо мной это текстурирование этого меша, ведь недостаточно сделать ландшафт один раз (в плане сдесья у нас будет песочек, а тута скала), ведь он будет постоянно меняться, и покопав немного песочек под ним может обнаружиться скала, или наоборот на скалу насыпать песочка, почему нет? Казалось бы все просто, у "Ты же поделил на ячейки" возьми десяток материалов и натягивай на клетку тот который должен быть в данный момент, но увы и ах. Давайте попробуем посчитать: кусочек ландшафта 1км*1км если ячейка 1*1м имеет не много не мало 1 000 000 таких ячеек а каждый материал вызывает 1 цикл отрисовки каждый кадр, проще говоря при таком подходе наша система только и будет делать что пыхтя и греясь отрисовывать все это богатство. А ведь еще ничего нет, и ничего не делается, а видео карта уже гудит и пофыркивает(я такого извращения не делал но вполне способен себе представить). Выходы из этой ситуации есть и один из них объединить ячейки в группы (я после некоторых экспериментов остановился на группе в 48*48 ячеек ) таким образом 2304 ячейки имеют один материал(а внутри материала нужные текстуры располагаются по специальной карте, для этого был написан специальный Shaider но это отдельная тема) и мы имеем уже всего то порядка 430 циклов отрисовки на квадратный километр, не плохо по сравнению с 1 000 000 неправда ли? На этом наверно вторую часть буду заканчивать, глазом не успел моргнуть как получилось много текста, а затронул всего то пару пунктов. В заключении хочу сказать что пост не рекламы ради. Я ее пишу один, в свободное время и не имея никакого опыта коммерческой разработки. Просто хочу выговориться что - ли и поделиться своими мыслями, возможно эта информация кому то поможет или просто будет интересна.
Спасибо!
Лига Разработчиков Видеоигр
8.5K постов23.1K подписчика
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"