Я еще не нашел вопрос по этим вопросам, поправьте меня, если я ошибаюсь.
Деревья (и фауна в целом) распространены в играх. Из-за их характера, они являются хорошим кандидатом на процедурное поколение.
Конечно, есть SpeedTree , если вы можете себе это позволить; насколько я могу судить, это не дает возможности генерировать ваши древовидные сетки во время выполнения. Тогда есть SnappyTree , генератор дерева на основе webgl, основанный на proctree.js, который составляет около 500 строк javascript.
Можно использовать любой из вышеперечисленных (или какой-то другой генератор деревьев, на который я не наткнулся), чтобы заранее создать несколько десятков сеток деревьев - или смоделировать их с нуля в 3d моделировщике - и затем случайно отразить / масштабировать их для нескольких других вариантов. ..
Но я бы предпочел иметь бесплатный, связываемый генератор сеток деревьев.
Возможные решения:
- Перенесите proctree.js на c ++ и работайте с лицензией с открытым исходным кодом (похоже, gpl, поэтому может быть выполнимо; автор также может захотеть сотрудничать, чтобы сделать лицензию еще более бесплатной).
- Ролл мой на основе L-систем.
- Не беспокойтесь, просто используйте созданные в автономном режиме деревья.
- Используйте другой метод, который я еще не нашел.
Обновление 2015 : закончилось портирование proctree.js на c ++ https://github.com/jarikomppa/proctree
источник
Ответы:
Я проделал немалую работу в этой области, хотя большинство моих демонстраций старше:
(flash 2010)
http://genesisbbs.com/appstem.html (щелкните и перетащите мышь)
http://genesisbbs.com/appstem2.html
(directX 2006)
http://vimeo.com/5206795
Я настоятельно рекомендую вам сделать это самостоятельно, если вы делаете это ради развлечения. Вам почти наверняка нужно будет работать с кватернионами . Понимать их очень сложно, но вам не нужно слишком углубляться, чтобы их использовать. Представьте кватернион как вектор с дополнительным компонентом: вращением. Если вы хотите, чтобы ваши растения крутились и поворачивались по мере роста, им понадобятся кватернионы.
Другие вещи для изучения:
фигуры Лихтенберга
Лапласовы диаграммы роста
Вороного
Алгоритмы ближайшего соседа (Google google)
Я (лично) не рекомендовал бы использовать L-системы, кроме как, возможно, диктовать грамматику того, где и где растет, т.е. [семя -> [корень] / [ствол-> ветвь -> [цветок / лист]]. L-системы не годятся для реагирования на такие внешние воздействия, как направление солнечного света, гравитация, препятствия и т. Д.
Что касается скорости, одно дерево может быть сгенерировано в реальном времени. Однако в целях памяти и производительности вы, вероятно, захотите сгенерировать только небольшой набор деревьев и немного их скопировать, если вы имеете дело с лесами.
Большинство существующих генераторов деревьев не так уж велики (ИМХО), кроме мощных генераторов, используемых для Maya и подобных.
Я также очень, очень рекомендую использовать воксели для создания дерева (затем при необходимости скину с сеткой). Преимущество вокселей в том, что вы можете легко моделировать алгоритмы роста, используя такие вещи, как рост Лапласа и различные автоматы (не игра жизни Конвея, но другие правила дают интересные результаты).
источник
Лично я, вероятно, начал бы с предварительно сгенерированных деревьев, и только после того, как у меня появился бы потрясающий механизм рендеринга леса - в комплекте с кустами, травой, грибами и прочим - я бы начал искать, если мне нужно больше переменных деревьев.
При этом, вы можете взглянуть на ngPlant . Он включает в себя приложение для моделирования процедурных деревьев GPL, но библиотеки, выполняющие всю тяжелую работу, лицензированы BSD. Это написано на C ++.
Для рендеринга леса существует (лицензированный MIT) Paged Geometry для движка рендеринга Ogre .
источник
Основная проблема с процедурными деревьями заключается не в их генерации, а в рендеринге каждого кадра во время выполнения. По этой причине вы увидите много одинаковых деревьев в играх ААА. Дело не в том, что они не могут реализовать или написать технологию, которая создала уникальные деревья, а в том, что вам придется отключить множество других функций для игры. бежать.
Если у вас много одинаковых деревьев, вы можете вращать их и, возможно, масштабировать их равномерно, чтобы они выглядели по-разному под любым углом, а поскольку они идентичны, вы можете создавать их экземпляры, чтобы сэкономить драгоценные миллисекунды в каждом кадре.
Если вы подумаете об этой проблеме на секунду, то можете найти счастливую среду - как насчет того, чтобы сгенерировать несколько разных частей дерева, стволов, ветвей, листьев и т. Д., Но все они объединяются по модульному принципу, как дерево lego. Тогда у вас может быть много комбинаций и, следовательно, несколько совершенно уникальных деревьев, но вы также можете скопировать все эти части для более быстрой игры.
источник
Я наткнулся на дерево [d] некоторое время назад ... Я использовал его только для небольшого количества времени, чтобы протестировать проект, но это было только потому, что я остановил разработку - этот инструмент предоставляет вам широкий спектр вариантов генератора, с которыми можно поиграть и Насколько я помню, довольно быстро. Ссылка ниже.
Недостатком является то, что это не генератор деревьев, который вы можете включить. Вам нужно предварительно сгенерировать несколько деревьев, а затем изменить данные при их размещении во время выполнения, чтобы настроить их уникальность.
источник
Это изящное небольшое решение, и я использовал его в проекте и могу сказать, что он достаточно быстр, чтобы генерировать деревья на лету, почему игра запускается. Это, конечно, не подробно, но если вы избавитесь от рекламных щитов, это может быть довольно аккуратно.
http://ltrees.codeplex.com/
источник