Комментарии 23
Спасибо большое за статью.
Первый раз вижу код на флеше, кстати. Интересненько.
Первый раз вижу код на флеше, кстати. Интересненько.
Началось всё с того, что на форуме Kongregate.com, где я в то время активно тусил, один из участников предложил посостязаться в процедурной генерации чего-либо, первой темой стал «Лес».
В итоге Вы выиграли состязание? :)
Нет, но где-то третье место занял. Может, четвертое. Победитель сгенерировал лес из 4 двухмерных слоев с красивыми шапками, который не требовал слишком больших затрат на рендер и как следствие был пригоден к чему-либо ещё, кроме как покрасоваться.
2д? Тема была просто "лес"? Не 3д? (даже без физики) P.S. Помнится, у НВидии была интересная интерактивная демка процедурной генерации дерева.
А почему не на фракталах?
Я не знаю такого фрактала, который способен породить дерево.
Да, потом вспомнил. В их сторону и не смотрел, потому что они детерминированы, а мне нужно было, чтобы результат был случайным, но «похожим на дерево». Спасибо все равно.
L-системы не обязательно должны быть детерминированы, вся суть сводится к рекурсивной замене отдельных символов в строке (палочек веток) на подстроки (ветви). Что на что заменять описывается правилами, которые могут быть какими угодно, например заменить одну палку на три случайной длины под случайными углами, либо выбрать случайную ветвь из заранее подобранных комбинаций.
Собственно, коммерческие решения вроде SpeedTree примерно так и делают.
Собственно, коммерческие решения вроде SpeedTree примерно так и делают.
Фракталы "родились" из необходимости сгенерировать изображения ландшафтов максимально похожих на настоящие.
Жаль что умирая flash с собой и actionscript 3 прихватил…
Есть же TypeScript
Можно попробовать сконвертировать в html5 с помощью этой тулзы Guepard Flash to HTML5 converter
Я пришел к выводу, что нужно как-то уменьшать плотность веток.
Кстати, Леонардо да Винчи в свое время вывел эмпирическое правило:
Толщина всех веток дерева на любой его высоте, сложенная вместе, дает толщину ствола
В наше время ближе всех к доказательству этого правила приблизился физик Эллой:
Для обоснования своей версии ученый создал математическую модель, которая связывает площадь листвы дерева с действующей на излом силой ветра. Дерево в ней описывалось, как закрепленное лишь в одной точке (месте условного ухода ствола под землю), и представляющее собой ветвящуюся фрактальную структуру (т.е. такую, в которой каждый меньший элемент представляет собой более или менее точную копию старшего).
Добавив к этой модели давление ветра, Эллой ввел определенный постоянный показатель его предельной величины, после которой ветви начинают ломаться. Исходя из этого, он произвел расчеты, которые показали бы оптимальную толщину разветвляющихся веток, такую, при которой сопротивление силе ветра было бы наилучшим. И что же — он пришел ровно к той же зависимости, причем идеальное значение той же величины лежало между 1,8 и 2,3.
Подробнее можно почитать здесь: masterok.livejournal.com/2643089.html
Любопытная тема. Здесь это, очевидно, не соблюдается, хотя из структуры без толщины можно попытаться вывести толщину каждой ветви. Но что-то мне кажется, что в лучшем случае получится баобаб :) Дело в том, что толщина ветки у меня величина переменная и влиявшая только на отображение, а также мне не был известен закон, по которому у дерева растет толщина ветки, помимо толщины ствола, растущей плюс-минус равномерно. Его и реализовал.
Есть некоторая теория, как рисовать деревья и фракталы, придумал биолог Линдемайер
gen.lib.rus.ec/search.php?req=Lindenmayer+Systems&lg_topic=libgen&open=0&view=simple&res=25&phrase=1&column=def
gen.lib.rus.ec/search.php?req=Lindenmayer+Systems&lg_topic=libgen&open=0&view=simple&res=25&phrase=1&column=def
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как вырастить лес на Actionscript3/Flash в несколько* строк кода