Ich habe noch keine Frage in diesen Zeilen gefunden, korrigiere mich, wenn ich falsch liege.
Bäume (und die Fauna im Allgemeinen) sind in Spielen weit verbreitet. Aufgrund ihrer Natur sind sie ein guter Kandidat für die prozedurale Generierung.
Natürlich gibt es SpeedTree , wenn Sie es sich leisten können. Soweit ich das beurteilen kann, bietet es keine Möglichkeit, Ihre Baumgitter zur Laufzeit zu generieren. Dann gibt es noch SnappyTree , einen webgl-basierten Online-Baumgenerator, der auf der proctree.js basiert und ungefähr 500 Zeilen Javascript enthält.
Man könnte einen der oben genannten (oder einen anderen Baumgenerator, auf den ich nicht gestoßen bin) verwenden, um vorher ein paar Dutzend Baummaschen zu erstellen - oder sie in einem 3D-Modellierer von Grund auf neu zu modellieren - und sie dann für ein paar weitere Varianten zufällig spiegeln / skalieren ..
Aber ich hätte lieber einen kostenlosen, verlinkbaren Baumgittergenerator.
Mögliche Lösungen:
- Portieren Sie proctree.js auf c ++ und kümmern Sie sich um die Open-Source-Lizenz (scheint nicht gpl zu sein, könnte also machbar sein; der Autor ist möglicherweise auch bereit, zusammenzuarbeiten, um die Lizenz noch freier zu machen).
- Roll mein eigenes basierend auf L-Systemen.
- Mach dir keine Sorgen, verwende einfach offline generierte Bäume.
- Verwenden Sie eine andere Methode, die ich noch nicht gefunden habe.
Update 2015 : Portierung von proctree.js auf c ++ https://github.com/jarikomppa/proctree beendet
quelle
Antworten:
Ich habe in diesem Bereich einiges an Arbeit geleistet, obwohl die meisten meiner Demos älter sind:
(Flash 2010)
http://genesisbbs.com/appstem.html (Klicken und Ziehen der Maus)
http://genesisbbs.com/appstem2.html
(DirectX 2006)
http://vimeo.com/5206795
Ich ermutige Sie sehr, Ihre eigenen zu würfeln, wenn Sie dies zum Spaß tun. Sie werden mit ziemlicher Sicherheit mit Quaternions arbeiten müssen . Es ist sehr schwer, sie zu verstehen, aber Sie müssen nicht zu tief gehen, um sie zu verwenden. Stellen Sie sich eine Quaternion als einen Vektor mit einer zusätzlichen Komponente vor: Rotation. Wenn Sie möchten, dass sich Ihre Pflanzen während des Wachstums drehen und wenden, benötigen sie Quaternionen.
Andere Dinge zu lernen:
Lichtenberg-Figuren
Laplace-Wachstum
Voronoi-Diagramme
Algorithmen für die nächsten Nachbarn (google sie)
Ich (persönlich) würde von der Verwendung von L-Systemen abraten, außer vielleicht eine Grammatik für das zu diktieren, was wo wächst, dh [Samen -> [Wurzel] / [Stamm-> Zweig -> [Blume / Blatt]. L-Systeme sind nicht geeignet, um auf Umwelteinflüsse wie Sonnenlichtrichtung, Schwerkraft, Hindernisse usw. zu reagieren.
Aus Gründen der Geschwindigkeit kann ein einzelner Baum in Echtzeit generiert werden. Aus Speicher- und Leistungsgründen möchten Sie wahrscheinlich nur eine kleine Gruppe von Bäumen generieren und diese ein wenig instanziieren, wenn Sie sich mit Wäldern befassen.
Die meisten existierenden Baumgeneratoren sind nicht so toll (IMHO), abgesehen von den High-End-Generatoren, die für Maya und andere verwendet werden.
Ich empfehle auch sehr, Voxel zu verwenden, um den Baum zu erzeugen (dann Haut mit einem Netz, wenn nötig). Der Vorteil von Voxeln besteht darin, dass Sie Wachstumsalgorithmen mithilfe von Laplace-Wachstum und verschiedenen Automaten leicht simulieren können (nicht Conways Lebensspiel, aber andere Regeln führen zu interessanten Ergebnissen).
quelle
Persönlich würde ich wahrscheinlich mit vorgenerierten Bäumen anfangen und nur wenn ich eine umwerfende Forest-Rendering-Engine hätte - komplett mit Büschen, Gras, Pilzen und so weiter - würde ich anfangen zu suchen, ob ich mehr variable Baummaschen benötige.
Davon abgesehen können Sie sich ngPlant ansehen . Es enthält eine GPL-App für den prozeduralen Baummodellierer, aber die Bibliotheken, die all das schwere Heben ausführen, sind BSD-lizenziert. Es ist in C ++ geschrieben.
Für das Forest-Rendering gibt es eine (MIT-lizenzierte) Paged Geometry for Ogre- Rendering-Engine.
quelle
Das Hauptproblem bei prozeduralen Bäumen besteht darin, sie nicht zu generieren, sondern zur Laufzeit alle Frames zu rendern. Dies ist der Grund, warum Sie in AAA-Spielen viele identische Bäume sehen werden. Es ist nicht so, dass sie keine Technologie implementieren oder schreiben könnten, die einzigartige Bäume erzeugt laufen.
Wenn Sie viele identische Bäume haben, können Sie sie drehen und möglicherweise gleichmäßig skalieren, damit sie aus jedem Winkel anders aussehen. Da sie identisch sind, können Sie sie instanziieren, um kostbare Millisekunden pro Frame zu sparen.
Wenn Sie nur eine Sekunde über dieses Problem nachdenken, könnte es ein fröhliches Medium geben - wie wäre es, wenn Sie ein paar verschiedene Baumteile, Stämme, Zweige, Blätter usw. erzeugen, die aber alle modular zusammenpassen, wie zum Beispiel Tree Lego. Dann könnten Sie viele Kombinationen und damit einige ziemlich einzigartige Bäume haben, aber Sie könnten auch alle Teile für ein schnelleres Laufspiel einsetzen.
quelle
Ich bin vor einiger Zeit über tree [d] gestolpert ... Ich habe es nur eine kleine Zeit lang verwendet, um ein Projekt zu testen, aber das lag nur daran, dass ich die Entwicklung gestoppt habe - das Tool bietet Ihnen eine große Auswahl an Generatoroptionen zum Spielen mit und Soweit ich mich erinnere, ist es ziemlich schnell. Ein Link ist unten.
Der Nachteil ist, dass es sich nicht um einen Baumgenerator handelt, den Sie einbinden können. Sie müssten einige Bäume vorab generieren und dann die Daten ändern, wenn Sie sie zur Laufzeit platzieren, um ihre Eindeutigkeit zu optimieren.
quelle
Dies ist eine nette kleine Lösung, und ich habe sie in einem Projekt verwendet und kann Ihnen sagen, dass sie schnell genug ist, um Bäume im laufenden Betrieb zu erzeugen, warum das Spiel läuft. Es ist sicherlich nicht detailliert, aber wenn Sie die Werbetafeln loswerden, könnte es ziemlich ordentlich sein.
http://ltrees.codeplex.com/
quelle