[C++] [Direct3D9] Sonnensystem darstellen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Goderion
Beiträge: 82
Registriert: 16.09.2012, 12:02

[C++] [Direct3D9] Sonnensystem darstellen

Beitrag von Goderion »

Hallo.

Ich möchte das/unser Sonnensystem maßstabsgetreu dreidimensional darstellen.
1. Aufgrund eines bestehenden Projektes soll/muss das alles in C++ mit Direct3D9 programmiert werden.
2. Die Sonne und Planeten sollen maßstabsgetreu sein, also die Größe und Position der Himmelskörper.
3. Auf Texturen wird vorerst verzichtet, es reicht anfangs, wenn die Himmelskörper einfarbig sind (Sonne = Gelb, Erde = Blau, usw.).
4. Animationen, bzw. die Bewegung der Himmelskörper, sind auch vorerst nicht nötig.
5. Wenn möglich soll das Sonnensystem auf den Meter genau abgebildet sein.

Das erste Ziel ist einfach ein dreidimensionales statisches Sonnensystem, das man mit der Kamera frei angucken kann.

Main Plan:
1. Eine Funktion programmieren, die mir aufgrund von Parametern ein Model einer Kugel/Himmelskörpers erstellt.
2. Alle Himmelskörper als Model erstellen und in jedem Frame rendern (Brute Force).

Mögliche Ziele für die Zukunft:
1. Animation, bzw. korrekte Bewegung der Himmelskörper.
2. Texturen für die Himmelskörper.
3. Hintergrund (Sternenhimmel)

Für die aktuellen Ziele habe ich bereits recherchiert und programmiere gerade an den nötigen Funktionen.
Für die zukünftigen Ziele fehlen mir allerdings noch viele Informationen, bzw. Ideen, wie ich das vernünftig umsetzen kann.
1. Ich gehe davon aus, dass das Model eines Himmelskörpers nach der Erstellung konstant bleibt und die Position beim Rendern allein durch eine Matrix verändert wird.
2. Für die Optimierung sollte man die Himmelskörper nicht rendern, die nicht zu sehen sind, da würde mir irgendwas in Richtung Octree einfallen.
3. Beim Hintergrund bin ich komplett ahnungslos, vermutlich so ähnlich wie man bei Outdoor-Leveln den Horizont/Himmel rendert.

Sollte man vielleicht auch die Himmelskörper irgendwie weiter unterteilen. Wenn ich z.B. nah an die Sonne "fliege" und nur noch einen kleinen Ausschnitt von ihr sehen,
macht es ja eigentlich wenig Sinn, die gesamte Sonne zu rendern.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von xq »

Zum Thema "Himmel" rendern: guck dir Krishtys Signatur an, das wichtigste hierbei ist eigentlich, dass du die Sterndaten und die Cube Map renderst

Wie nah soll man denn an die Planeten rangehen können? Das entscheided stark darüber, wie viel Aufwand und Rechenleistung das Projekt benötigt. Wenn du die Kugeln nur so groß rendern willst, dass du halt den Planet im "Fullscreen" bequem angucken kannst, musst du eigentlich nur Kugeln in den passenden Größen rendern
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Goderion
Beiträge: 82
Registriert: 16.09.2012, 12:02

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von Goderion »

MasterQ32 hat geschrieben:Zum Thema "Himmel" rendern: guck dir Krishtys Signatur an, das wichtigste hierbei ist eigentlich, dass du die Sterndaten und die Cube Map renderst
Sieht interessant aus, werde ich mal genauer angucken.
MasterQ32 hat geschrieben:Wie nah soll man denn an die Planeten rangehen können? Das entscheided stark darüber, wie viel Aufwand und Rechenleistung das Projekt benötigt. Wenn du die Kugeln nur so groß rendern willst, dass du halt den Planet im "Fullscreen" bequem angucken kannst, musst du eigentlich nur Kugeln in den passenden Größen rendern
Man soll sich im Sonnensystem komplett frei bewegen können (Kamera kann auch durch Himmelskörper "durchfliegen").
Ich hab noch keine Ahnung, wie viele Polygone ein Himmelskörper wie z.B. die Erde benötigt. Damit das Ganze auf den Meter genau dargestellt werden kann, werden das sicher viele sein.
Für die Performance wäre es dann sicher sinnvoll, von den Himmelskörpern mehrere Modelle zu haben, von der Logik her wie bei Texturen das MipMapping.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von xq »

Metergenauigkeit halte ich für ne schlechte Idee, just sayin. Der Level of Detail ist nicht handlebar ;)

Guck dir mal Kram über "Planet Rendering" für DirectX an, da gibts Kram im Web zu Hauf.

Was soll das ganze denn am Ende werden? Selbstzweck (also zum Lernen von DirectX), als Lernanwendung?
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von Schrompf »

Spannendes Unterfangen, aber die Skalen, auf denen Du Dich da bewegst, sind einfach massiv. Du brauchst auf jeden Fall double oder partitionierte Koordinatensysteme, wenn Du in der Nähe eines Himmelskörpers besser als ein paar Kilometer Genauigkeit haben willst. Als Beispiel sei hier die Outerra-Engine genannt - von denen gibt's auch einige Paper.

Oder Du bleibst in den Skalenbereichen eines - sagen wir - RTS, also eines Realtime Strategy Games. Das ist entspannte, da sind die Kugeln auf dem Bildschirm nie sonderlich nah, da kann man nen schlichten Szenengraphen aufmachen und klassisch rendern.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Goderion
Beiträge: 82
Registriert: 16.09.2012, 12:02

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von Goderion »

Vielen Dank für die Antworten!
MasterQ32 hat geschrieben:Metergenauigkeit halte ich für ne schlechte Idee, just sayin. Der Level of Detail ist nicht handlebar ;)
Merke es auch gerade beim Experimentieren.
Selbst wenn ich die Erde mit 1.310.720 Dreiecken erstelle, reicht es nicht.
MasterQ32 hat geschrieben:Guck dir mal Kram über "Planet Rendering" für DirectX an, da gibts Kram im Web zu Hauf.
Danke für den Hinweis, aber das wird dann vermutlich zu aufwändig.
MasterQ32 hat geschrieben:Was soll das ganze denn am Ende werden? Selbstzweck (also zum Lernen von DirectX), als Lernanwendung?
Eigentlich soll das nur ein kleines Experiment werden. Ich interessiere mich etwas für das Universum und gucke gerne Dokumentationen darüber.
Ich wollte mal aus Spaß schnell das Sonnensystem nachbauen und darin "rumfliegen", um ein bessere Gefühl für die Größen und Abstände der Planeten zu bekommen.
Das "Direct3D9-Training" ist ein schöner Bonus.
Die Genauigkeit auf einen Meter wollte ich aus anderen Gründen haben. Vor einigen Tagen bin ich auf Youtube über "Flacherdler" gestolpert und deren absurden Theorien.
Mit dem Modell wollte ich experimentell einige Behauptungen nachprüfen, z.B. warum man in einer Höhe von 30km keine Erdkrümmung sieht und ob ein Objekt in 5km Entfernung aufgrund der Krümmung 2 Meter tiefer liegt, usw.. Klar, kann man alles berechnen, ich wollte aber was Visuelles.
Guckt euch die Flacherdler auf Youtube bloß nicht an, komplette Zeitverschwendung! Langsam glaube ich, dass 99% von denen das nur zum Trollen machen.
Schrompf hat geschrieben:Spannendes Unterfangen, aber die Skalen, auf denen Du Dich da bewegst, sind einfach massiv. Du brauchst auf jeden Fall double oder partitionierte Koordinatensysteme, wenn Du in der Nähe eines Himmelskörpers besser als ein paar Kilometer Genauigkeit haben willst. Als Beispiel sei hier die Outerra-Engine genannt - von denen gibt's auch einige Paper.
Das riecht nach viel Arbeit. Outerra ist ja ein interessantes Projekt.
Schrompf hat geschrieben:Oder Du bleibst in den Skalenbereichen eines - sagen wir - RTS, also eines Realtime Strategy Games. Das ist entspannte, da sind die Kugeln auf dem Bildschirm nie sonderlich nah, da kann man nen schlichten Szenengraphen aufmachen und klassisch rendern.
Da das wie gesagt eigentlich nur ein kleines Experiment sein soll, werde ich, um schnell ans Ziel zu kommen, alle Planeten mit max 100.000 Dreiecken erstellen und Alles unoptimiert rendern.

Sollte ich das Experiment weiter fortführen, werde ich auf die Hinweise und Tips zurückkommen.
Dateianhänge
Kugel/Icosphere aus 1.310.720 Dreiecken
Kugel/Icosphere aus 1.310.720 Dreiecken
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von xq »

Mit dem Modell wollte ich experimentell einige Behauptungen nachprüfen, z.B. warum man in einer Höhe von 30km keine Erdkrümmung sieht und ob ein Objekt in 5km Entfernung aufgrund der Krümmung 2 Meter tiefer liegt, usw.. Klar, kann man alles berechnen, ich wollte aber was Visuelles.
Dafür würde ich dir eher einen Raytracer empfehlen. Der kann nämlich Kugeln beliebiger Größe mit "perfekter" Präzision darstellen. So ein Projekt wäre durchaus gut umsetzbar, was Echtzeitraytracing in einem Pixelshader angeht, da du ja nur 10 Kugeln rendern möchtest :P

Aber viel Erfolg mit deinem Projekt!
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Alexander Kornrumpf
Moderator
Beiträge: 2106
Registriert: 25.02.2009, 13:37

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von Alexander Kornrumpf »

Goderion hat geschrieben: Ich wollte mal aus Spaß schnell das Sonnensystem nachbauen und darin "rumfliegen", um ein bessere Gefühl für die Größen und Abstände der Planeten zu bekommen.
Dafür ist nicht unbedingt eine hohe Auflösung nötig, siehe:

http://joshworth.com/dev/pixelspace/pix ... ystem.html

Kann gut sein, dass ich den Link ursprünglich aus diesem Forum hatte.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2353
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [C++] [Direct3D9] Sonnensystem darstellen

Beitrag von Jonathan »

[edit] Gerade gesehen, wie alt das Thema schon ist... Ich habe einfach nur die erste Seite von "Grafikprogrammierung" angeschaut, sieht so aus als sei im Zfx nicht mehr viel los.... [/edit]


Genau den Link wollte ich auch gerade posten...

Ein maßstabsgetreues Sonnensystem ist einfach ziemlich langweilig. Unser Sonnensystem ist selbst in sehr guten Näherungen komplett leer (nur in extrem guten sieht man die winzigen Planeten) und so ziemlich alles was du jemals sehen wirst, ist eine kleine Sonne und winzige, punktförmige Planeten. Man will auch nicht in der Egoperspektive durch das Sonnensytem fliegen, weil man entweder viel zu lange unterwegs ist, oder an sämtlichen Planeten vorbeirauscht.

Selbst die größten Objekte am Himmel, also Sonne und Mond werden in der Kunst regelmäßig viel viel zu groß dargestellt. Es gibt sogar eine Gleichnamige Illusion, die Mondtäuschung.

Die Frage ist also letztendlich, was genau willst du am Ende haben? Klar kannst du es so wie geplant simulieren, aber das ist einfach extrem langweilig und ein "man sieht nur schwarz bis auf einen einzelnen Pixel, und selbst der ist nicht maßstabsgetreu, weil die Auflösung zu grob war" kriegst du halt auch ohne viel Code hin. Ich finde diese 2D Webseite von Alex diesbezüglich schon sehr anschaulich (die, und das sollte man sich klar machen, nur die minimalen Entfernungen angibt. In Wirklichkeit sind die Planeten ja irgendwo auf ihren Kreisbahnen, können also auch auf der anderen Seite der Sonne sein und dann sind die Entfernungen noch viel größer...)
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Antworten