Есть ли алгоритм для генерации молнии?
Я хотел бы алгоритм, который генерирует список объектов сегмента или точки, указывающей, где болт приземлится. Для метода потребуется параметр начальной точки и конечная точка. У болта должны быть случайные ответвления и зигзагообразные интервалы. Результатом будет случайный эффект молнии, который будет выглядеть примерно так
(источник: wikimedia.org )
Если кто-нибудь знает алгоритм, для которого это может работать, помощь будет принята с благодарностью!
algorithm
graphic-effects
Жоффруа
источник
источник
Ответы:
Существует довольно простой алгоритм, который вы можете использовать для создания осветительных болтов.
Начните с отрезка между
O
точкой начала ( ) и конечной точкой (E
)Выберите точку на этой линии (приблизительно или точно посередине), позвоните
S
и разделите сегмент на два отрезка (O->S
иS->E
). СместитьS
от исходного сегмента линии (вдоль нормали сегмента) на небольшую случайную величину. Это дает вам один «изгиб» молнии.После того, как вы вычислили изгиб, на основании небольшого случайного шанса вы захотите добавить третий отрезок (обычно это расширение
O->S
отрезка). Вот как вы производите «вилки» на молнии. Обычно вы хотите отслеживать информацию об интенсивности болта во время этого процесса генерации, потому что вы хотите, чтобы вилки были тусклыми или имели более тонкое размытие:Затем повторите описанный выше процесс для всех новых сегментов линии, которые у вас есть; вам нужно будет выбрать количество повторений, которое даст вам понравившиеся формы:
Здесь есть довольно четкое объяснение этой техники в блоге моего друга (именно там я бесстыдно украл фотографии); это добавляет дополнительную глубину о добавлении эффекта свечения также.
Наконец, есть также статья NVIDIA, в которой описан тот же базовый алгоритм (также с более подробной информацией).
источник
Я бы порекомендовал альтернативный подход: быстро исследующее случайное дерево (RRT) . Одна крутая вещь об этом - вы можете заставить его идти по углам или взрываться во всех направлениях.
Алгоритм действительно прост:
Изменяя
RandomSample
иExtendToward
функции, вы можете получить очень разные деревья. ЕслиRandomSample
повсюду будут одинаковые выборки, дерево будет расти равномерно во всех направлениях. Если оно смещено к цели, дерево будет стремиться расти к цели. Если это всегда выборка цели, дерево будет прямой линией от начала до цели.ExtendToward
может позволить вам делать интересные вещи с деревом, а также. С одной стороны, если у вас есть препятствия (например, стены), вы можете заставить дерево расти вокруг них, просто отклоняя расширения, которые сталкиваются со стенами.Вот как это выглядит, когда вы не смещаете выборку к цели:
(источник: uiuc.edu )
А вот как это выглядит со стенами
Некоторые интересные свойства RRT после его завершения:
источник