blender3d, слоистые скалы и нейросеть

Автор: wayerr

Давно зудела мысль заставить блендер генерировать слоистые скалы по заданному рельефу.

Со скалами у меня по крайней мере всё сложно, возиться с растровыми текстурами я не люблю, а без них скалы толком не получаются

Сам по себе какой-нибудь рельеф можно сгенерировать блендеровским плагином:

Это пример, как видно рельеф "мутный". Там есть каньоны и т.п. но мне для задачи понадобились такие вот пики. Народ на них лепит текстуру и всё.

Но я взял блендеровские ноды и...

"Зелёное" послужило основой. Вся вот эта красноватая слоистая конструкция попросту "приближает" рельеф зелёного (и его там местами видно через щели, но не на скриншоте). 

Причём сам по себе код нод получился достаточно простым (а тут видно зелёнку):

Это правда простой код. Малость запутанный. Но вы не видели сколько экранов занимает код генерации города вот тут.

Идея создать такой рельеф была давно. Самое простое взять microdisplacement и текстуру волны (сгенерированную, есессно). Но там выходила неправильная граница слоёв - не ступенчатая. Где-то такое подойдёт, а где-то нет. Скажем так, в горах я редко видел слоистый рельеф со сглаженным торцом слоев (это в основном у воды или там где песком и ветром полирует). 

Ну и microdisplacement подходит только для переднего плана, на всю сцену он не влезает в оперативку и приходится очень-очень вычищать сцену, так что выглядит результат мрачно (к слову, тут скорее всего displacement всё равно понадобится для переднего плана).

Потому я лениво тыкал разные варианты алгоритмов генерации, но безуспешно. Сделать объемные слои и повернуть не так сложно, а вот как ими приблизить рельеф? Теоретически там можно было считать расстояние до полигонов рельефа, удалять лишнее из объёмных фигур, заделывать торцы и т.п. это малопродуктивно (будет тормозить). Приближать инстансами-кубиками тоже мрак, там сложно создать гладкие "изгибы слоёв" и потом при преобразовании в меш оно страшное и ненатуральное. И вот недавно я вдруг читая очередные нововведения блендера вспомнил эту задачку и решил снова поиграться с ним.

Оказалось всё просто. (Дальше куча непонятных слов.) Мы берём обычную плоскость на всю площадь рельефа, в нужной мере её делим на полигоны. Это будет очевидно "слой". Потом эти плоскости собираем в стопку через разные промежутки (random value + accumulate field). Весь этот "пирог" искажаем волновым шумом. Потом удаляем всё что находится слишком далеко от образца. Делим ещё раз, снова удалям далёкие полигоны (теперь ещё и те что и внутри, учитывая нормаль, если это делать сразу, то будут "дыры"). Так у нас получается стопка весьма кривых "плоскостей", описывающих рельеф. Но нужны то объемные слои. И тут просто делаем extrude (два раза, чтобы на "боку" было по два полигона). И всё! У нас есть готовые в нужной мере кривые слои. Только краешек зубастый, но это делается простым смещенеим вершин в сторону образцового рельефа поперёк нормали - получаются ровные выемки и плавные обводы. Всё ещё немного обдать шумом и subdivide и вуаля. Рельеф готов.

С ним ещё очень много работы, там камней накидать, песка, поработать над передним планом и т.п.

А можно взять нейросеть, в неё inpaint модель и:

На деле, внимательный взор заметит ошибку нейросети: слева скалы из одного рельефа, а справа из другого (и слои и сглаженность), это в принципе несложно исправить. Когда возникнет такая надобность.

Но в целом такие заморочки, конечно, не для нейросети, там можно более простой исходник взять. С такими нодами можно попробовать сделать реалистичный речной пейзажик (только слои тоньше и белые).

+47
364

0 комментариев, по

2 284 425 206
Наверх Вниз