Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 20:59

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Skysphere - Berechnen
BeitragVerfasst: Di Nov 17, 2009 10:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hi,
es gibt im Internet und auch hier im Forum ja schon einige Fragen etc. zu Skyspheren. Ich habe mich jetzt mal entschieden in mein Spiel "Himmel" einzubauen. Die erste Frage war wie ich eine (Halb-)Kugel berechne, das habe ich jetzt fast gelöst (obwohl ich den Verdacht habe das alles 2 mal gezeichnet wird). Mein eigendliches Problem dabei sind die Kanten der beiden Halbkreise (einmal mit Z im Minus und mit Z im + Bereich damit nicht so viel gerechnt werden muss). Da man es auf einem Bild nicht so gut sehen kann habe ich mein Testprogrammm angehängt. Eventuell könnt ihr mir ja aber schon Aufgrund des sagen was falsch ist.
Code:
  1. procedure TForm1.DrawSky(Radius:Single);
  2. var
  3.    x,y:Integer;
  4.    Deg1,Deg2,Deg3,Deg4:Single;
  5. begin
  6. glTranslatef(0,1,-5);
  7. glrotatef(r,0,1,0);
  8. for x:=90 to 270 do
  9.     for y:=0 to 90 do
  10.         begin
  11.         Deg1:=Sin((X  )*(Pi/180))*Radius;
  12.         Deg3:=Sin((X+1)*(Pi/180))*Radius;
  13.         Deg2:=Cos((Y  )*(Pi/180))*Radius;
  14.         Deg4:=Cos((Y+1)*(Pi/180))*Radius;
  15.         glBegin(GL_QUADS);
  16.           glColor3f(0.53, 0.81, 0.98); glVertex3f(Deg3,Deg2,Sqrt((Radius*Radius)-(Deg3*Deg3)-(Deg2*Deg2)));
  17.           glColor3f(0.53, 0.81, 0.98); glVertex3f(Deg1,Deg2,Sqrt((Radius*Radius)-(Deg1*Deg1)-(Deg2*Deg2)));
  18.           glColor3f(0.53, 0.81, 0.98); glVertex3f(Deg1,Deg4,Sqrt((Radius*Radius)-(Deg1*Deg1)-(Deg4*Deg4)));
  19.           glColor3f(0.53, 0.81, 0.08); glVertex3f(Deg3,Deg4,Sqrt((Radius*Radius)-(Deg3*Deg3)-(Deg4*Deg4)));
  20.         glEnd;
  21.  
  22.         glBegin(GL_QUADS);
  23.           glColor3f(0.93, 0.01, 0.08); glVertex3f(Deg3,Deg2,-Sqrt((Radius*Radius)-(Deg3*Deg3)-(Deg2*Deg2)));
  24.           glColor3f(0.93, 0.01, 0.08); glVertex3f(Deg1,Deg2,-Sqrt((Radius*Radius)-(Deg1*Deg1)-(Deg2*Deg2)));
  25.           glColor3f(0.93, 0.81, 0.08); glVertex3f(Deg1,Deg4,-Sqrt((Radius*Radius)-(Deg1*Deg1)-(Deg4*Deg4)));
  26.           glColor3f(0.93, 0.81, 0.08); glVertex3f(Deg3,Deg4,-Sqrt((Radius*Radius)-(Deg3*Deg3)-(Deg4*Deg4)));
  27.         glEnd;
  28.         end;
  29. end;

Leider (und wie immer) hatten wir das in der Schule noch nicht, ich habe mir den Code zwar selber ausgedacht aber wie zB cos funktioniert weis ich nicht.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Di Nov 17, 2009 11:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Hm, zu deinem Problem kann ich leider nicht viel sagen. Ich habe mir die Datei mal runtergeladen und es sieht irgendwie komisch aus.
Bild
Auch scheint die Kugel SEHR detailiert zu sein. :shock:

Ich persönlich würde dir eine Skybox anraten bzw. fragen, was dagegenspricht. Ich habe zuerst auch gedacht, es würde irgendwie komisch aussehen, aber erstaunlicherweise merkt man vom boxigen garnichts mehr. ^^ Skyboxen kann man gut mit Terragen (1, die 2 ist sehr overloaded) erstellen, gibt da auch Tutorials im Internet. Ich denke das erstellen eines Skysphere mit Himmel und Landschaft könnte "aufwendig" werden...

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Di Nov 17, 2009 11:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Skyspheres haben durchaus ihre Berechtigung, nämlich dann, wenn man als Himmel beispielsweise einen Sternenhimmel nutzen will und man dafür echtes Material von der NASA benutzt...welches eben für eine Kugel ausgelegt ist ;)

Mit ist ein Rätsel warum bei dem oben geposteten Code-Ausschnitt überhaupt eine Halbkugel und kein Zylinder heraus kommt...aber mich aber auch nur kurz damit befasst...muss jetzt leider zur Uni.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Di Nov 17, 2009 13:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Komisch bei mir sieht alles richtig aus (bis halt auf die Ränder).
(Es läuft auf meiner GeForce 6700 auch mit 25-30 fps)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Di Nov 17, 2009 13:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Ziz hat geschrieben:
Auch scheint die Kugel SEHR detailiert zu sein.

Es ist erstmal nur ein Test, später zeichne ich dann natürlich weniger.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Di Nov 17, 2009 16:48 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich finde die Berechnungen ein bischen konfus. Wo da der Fehler liegt kann ich also nicht sagen, aber vielleicht probierst du das ganze mal ein bischen anders:

Die Koordinaten würde ich so berechnen:

radius=cos(j*Pi/180);
x=radius*sin(i*Pi/180);
z=radius*cos(i*Pi/180);
y=sin(j*Pi/180);

Ich hab die Laufvariablen bei mir mal anders genannt. x,y,z sind dann die Koordinaten für einen Punkt. Für die anderen Punkte des Quads muss man dann logischerweise 1 auf i und/oder j addieren, wie du das schon machst. i würde von 0 bis 359 laufen und j von 0 bis 89.
Allerdings sollte man j vielleicht schon im negativen Bereich starten, weil man sonst zB wenn man auf einem Berg steht und nach unten zum Horizont schaut, unten am Skydome vorbei ins Nichts schauen kann. Aber das kommt natürlich darauf an, für was du das verwenden willst.

Und noch was anderes zu deinem Code: glBegin und glEnd solltest du nach außerhalb der Schleifen verlagern, das spart noch ein bischen Zeit.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Di Nov 17, 2009 20:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@Schläfer: Danke für die Antwort, ich werde versuchen es morgen umzusetzen
warum wird bei y=sin(j*Pi/180); nicht mit radius mal genommen?

Schläfer hat geschrieben:
Und noch was anderes zu deinem Code: glBegin und glEnd solltest du nach außerhalb der Schleifen verlagern, das spart noch ein bischen Zeit.

Das vergesse ich jedesmal. :oops:

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 11:06 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wichtig ist noch zu erwähnen, dass die Skybox/Sphere sehr klein sein kann. Du zeichnest sie einfach zuerst. Ihre Aufgabe ist es ausschließlich den Gesamten Bildschirm zu füllen und damit einen Hintergrund zu bieten.
Dann wird der Tiefenpuffer gelöscht. Alle weiteren Zeichenkomandos überschreiben dann den Hintergrund.
Du wusstest das vermutlich schon, aber falls andere diesen Thread lesen, wollte ich es nochmal gesagt haben.

Wenn du in deiner Scene dann mit Licht arbeitest, solltest du darauf achten, dass das globale "Sonnenlicht" aus der selben Richtung kommt, wo auch deine Sonne in der Himmelstextur steht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 12:21 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Um an Flash anzuknüpfen: Wenn die SkySphere / -Box sowieso den ganze Bildschirm abdeckt, muss man noch nichtmal den Farbbuffer löschen. Bei schwacher Bandbreite des VRAMs kann das je nach Auflösung einen deutlichen Performance-Schub bringen - vorausgesetzt man ist Speicher-limitiert.

Gruß mrtrain


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:30, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@Flash&mrtrain: Das wusste ich schon, gibt es noch ihrgendwelche Besonderheiten die man verbessern kann? (VBOs habe ich schon mit einem ensprechenden Shader zusammen eingebunden um den Himmel als VBO dynamisch verändern zu können)

Bzw: Wüsste ich gerne mal wie detailiert so eine Skysphere sein sollte, um nicht zu viel Leistung zu kosten ohne und ohne das er schlecht bzw eckig wirkt.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 13:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Bzw: Wüsste ich gerne mal wie detailiert so eine Skysphere sein sollte, um nicht zu viel Leistung zu kosten ohne und ohne das er schlecht bzw eckig wirkt.

Sie sollte so sein das auf einen Bildschirmpixel ungefähr ein Pixel der Skybox bzw. -sphere kommt. Die Auflösung kann aber ruhig auch höher sein, Mipmapping erledigt das. Also ich würde jetzt mal sagen PI mal Daumen folgende Formel:
Code:
  1. // der gute alte Dreisatz...
  2. skySize = (viewportHeight / fovy) * 360

Bei einem Öffnungswinkel (fovy) von 45 Grad und einer Auflösung von 1024x768 brauchst du also eine 6144 Pixel breite Skytextur die als Zylinder auf die Kugel geklebt wird. Das ist schon verdammt groß, also wenn du sowieso nur unscharfe Wolken/Nebel/etc in der Skytextur hast kommst du auch mit weniger aus.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@Coolcat: Ok, ich versuche das etwa so umzusetzen. Warscheinlich brauche ich aber noch weniger Pixel.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich kann dir noch folgende 2 Links, zur Thematik, empfehlen.
http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/2554/pdf/imm2554.pdf
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@TAK2004: Danke, den Link zu GPUGems kannte ich schon, der andere lässt sich im Moment bei mir leider nicht laden.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Skysphere - Berechnen
BeitragVerfasst: Mi Nov 18, 2009 22:27 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
mori hat geschrieben:
@Schläfer: Danke für die Antwort, ich werde versuchen es morgen umzusetzen
warum wird bei y=sin(j*Pi/180); nicht mit radius mal genommen?


Radius ist bei meinem Beispiel oben nicht der Radius der Kugel, sondern der Radius des Schnittkreises der Skysphere und einer horizontalen Ebene durch den gesuchten Punkt. Wenn Radius immer 1 wäre würde ein Zylinder entstehen. Also mit anderen Worten, sorgt das dafür das die Kugel sich nach oben hin schließt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]