Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.06.2014, 15:22

Planetenerstellung mittels Voxeltechnik - Vorgehensweise?

Hallo zusammen!

Ich versuche derzeit einen Planeten zu generieren, mit Landschaft und allem drum und dran, und zwar mittels eines Voxelgitters.
Als Programmiersprache nutze ich C# und als Gameengine Unity. Im Folgendem möchte ich meine Vorgehensweise vorstellen und würde mich über ein Feedback eurerseits freuen:

Als erstes erstelle ich mir einen riesiges, würfelförmiges Voxelgitter, beginnend bei (0,0,0) aufsteigend, bestehend aus kleinen Würfeln. Dieser ist unterteilt in Chunks mit der Größe 16x16x16. Während der Generierung prüfe ich, welche Kleinstwürfel innerhalb einer gedachten Kugel liegen (x²+y²+z² <= r²), diese werden "aktiv" gesetzt, alle anderen auf "inaktiv". Soweit kein Problem, nun habe ich eine schöne Minecraft-artige Kugel.

Nun die Probleme: ich versuche eine Landschaft auf die Oberfläche der Kugel zu bekommen, in dem ich verschiedene Kleinstwürfel aktiv oder inaktiv setze. Einen richtigen Ansatz wie das ganze von Statten gehen soll habe ich noch nicht. Perlin Noise ist denke ich der richtige Weg, nur weiß ich nicht genau wie ich diesen hier einsetzen soll... U.a. wäre es natürlich auch toll wenn man(n) Höhlen und Überhänge mit generieren könnte!

Das alles dient nur zur einmaligen Generierung einer Spielwelt, welche dann gespeichert werden soll.
Im Spiel sollen später nur die Chunks geladen werden in welcher sich der Spieler befindet (u.a. mittels Marching Cubes eine weichere Landschaft daraus zaubern)

Hat jemand einen Tipp wie ich das Problem am besten anpacke? :dash:

Mein Wissen zu Perlin Noise: soweit ich weiß übergibt man diesem Algorithmus Parameter (in diesem Fall x,y,z-Koordinaten) und bekommt dafür einen Zufallswert -1 bis 1. Bitte korrigiert mich wenn ich falsch liege! :)


MfG praetorianer777

2

14.06.2014, 09:47

noch keiner ne Idee? :(

3

14.06.2014, 11:21

Du kannst natürlich verschiedene Verfahren verwenden, was mir hier spontan einfallen würde (und du auch schon erwähnt hast glaube ich):

1. Eine mittels Perlin Noise erstellte Heightmap verwenden. Hierfür bekommst du für jede x-y Position einen z-Wert, dieser kann dann gewichtet auf den aktuellen z-Wert auf der Kugelposition hinzuaddiert oder subtrahiert werden.

1.5. Du könntest auch mehrere verschiedene Kartenabschnitte" verwenden, da es jedoch recht schwer werden sollte 2D Karten auf eine Kugel zu projizieren könnte man sich die Eigenschaften eines z.B. Icosaeders zu nutzen machen und jeder Seite eine eigene Karte zuweisen.

2. Wenn du das ganze am Ende sowieso abspeicherst, dann kannst du dir auch ein minimales Modellingtool schreiben, oder dir einmal z.B. Voxatron anschauen.


Hoffe das war etwas hilfreich.

Mit dem oberen Abschnitt wären so jedoch Höhlen und Überhänge nicht realisierbar, außer du würdest das Modellingtool verwenden.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

14.06.2014, 14:07

Ein kartesisches Koordinatensystem ist dafür nicht besonders gut geeignet. An manchen Stellen an der Oberfläche wären alle Blöcke schief und es wäre unmöglich ein Gebäude zu bauen. Ein Kugelkoordinatensystem wäre zwar besser, sorgt aber für neue Probleme wenn man zu tief unter die Oberfläche gräbt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

14.06.2014, 19:38

Ich denke deine Probleme sind erst mal grundlegender. Nacho hat schon einen sehr sehr wichtigen Punkt angesprochen. Was das nächste angeht, noise Funktionen gibt es viele. Ein Beispiel wäre Perlin-Noise, Mittlerweile wurde der Algorithmus angepasst und ist unter dem Namen Simplex-Noise bekannt. Ich würde vorschlagen das ganze erst mal einfach anzugehen. Guck dir verschiedene Noisealgorithmen an und versuche einfach mal ein paar davon zu implementieren. Für den Anfang reicht es ja wenn du dir von dem Algorithmus eine Graustufentextur erstellen lässt. Dann kannst du in etwa sehen was für grundlegende Strukturen dein gewählter Noisealgorithmus generieren kann. Kombination von verschiedenen Algorithmen, aber vor allem verschiedenen Auflösungen im Algorithmus sind natürlich möglich und auch sinnvoll. Wenn das ganze funktioniert kannst du ja mal überlegen welche Möglichkeiten es gibt diese Daten für einen großen Block von Würfeln zu verwenden. Geh dabei erst mal weg von deiner Kugel und betrachte einfach nur einen Großen Würfel aus kleineren Würfeln. Das ist erst mal einfacher. Dadurch solltest du erst mal ein wenig Gefühl für das ganze kriegen. Es ist sinnvoll zu wissen warum du tust was du tust und warum das was du tust genau das macht was du am Ende eigentlich möchtest. Einfach erst mal zum testen kleineren Probleme angehen und dann hocharbeiten.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige