Registriert: Mo Okt 15, 2007 18:30 Beiträge: 74 Wohnort: Berlin
Hallo,
wie so viele OpenGL Anfänger bastel ich gerade an einem Sonnensystem. Dabei möchte ich gerne das mein Modell möglichst maßstabsgetreu dargestellt wird, d.h. die Planetenradien stehen im richtigen Verhältnis zu den Abständen zur Sonne. Wenn ich mich nun nah am Planeten befinde sieht das gut aus, weit entfernt oder sogar beim Blick auf das gesamte Sonnensystem sind meine Himmelskörper so klein das sie auf dem Bildschirm keinen Pixel mehr zum aufleuchten bringen. Gibt es eine einfache Möglichkeit die Mindestgröße festzulegen, so dass ab einem Bestimmten Abstand die Planeten immer noch als Farbtupfer zu sehen sind? Muss ich dazu vielleicht im Framebuffer nachschauen wie groß mein Objekt auf dem Bildschirm dargestellt wird, um evtl. korrekturen machen zu können?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hm, da dein Sonnensystem ja maßstabsgetreu sein soll, würde ich von so einer Lösung eher absehen. Was du aber statt dessen machen könntest wäre, eine Beschriftung für die Planeten anzeigen, die sich immer dadrüber, dadrunter oder daneben aufhält und auch immer eine gewissen Mindestgröße hat.
Wie genau man sowas realisiert will mir gerade aber nicht einfallen, das überlasse ich meinen nachrednern
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
vertikale größe am Bildschirm einer OpenGL-Einheit:
(y/z)/tan(FovY/2)*(height/2)
horizontal funktioniert das ähnlich, nur kennst du da wohl FovX nicht, sondern musst den tangens aus FovY und Seitenverhältnis errechnen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Mir persönlich stellt sich da die Frage ob es überhaupt etwas bringt, wenn es wirklich maßstabsgetreu ist? Denn wie du selbst festgestellt hast sind die Entfernungen so gigantisch groß, dass kaum noch was sichbares bei rum kommen würde. Mal eben nachgerechnet. Wenn man Erde und Sonne zusammen auf einem 22" Wide in einer Ebene darstellen wollte wäre die Sonne schlappe 15,63 Pixel groß und die Erde nur 0,14 Pixel. Und ich denke die Entfernungen dürften in Echt noch um ein Vielfaches größer werden.
Wenn das keine wissenschaftliche Anwendung werden soll sollte man dort evtl. einfach künstlerische Freiheit walten lassen. Keine Ahnung was man da am Besten machen könnte. Abstände auf ein sinnvolles Maß reduzieren wäre eventuell etwas. Die Verhältnisse untereinander sollten natürlich noch gleich bleiben.
Registriert: Mo Okt 15, 2007 18:30 Beiträge: 74 Wohnort: Berlin
Erst mal danke für eure schnellen Antworten. Vielleicht habe ich mit maßstabsgetreu nicht die passende Umschreibung getroffen. Ich möchte also das im Nahbereich der Planet entsprechend groß erscheint wenn ich dicht davor bin und kleiner wird je weiter ich mich entferne. Also ganz normales Verhalten wie in der Realität (oder opengl ). Wenn der Körper eine gewisse Mindestgröße unterschritten hat, sagen wir mal 20 Pixel, dann soll dieser Wert beibehalten werden. Dann sieht man die Planeten immer noch vernünftig, selbst wenn man das komplette Sonnensystem auf dem Bildschirm hat. Der Vorschlag von Lord Horazont kommt meiner Vorstellung schon recht nah. Weiß nur nicht so recht wie ich in der perspektivischen Ansicht konstant große Objekte rendern kann.
Hat da jemand nen Vorschlag?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Dann war das nur meine typisch panische Paranoia.
Zum Berechnen der Größe hatte The-Winner eine kleine Formel gepostet. Wobei ich gestehen muss, dass ich mathematisch nicht bewandert genug bin um dir das zu erklären.
Ich würde sagen
y = Planetenradius
z = Abstand vom Augpunkt zum Planeten
FovY/2 wären z.B. 30° bei gluPerspective(60,...
Height entspricht der Höhe des Panels auf dem ich Render in Pixeln.
Wenn ich es richtig verstehe wird der Winkel welcher die Ausdehnung des Planeten beschreibt mit dem Winkel des Viewing Volumen ins Verhältnis gesetzt und mit der Panelhöhe in Pixeln multipliziert. Ergebnis ist die Planetenhöhe in Pixeln, wie gewünscht.
Leider reichen meine OpenGL-Fähigkeiten nicht so weit das ich das jetzt wie gewünscht beeinflussen kann. Ich kann nur ganz am Anfang der Rendering Pipeline was ändern. Also ich würde dann bei gluSphere den Radius vergrößern.
Wobei, jetzt wo ich das hier schreibe fällt mir folgendes ein:
Ich könnte ja die obige Formel nach y umstellen und diesen Wert dann bei zu großem Abstand als neuen Radius zum Zeichnen mit gluSphere nutzen. Werds nachher mal probieren und meine (Un)Zufriedenheit dann hier kundtun.
Wenn ich einen Denkfehler gemacht habe oder jemand ne komfortablere/bessere Möglichkeit hat um die Pixelgröße auzurechnen oder zu beeinflussen, dann trotzdem raus damit
z ist der abstand der Augenebene zum Planeten, also die reine z-koordinate nach der transformation durch die modelview matrix.
nützlich ist auch dass tan(FovY/2)/tan(FovX/2) dem Seitenverhältnis(zum viewport passendes Seitenverhältnis vorausgesetzt) entspricht, da du ja FovX nicht direkt kennst.
(Ich gehe von der Perspektivenfunktion aus der man FovY und das Seitenverhältnis übergibt)
Der code ist eine Abwandlung meines Pickray-Verfahrens. Sonst hast du alle größen richtig verstanden.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.