ich habe das alte Sonnensystem wegen Schule eine wenig liegen lassen aber gerade wieder geöffnet um es fertig zu bekommen. Es fehlen bei den Gasplaneten die Ringe. Wie könnte man die darstellen ? Die Planeten sind nicht mit Polygonen sondern zur Vereinfachung als Kugeln dargestellt (gluSphere).
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Ich würde mir eine Textur nehmen, die solche Ringe darstellt und das als Ebene entsprechend um den Planeten legen.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Nils hat geschrieben:
Die Planeten sind nicht mit Polygonen sondern zur Vereinfachung als Kugeln dargestellt (gluSphere).
Das klingt ein bisschen seltsam, da gluSphere ja keine Kugeln, sondern auch nur Dreiecke erzeugt.
Vielleicht interessieren dich, wenn du glu nimmst, die Funktionen gluDisk oder gluCylinder.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also für mich klingt das nach dem klassischen Anwendungsfall von 1D Texturen. Das ist nichts anderes als eine 2D Textur allerdings nur mit einer Höhe von 1 was eigentlich dann nichts anderes ist als ein Farbverlauf. Du musst dann "nur" noch diese Textur auf einem Ring anbringst, der um den Planeten liegt. Und zwar so, dass der Verlauf von Innen nach Außen (oder andersrum) dargestellt wird. Das sollte aber mit Sinus und Cosinus ein recht leichtes sein die Punkte zu berechnen, da es ja nur eine Ebene ist.
Der Weg über die 2D Textur und der einfachen Fläche würde auch gehen. Aber da solche Texturen eigentlich nur als Verlauf angeboten werden müsstest du sie mit einem Grafikprogramm selber als Ring darstellen. Je nachdem wie stark man dort hinein zoomen können soll könnte so eine 2D Textur ziemlich groß werden. Oder Kantig beim hineinzoomen. Wohin gegen man bei 1D Textur lediglich die Anzahl der Flächen erhöhen muss um wieder einen ringartigen Ring zu bekommen.
Die Planeten sind nicht mit Polygonen sondern zur Vereinfachung als Kugeln dargestellt (gluSphere).
Das klingt ein bisschen seltsam, da gluSphere ja keine Kugeln, sondern auch nur Dreiecke erzeugt. Vielleicht interessieren dich, wenn du glu nimmst, die Funktionen gluDisk oder gluCylinder.
MfG
Kann man denn in mit gluCylinder die Planeten mit Exzentrität oder wie das heißt darstellen ? Dann würde mich das nämlich mal interessieren.
Lossy eX hat geschrieben:
Also für mich klingt das nach dem klassischen Anwendungsfall von 1D Texturen. Das ist nichts anderes als eine 2D Textur allerdings nur mit einer Höhe von 1 was eigentlich dann nichts anderes ist als ein Farbverlauf. Du musst dann "nur" noch diese Textur auf einem Ring anbringst, der um den Planeten liegt. Und zwar so, dass der Verlauf von Innen nach Außen (oder andersrum) dargestellt wird. Das sollte aber mit Sinus und Cosinus ein recht leichtes sein die Punkte zu berechnen, da es ja nur eine Ebene ist.
Der Weg über die 2D Textur und der einfachen Fläche würde auch gehen. Aber da solche Texturen eigentlich nur als Verlauf angeboten werden müsstest du sie mit einem Grafikprogramm selber als Ring darstellen. Je nachdem wie stark man dort hinein zoomen können soll könnte so eine 2D Textur ziemlich groß werden. Oder Kantig beim hineinzoomen. Wohin gegen man bei 1D Textur lediglich die Anzahl der Flächen erhöhen muss um wieder einen ringartigen Ring zu bekommen.
Thx, dann schau ich mir das mal an. Kann man auch Transparenz setzen ? Denn Uranus hat nicht so sichtbare Ringe wie Saturn z.B.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7804 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Man kann in einer Textur natürlich Alpha-Werte einbauen. Man muss die Textur dann halt als z.B. TGA speichern (also in einem Format welches Transparenz unterstützt.) Alternativ kann man auch erst die Planeten zeichnen und dann die Ringe drüber blenden (siehe Blending)
Wenn Exzentrität bedeudet gestaucht/gestreckt in einer Achse: Ja klar. Einfach vor dem zeichnen der Kugel mit glScale z.B. die Pol-Achse verkleinern. (Und nach dem zeichnen wieder zurücksetzen.)
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Na, gluSphere selber nicht, aber du kannst natürlich vor dem Zeichnen wie von Flash erwähnt glScale aufrufen und damit die Polachse verlängern oder stauchen.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
tut mir echt leid dass ich dieses Thema nochmal rauskrame, aber ich habe einfach nochmal eine Frage. Wenn man für den Ring eine gluDisk nimmt und auf diese eine Textur legt, dann sieht das gut aus. Aber leider (gerade beim Saturn sehr schade) reicht nun mein Licht nicht aus, gluDisk ist quasi nicht hoch genug um Licht abzubekommen denke ich. Gerade beim Saturn werfen die Ringe Schatten auf den Saturn, der Saturn Schatten auf die Ringe umgekehrt (andere Planetenseite), wäre wirklich sehr schade. Wie könnte man das am einfachsten lösen ? Könnte ich irgendwie OpenGL mitteilen, dass mir auf die gluDisk das Licht projiziert werden sollen oder gibt es eine ganz andere Lösung ?
Schatten gehört zu den komplizierteren Effekten. Da du schon mit dem eigentlich einfachen Glow-Effekt recht große Probleme hattest weiß ich nicht ob Schatten nicht eine Nummer zu groß sind, zumindest wenn das ganze gut aussehen soll. Letztlich musst du das selbst wissen.
Ansätze:
Shadow-Maps
Stencil-Shadows (auch Volumenschatten)
ein Spezial-Shader der nur mit Kugeln als Lichtquelle bzw. Schattenwerfer funktioniert
Variante 1 funktioniert universell mit jeder Szene und wird in den meisten Spielen benutzt. Vom Prinzip wird die Szene aus Sicht der Lichtquelle in einen Tiefenbuffer gerendert. Dadurch kann man dann später beim Rendern feststellen wo Schatten ist und wo nicht. Das funktioniert insbesondere bei Spot-Lights gut, da ein Spotlight so ähnlich wie eine Kamera geformt ist. Bei einem Punktlicht musst du aber mindestens 6 mal eine Shadow-Map generieren. Mit transparenten Objekten wird das noch komplizierter, aber sofern dir ein Alpha-Test (nur ja/nein, kein Alpha-Wert) reicht, funktioniert dies auch mit dem Standard-Ansatz. Zudem gibt es Probleme mit Artefakten, wenn man genau in die Lichtquelle blickt. Möglicherweise könnte man aber jeden Planeten einzeln berechnen, und zwar nur dann wenn es auch wirklich Schatten gibt.
Variante 2 funktioniert nur mit fester Geometrie. Das Volumen des Schattens wird als Geometrie nach gebaut und mit dem Stencilbuffer wird geprüft ob sich der gerade gerenderte Punkt innerhalb oder außerhalb befindet. Für deine Ringe wird das zum Problem...den diese sind keine feste Geometrie. Schatten werden immer harte Schatten sein, also nur Schatten ja/nein.
Variante 3 ist speziell für deine Szene zugeschnitten. Da Kugeln relativ einfache Objekte sind kann man den Schatten auch direkt im Shader berechnen. Den das Schattenvolumen kann man durch Kegelstümpfe beschreiben. Ein Kegelstumpf besteht aus einer Spitze, einer Richtung und einem Radius. Die Spitze ist die Lichtquelle, die Richtung ist Planet-Lichtquelle und der Radius, der Radius des Planeten. Der Shader bekommt eine Liste dieser Kegelstümpfe und testet für jeden Pixel ob er sich in einem der Kegelstümpfe befindet. Deine Ringe können so leider nur Schatten empfangen und nicht werfen, da die Ringe eine viel kompliziertere Struktur haben. Man kann die Lichtquelle auch als Kugel (nicht nur Punkt) annehmen und weiche Schatten berechnen. Dafür braucht man dann immer jeweils zwei Kegel. Das wäre bei den anderen beidem Methoden extrem aufwendig! Ich werde das wahrscheinlich in UC so implementieren, weiß aber noch nicht wie schnell das sein wird.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo Nils,
falls die Beleuchtung deiner gluDisk nicht richtig funktioniert, könnte es daran liegen dass du eine flache Scheibe benutzt, die nur auf einer Seite Normalen besitzt. Du musst entweder zwei entgegengesetzt ausgerichtete Scheiben nehmen oder du aktivierst zweiseitige Beleuchtung mittels :
Code:
glLightModel(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE)
Viele Grüße dj3hut1
_________________ Wenn Gauß heute lebte, wäre er ein Hacker. Peter Sarnak, Professor an der Princeton University
dj3hut1: Hm, leider ist die Scheibe immer noch lichtlos. Ich glaube ich hatte den Befehl auch vor einiger Zeit schon mal probiert. Müssen vielleicht noch gewisse Gegenheiten erfüllt sein ?
Coolcat: Variante 1: Die grundlegende Frage ist erstmal, welche Schatten man benötigt. Ist es ohne weiteres möglich eine Sonnenfinsternis zum Beispiel darzustellen ? Oder würde das nicht sowieso untergehen ? Denn wäre letzteres der Fall, bräuchte man dort keine Schatten zu berechnen. Das gilt natürlich auch für andere Monde von anderen Planeten. Spürbar würde es erst bei größeren Monden wie dem Titan (Saturn) oder eventuell unserem denke ich. Davon hängt jedenfalls ab wo überhaupt Schatten berechnet werden müssen. Aber das wäre eigentlich mehr eine Kleinigkeit, ließe sich denke ich mit geringem Aufwand umbauen. Variante 2: Könnte man die harten Schatten nicht sogar schon durch den bereits bestehenden Glow-Effekt beheben, wenn man diesen nach der Schattenberechnung erzeugt ? Ist nur eine Idee, keine Ahnung ob das realistisch ist. Variante 3: Eine wirklich gute Idee, aber ich weiß nicht so recht ob das nicht zu langsam und auch zu schwierig würde. Wäre das Ergebnis denn so viel besser als bei den anderen beiden Möglichkeiten ? Oder besser gefragt: Wären die Schatten der beiden anderen Varianten schlecht oder könnten auch dort sanfte entstehen ?
zu 1: ShadowMaps arbeiten immer auf der kompletten Szene. Entweder werden alle Schatten berechnet oder nicht. Eine Sonnenfinsternis ist neben dem Schatten auf Ringen der einzige Grund überhaupt globale Schatten zu berechnen, oder? zu 2: Der Glow-Effekt wirkt auf Lichtquellen, nicht auf beleuchtete Objekte. Zu einem gewissen Grad würde es funktionieren, trotzdem wird die Lichtquelle immer nur ein Punkt bleiben und keine Kugel. Bei Variante 1 ist es leichter weiche Schatten zu erzeugen, z.B. mittels Percentage-Closer Filtering (PCF). zu 3: Schau dir mal die Bilder 11-6 bis 11-9 im PCF-Artikel an, das ist das Maximum was sich bei akzeptabler Performance mit ShadowMaps erreichen lässt. Bei Variante 1 lassen sich schönere Schatten nur durch mehrere kugelförmig nebeneinander liegende Lichtquellen erreichen, was den sowieso schon 6-fachen Aufwand (wegen Punktlichtquelle) noch einmal vervielfacht. Bei Variante 2 wäre der Schatten sehr scharf und hätte keine Pixel-Artefakte wie in 11-6 zu sehen. Von der Implementierung her ist Variante 3 definitiv die einfachste. Wenn vorher (!) für jedes Objekt geprüft wird welche Objekte Schatten wirklichen einen Schatten auf dieses Objekt werfen sollte die Performance auch bei mehreren Lichtquellen (zwei Sonnen oder so) kein Problem sein.
Gut, mittlerweile glaube ich Dir, dass die dritte Variante am einfachsten zu implementieren ist, habe mich nun schon etwas in Variante 1 eingelesen. Mein Hauptproblem ist eben wieder mal die Umsetzung, was Du vor hast mit Deiner eigenen Methode habe ich ja verstanden. Aber die Umsetzung fällt mir wieder nicht gerade leicht. Außerdem: Könnte man das Problem bei der Methode, dass nur Schatten empfangen werden können, nicht umgehen über einen Alphakanalcheck oder so etwas in der Art ? Oder würde das alles schon wieder viel zu langsam machen ?
Mitglieder in diesem Forum: 0 Mitglieder und 131 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.