ПрограммированиеФорумГрафика

Равномерно-случайно расположить точки на ландшафте.

Страницы: 1 2 3 4 Следующая »
#0
14:12, 9 июля 2024

Собственно  да, хочу сделать автоматическую рассадку кустиков, камушек и прочего на ландшафте в своем движке. На "плоской" плоскости нет никаких особо проблем. Можно нарезать на квадратики мир, в этих квадратиках случайно раскидываем точки по какому-то закону, хальтоном / possion disk / да чем угодно. Точки можно проредить по 2d шуму, как-нибудь закрываем глаза на проблему затайливания этих случайных точек "и плов готов".

Другое дело, когда появляется третье измерение. Если не обращать на Y координату, а рассаживать все по XZ, то на склонах гор шаг рассадки по Y начинает становится сильно большим. И самое печальное, когда не кратных размеров, а 1.3, 1,7 или 2,5.

Вот пример бокового среза ландшафта и рассадки:
landscape_slice | Равномерно-случайно расположить точки на ландшафте.

Но если не в срезе смотреть, а в 3д, то вообще не понятно как решать.

Точное решение то не нужно, нужно какое-то визуально вменяемое. Может кто сталкивался с таким.

Я видел публикации про possion disk samples на 3д геометрии, алгоритмы там веселые и в реалтайме не хотелось бы такое гонять, да и имплеменить тоже весело такое.

#1
14:29, 9 июля 2024

0xFFFFFFFF
Как то учитывать градиент по позиции мира ?

#2
14:42, 9 июля 2024

Может не страдать фигнёй и не сажать на крутых склонах, собственно трава там обычно и не растёт, а на более менее пологих проблема будет не сильно актуальна.

#3
15:08, 9 июля 2024

innuendo
не понятно как его учитывать, на 3d поверхности, вот у меня наклон 30 град по оси x и 45 по z, а у парочки соседних пикселей уже свой градиент. Тут целый набор плоскостей, по разному ориентированный в пространстве.

Kemanorel
камушки/уступы, корешки и прочее.

#4
15:26, 9 июля 2024

0xFFFFFFFF
Как обычный градиент на сетке, дальше эвристику

#5
15:46, 9 июля 2024

innuendo
> Как обычный градиент на сетке, дальше эвристику
звучит как туториал "как нарисовать сову". Ты делал нечто похожее или нет?

#6
17:49, 9 июля 2024

0xFFFFFFFF
Была похожая задача ...причем тут пиксели ? У тебя же на террейне сетка ? Скорее всего равномерная ?

#7
(Правка: 18:16) 18:12, 9 июля 2024

Смотри, у тебя есть регулярная сетка. Пусть на плоский (все 4 вершины на одной высоте) патч размером метр на метр генерируется 100 травинок.

Патч с разными высотами состоит из двух треугольников, посчитай их площадь, допустим получится 1.4м2. тогда тебе на этом патче нужно сгенерить 140 травинок.

В таком случае плотность травы будет примерно одинаковая.

#8
(Правка: 18:20) 18:16, 9 июля 2024

HolyDel
Мера множества ? Конченными разностями не проще ? :)
Площадь всегда будет изотропной мерой , а с градиентом можно анизатроптно

#9
(Правка: 18:24) 18:21, 9 июля 2024

HolyDel
накрутить еще травинок не проблема, проблема накрутить их так, чтобы они спавнились таким образом, чтобы распределялись нужным образом на этом треугольнике или вытянутом четырех угольнике.
т.е. если смотреть сверху, то на XZ это квадратик, а в мире это просто странно вытянутый повернутый четырехугольник.
а если шаг рассадки объекта соразмерен сетке или больше, то еще веселее.

#10
18:24, 9 июля 2024

0xFFFFFFFF
Так тебе же рассказали как плотность травинок учитывать
Можно линейно но скорее всего квадратично

#11
18:39, 9 июля 2024

0xFFFFFFFF
Для начала тебе впринципе нужен алгоритм, который умеет точки располагать с учетом плотности. Например вот:
https://www.vertexfragment.com/ramblings/variable-density-poisson-sampler/

После этого твою карту высот нужно превратить в карту плотности. Насколько я понимаю плотность будет:
density = 1.0 / dot(ground_normal, up_vector)
тут
ground_normal - нормаль в конкретной точке ландшафта
up_vector - собственно вектор вверх, скорее всего (0, 1, 0)

#12
18:42, 9 июля 2024

innuendo
хорошо, наводящий вопрос, как РАВНОМЕРНО расставлять СЛУЧАЙНЫЕ( хотя даже хрен с ним, пусть пока  и не случайно) точки, БЕЗ ШВОВ на поверхности из этих треугольников.

т.е. как я сейчас делаю, есть какой-то XZ регион в мире, в нем я генерирую семплы как в единичном квадрате по хальтону, можно по R2, можно другую low disparity последовательность, можно заранее пойжон семплы сгенерить и их сгенерить, но факт в том, что невозможно управлять, куда упадет новый семпл, он падает случайно, и как их еще докинуть В НУЖНОЕ МЕСТО не понятно и как опосредованно управлять распределением тоже не совсем понятно.

Как итог, в 2d семплы распределены равномерно, а в 3d потяги на наклонах.

Если брать бесконечную наклонную плоскость в 3d, то нет проблем в ней сгенерить семплы равномерно, можно взять ограниченную четырмя сторонами плоскость и откинуть все лишние семплы - это тоже не проблема.
Проблема в том, что когда эти четырехугольники образую какую-то поверхность, то как стыковать эти все семплы, независимо сгенеренные.

#13
18:45, 9 июля 2024

0xFFFFFFFF
Без швов это уже гладкие функции

#14
18:53, 9 июля 2024

MrShoor
> После этого твою карту высот нужно превратить в карту плотности. Насколько я понимаю плотность будет:
> density = 1.0 / dot(ground_normal, up_vector)
> тут
> ground_normal - нормаль в конкретной точке ландшафта
> up_vector - собственно вектор вверх, скорее всего (0, 1, 0)

это не проблема, это делал.
беда в в том, что 2d карта плотности не решает проблему для 3d, плотность она не по направлению, она скаляр.


https://www.vertexfragment.com/ramblings/variable-density-poisson-sampler/
но я опять задумался, чтобы добавить третье или псевдо третье измерение, если смотреть в сторону possion семплов.
единственное, там же медленный dart throwing как я понимаю, вот сомневаюсь, что оно быстро будет работать на лету.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика