2013-09-06 2 views
1

Мне нужна помощь. Я ломаю голову, но я просто не могу найти хороших примеров кода, как программно создавать похожие на них фигуры (световые вспышки, мерцания, солнечные лучи и т. Д.).Как программно создавать похожие на них фигуры?

http://www.richardrosenman.com/storage/lightburst.jpg

мне действительно нужна помощь здесь. Может ли кто-нибудь из некоторых примеров с кодом, который может помочь мне создать нечто подобное?

Я использую язык, похожий на C++.

ответ

0

Я бы начал с определения функции f (theta, distance), которая дает вам интенсивность света при углах поворота и на этом расстоянии от центра. Вероятно, вы можете играть с периодическими функциями, такими как sin, чтобы изменить тонкие всплески.

Еще один, более простой вариант - изучить физику и выяснить, как такой эффект случается с вашими глазами в первую очередь, когда вы смотрите на яркие огни ... Затем повторяйте математику реального мира в коде.

2

Все они выглядят как центр света, яркий в центре и, при выезде, оба исчезают (растут диммер) и рассеиваются (становятся все более распространенными).

Чтобы угаснуть, вам необходимо масштабировать свет от максимальной интенсивности с помощью функции r (расстояние). Физически это будет что-то вроде 1/r или 1/r^2, но в вашем случае, вы можете иметь больше удачи, используя экспоненциальное e^(-r) или даже линейный замирание 1 - a*r

Важным аспектом эффекта является диффузия. Самый простой способ эмулировать диффузию, не создавая полного на raytracer, заключался бы в применении линейного гауссовского размытия (или даже простого размытия) вдоль оси вращения. Например, рассеянная точка при r = 3, theta = 0,5 может быть средней для неопределенных точек между r = 3, theta = 0.4 и r = 3, theta = 0.6. Вы получите лучшие эффекты, если «окно» функции размытия масштабируется с r. То есть, чем больше r, тем больше окно усреднения или больше сигма для размытия гауссова.

Наконец, перед диффузией оно выглядит так, что луча вращается «отфильтрована» с помощью изменяемой по течению функции передачи. То есть количество луча, которое «ускользает» от фильтра, зависит от угла. Эта функция выглядит несколько рандомизированной, но с кажущейся структурой (т. Е. Полосами света и темного, а не просто белым шумом). Это идеальный кандидат для Perlin Noise, который генерирует случайные данные со структурой. Вы можете настроить, насколько тонка эта структура в алгоритме perlin noise; это действительно то, что отличает три изображения, которые вы показываете.

Так что в итоге:

  1. Во-первых, рассчитать недиспергированный распределение:

    • Start затухающий шар света, F (г, тета) = 1/г (или какой-либо другой затухание)

    • Умножьте затухающий шар света на функцию шумового фильтра p (тета) - но, может быть, только на точки за заданным радиусом (чтобы иметь этот белый шар посередине)

  2. Затем разогнать все с радиально растущим размыванием окна

  3. Возможно добавить белый шум зерно во всем.

Я думаю, что это всего лишь один из способов их создания; могут быть и другие, но это может быть хорошим началом.

+0

Интенсивность света от точечного источника падает точно так же, как '1/r^2'. И экспоненциальный распад _faster_, чем обратный квадрат, а линейный - _lowlow_ - странно видеть, что вы предлагаете «или _exponential_ или _linear_» распад. – lapk

+0

Я думаю, что белый «шар» в середине вызван именно потому, что функция размытия не распадается с R. Посмотрите на последний пример с надписью «Glint»; ядро посередине имеет неправильную форму, которая соответствует доминирующим лучам. – MSalters

+0

@PetrBudnik Интенсивность света физически падает как 1/r^2; однако это не должно быть жестко соблюдено, если эстетическое качество (которое является приоритетом) требует иного. –

Смежные вопросы