Рендер туманности

Рейтинг: 105Ответов: 2Опубликовано: 02.02.2011

Поскольку результаты поисков по вопросу неудовлетворительны, то решил-таки задать вопрос.

Требуется эффективный алгоритм рисования чего-то, похожего на звёздные туманности. Крайне желательно, чтобы рендер мог выполняться в реальном времени и почти настоятельно требуется, чтобы алгоритм был стабильным (выдавал одну и ту же картину при неизменных входных параметрах).

В ходе поисков я обнаружил фрактальный алгоритм Buddhabrot, но он довольно медленный, насколько я могу судить по той реализации, что я увидел (http://cabin.users.geeky.net/classes/buddhabrot.html запустить и подождать около минуты)

UPD: я выставил теги не совсем верно (поправьте, если кто знает, какие тэги здесь более уместны). Не обязательна реализация на яве. Главное - понять идею, а перенести на J2D я уж как-нибудь сумею.

UDP2: без сомнения идея с зарядами дала результаты. Пока они незначительные, но уже кое что.. немного поправить распределение зарядов и цветовую гамму + звёзды + сглаживание шума вместо грубого шума и будет то что надо. На этом основании закрываю вопрос и помечаю ответ как правильный. Возможно также попробую наложить спирали на эту сцену: вместе со звёздами должно получиться неплохо.

скриншот

UPD

Итак, скрещивание спиралей с точечными зарядами удалось.. теперь надо наложить облакообразный шум (в чём мне очень помогла статья Simple Clouds Part 1)

скриншот со спиралью

UPD 21 сентября

И вот очередной апдейт для заинтересованных. Думаю я уже близок к завершению.

скриншот со спиралью, звёздами и центричностью зарядов

Ответы

▲ 39

Простейшим методом реализации разнообразных «случайных» текстур есть метод Кена Перлина, названный в его честь. В этом методе генерируется несколько текстур «октав» и слагая их вместе мы получаем довольно интересную текстуру, вид которой зависят от нескольких параметров. Тут подробнее

Я пробовал, медленно генерирует, и нужно долго подбирать коэффициенты для нормального вида.

Попробуйте другой метод: расположить несколько точек (зарядов), а цвет туманности задать как потенциал или эл.поле от этих зарядов f = k/r или E = k/(r^2) не забывая про суперпозицию.

▲ 23

Насчет функции генерации облака вокруг центра. Если взять приближение (не четкие мат функции). Например, первый rand дает значение от 0 до 1 (дробное).

Разобьем значение 0 - 1 на части:

  • 0 - 0,5 - вероятность 50%, значит расстояние должно быть маленькое, максимум 10 (можно от 0 до 10)
  • 0,5 - 0,7 - вероятность меньше, расстояние максимум 100 (можно от 10 до 100)
  • 0,7 - 0,8 - вероятность еще меньше, расстояние максимум 1000 (можно от 100 до 1000)

Потом применяем найденное максимальное расстояние к рандому нахождения координат: (второй и третий ранд) = (x,y)

Тут можете сами задавать кратность и вероятность 'рисовать' какие угодно функции распределения - я не специалист как они выглядят более естественно. Главное алгоритм - если будете вызывать напрямую функцию генерации точек, то они могут быть медленными, а тут сами рулите.

Кстати насчет функций - вероятно, есть какие-то алгоритмы: задаете текущий srand, задаете центр распределения, вызываете функцию с предопределенными параметрами и она вам генерирует точки, например, по нормальному закону или по экспоненте (какие-то такие функции я видел в математических пакетах, сразу не вспомню)