Я нуждаюсь в помощи. Я ломал голову, но просто не могу найти хороших примеров кода того, как программно генерировать фигуры, подобные этим (световые вспышки, мерцания, солнечные лучи и т. Д.).
Мне действительно нужна помощь здесь. Кто-нибудь может привести примеры с кодом, которые могут помочь мне создать нечто подобное?
Я использую язык, похожий на C ++.
Все они выглядят как светлый центр в центре и при выходе из него как затухающие (тускнеющие), так и рассеивающие (растущие).
Чтобы исчезнуть, вы хотите масштабировать свет от максимальной интенсивности с помощью функции r
(расстояние). Физически это было бы что-то вроде 1/r
или же 1/r^2
но в вашем случае вам может быть больше удачи, используя экспоненциальный e^(-r)
или даже линейное затухание 1 - a*r
Основным аспектом эффекта является диффузия. Самым простым способом эмуляции диффузии, кроме построения полноценного на raytracer, было бы применение линейного размытие по Гауссу (или даже простое усреднение размытия) вдоль оси вращения. Например, точка рассеяния при r = 3, тета = 0,5 может быть средним из нерассеянных точек между r = 3, тета = 0,4 и r = 3, тета = 0,6. Вы получите лучшие эффекты, если «окно» функции размытия масштабируется с r
, То есть чем больше r
, чем больше окно усреднения, или тем больше сигма для размытия по Гауссу.
Наконец, похоже, что перед диффузией луч вращательно «отфильтровывается» с помощью тета-переменной функции пропускания. То есть количество луча, которое «выходит» из фильтра, является функцией угла. Эта функция выглядит несколько рандомизированной, но с видимой структурой (т. Е. Полосами света и темноты, а не просто белым шумом). Это идеальный кандидат на Perlin Noise, который генерирует случайные данные со структурой. Вы можете настроить, насколько хорошо эта структура в алгоритме шума Perlin; это действительно то, что отличает три картины, которые вы показываете.
Итак, в заключение:
Сначала рассчитаем недисперсное распределение:
Начните исчезающий шар света, f (r, theta) = 1 / r (или некоторое другое исчезновение)
Умножьте затухающий шар света на функцию шумового фильтра p (theta) — но, возможно, только на точки, проходящие за заданный радиус (чтобы этот белый шар находился посередине)
Затем разогнать все с помощью радиально растущего размытого окна.
Возможно, добавьте белый шум зерна ко всему.
Я думаю, что это всего лишь один из способов их создания; могут быть и другие, но это может быть хорошим началом.
Я бы начал с определения функции f (тета, расстояние), которая дает вам интенсивность света при тета-градусах вращения и на этом расстоянии от центра. Вы можете, вероятно, поиграть с периодическими функциями, такими как sin, чтобы изменить тонкость пакетов.
Другой, даже более крутой вариант — изучить физику и выяснить, как такой эффект происходит с вашими глазами в первую очередь, когда вы смотрите на яркий свет … Затем скопируйте в коде математику реального мира.