Алгоритм строительства кубов в ue4, как в 3d max.
Я всё же решил превращать прототип про леммингов на механизмах (https://pikabu.ru/story/lemmingi_na_mekhanizmakh_za_4_chasa_6371866) в полноценную игру.
Т.к. по плану в игре должен быть редактор карт. Ландшафт нужен ровный для удобного размещения механизмов. Решил дать возможность игроку строить кубы произвольных пропорций и размеров, и чтобы это было просто на уровне 3Д Макса. Без использования массивов (т.е. если строится 1 куб, то он и должен быть одним) и процедурных статик мешей (просто не люблю их, но при желании алгоритм можно адаптировать и под них).
Что получилось можно посмотреть на видео. Текстура в клеточку для удобства, на самом деле кубы цельные (в конце видео есть пруфы).
Делюсь реализацией.
В unreal engine 4 есть функция GetHitUnderCursor, которая позволяет определить над чем висит указатель мышки. Если есть плоский, горизонтальный статикмеш/плейн за который курсор может зацепиться, то можно начинать строить кубы произвольных пропорций, но со скейлом по Z равным 1. Для этого достаточно смотреть разницу в координатах курсора между началом строительства (на скриншотах start) и текущим положением (на скриншотах finish) и после небольшой калибровки (зависит от размеров изначального меша) задавать новый scale.
Однако есть проблема… т.к. пивот объекта в центре, то при изменении скейла объект будет «плыть». Следовательно, корректируем его локацию. Определяем вектор направления между стартом и финишем и берём половинное от пройденного расстояния. Готово.
Скриншоты удобно увеличивать, кликая по ним колёсиком.
С плоскостью понятно, а как же определять вертикаль? Заранее разместить вертикальную сетку/меш/плейн на уровне? А если игрок посмотрит влево, и она уйдёт из кадра? Решено спавнить сетку прямо перед лицом игрока всегда держа её перпендикулярно камере. Лучше сделать её невидимой для игрока… а то мозг начинает тупить, когда координатная ось двигается вместе с камерой.
Можно подобный трюк проделать и с горизонтальной сеткой. Но я решил обойтись. Всё равно в редакторе нужен какой-то ориентир и горизонтальная, статичная сетка хорошо справляется с этой ролью.
На скриншоте ниже алгоритм скалирования по Z. В целом он мало отличается от скалирования по X и Y.
Я считаю, что blueprint очень легко читается даже теми, кто им никогда не пользовался, так что адаптировать алгоритм под другие языки не должно быть чем-то сложным.
Где можно применить? В первую очередь в простых редакторах 3д уровней. Если же хочется дать игроку полный контроль над кубами (выдавливание, удаление участка куба, создание окон и т.п. ), то лучше использовать или массивы или процедурные меши (хотя часть с невидимой вертикальной сеткой всё равно пригодится).
В стратегиях с разметкой территории (cityskiline, rimworld, two point hospital и т.п.) тоже лучше использовать массивы. Однако, например, для строительства процедурного небоскрёба лучше подойдёт единый куб.
Кстати, откапал старый пак графики, купленный ещё хз когда. Добавил своего (толкатель с кнопкой пока ещё не сделал) и попробовал всё это накидать на уровень из скриншота предыдущего поста. Вот, что получилось.




Лига Разработчиков Видеоигр
9K постов23.2K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"