TGViewer
GameDev: разработка игр GameDev: разработка игр @make_game · 7.63K subscribers
Post #2031 1.24K
Расставить деревья случайно, но чтобы не налезали друг на друга: алгоритм Бридсона и две его оптимизации

Задача из любого процедурного леса, россыпи камней или системы частиц: точки должны быть случайными, но не ближе заданного радиуса. Наивный вариант, кидать точки и отбрасывать близкие, быстро упирается в почти стопроцентный процент отказов. Джастин Стайнман разбирает одностраничный алгоритм Роберта Бридсона 2007 года, у которого почти тысяча цитирований: сетка с ячейкой r / sqrt(d), где в каждой ячейке не больше одной точки, активный список и до 30 попыток на кольце от r до 2r вокруг каждой точки.

Дальше две простые доработки. Для 2D: точка помнит родителя и не тратит попытки на сектор кольца, где заведомо слишком близко к нему. Вторая работает и в 3D. Есть объяснение, как равномерно сэмплировать кольцо и почему 2r * x^(1/d) на случайном единичном векторе при x, равномерном на отрезке от 1/2^d до 1, даёт правильное распределение, и пример на GPU. Метод старый, разбор свежий, применять можно в любом движке.

@make_game
  • ❤ 2
  • 👍 1
More from @make_game
  1. Sep 20, 2026Как собрать редактируемую 2D-карту в Unity с Marching Squares Туториал начинает с сетки яч…
  2. Sep 20, 2026Как пространственное разбиение ускоряет поиск соседей в игровом мире В стратегии реального…
  3. Sep 20, 2026Как построить кубическую сферу в Unity без скопления вершин у полюсов У обычной UV-сферы в…
  4. Sep 19, 2026Зачем игровому движку очередь событий Прямой вызов playSound() блокирует меню, пока аудиод…
  5. Sep 19, 2026Как разделить код теней в собственном конвейере рендеринга Unity Custom SRP 7.1.0 для Unit…
  6. Sep 19, 2026Как численное интегрирование двигает объекты в игровой физике Физический цикл не вычисляет…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →