Berechnung einer Kugel in Parameterdarstellung
-
Hallo Leute,
ich hab da ein kleines Problem...ich möchte in OpenGL eine Kugel erstellen. Die Kugel soll aber nicht mit einem Befehl aufgerufen werden (glutSolidSphere), sondern die Koordinaten sollen mit den Kugelkoordinaten berechnet werden.
Also:
x=r*sin &Theta ;*cos φ
y=r*sin &Theta ;*sin φ
z=r*cos &Theta ;
Ich hab nun keine Ahnung wie ich das in zwei schöne c++ Schleifen reinpacke , um die Kugel zu zeichnen. Bei mir kamen nur komische Gebilde raus.
Achja, um eine schöne Oberfläche zu bekommen, sollen die Quadrate in steps unterteilt werden.
Hier mal mein Gewurstle...void Kugel::zeichneKugel(float r, int step) { GLfloat i, j; for(i=-step; i<step; i++) for(j=-step;j<step;j++){ glBegin(GL_QUADS); glVertex3f(r*sin(i)*cos(j), r*sin(i)*sin(j), r*cos(i)); glVertex3f(r*sin(i)*cos(j), r*sin(i)*sin(j+1), r*cos(i)); glVertex3f(r*sin(i)*cos(j), r*sin(i)*sin(j+1), r*cos(i+1)); glVertex3f(r*sin(i)*cos(j), r*sin(i)*sin(j), r*cos(i+1)); glEnd(); }
-
Sollten die Winkel nicht zwischen 0 und Pi bzw. 2*PI liegen?
Bye, TGGC \-/
-
Da haste recht. Wo baue ich dann aber die steps ein?
-
Vielleicht bei 0%, 10%, 20%, 30% ... 90%?
-
Hhhhmmmm...versteh ich nicht...kannst Du mir ein Codebeispiel geben?
Wäre Dir super dankbar
-
Nach vielem hin und her, denke ich mal, dass ich der Lösung recht nah bin.
Mit diesem Code bekomme ich schon so was ähnliches wie eine Kugel hin...die QUADS sind nur falsch ausgerichtet. Die stehen senkrecht in der Kugel und bedecken nicht die Oberfläche...was hab ich da noch falsch?GLfloat i, j; for(i=0; i<step; i=i+1.0) for(j=0;j<step;j=j+1.0){ glBegin(GL_QUADS); glVertex3f(r*sin(i*2*pi/step)*cos(j*2*pi/step), r*sin(i*2*pi/step)*sin(j*2*pi/step), r*cos(i*2*pi/step)); glVertex3f(r*sin(i*2*pi/step)*cos(j*2*pi/step), r*sin((i+1)*2*pi/step)*sin((j+1)*2*pi/step), r*cos(i*2*pi/step)); glVertex3f(r*sin(i*2*pi/step)*cos(j*2*pi/step), r*sin((i+1)*2*pi/step)*sin((j+1)*2*pi/step), r*cos((i+1)*2*pi/step)); glVertex3f(r*sin(i*2*pi/step)*cos(j*2*pi/step), r*sin(i*2*pi/step)*sin(j*2*pi/step), r*cos((i+1)*2*pi/step)); glEnd();
Hat da jemand Ahnung was ich da noch ändern muß...ich will endlich eine Kugel sehen!!
MfG
Lizard77
-
Guck dir mal den GLU Source an (gluSphere)
cya
liquid
-
wenn ich mich nicht irre, ist das eine kugel (src ist zwei jahre alt und ich hab keine ahnung, ob das funzt
):
CUSTOMVERTEX pre; for(int ring=0; ring<vert; ring++) { glBegin(GL_TRIANGLE_STRIP); for(int seg=0; seg<=vert; seg++) { pre.x = double(radius*cosg(seg*(360/vert))*sing((ring+1)*(180/vert))); pre.y = double(radius*cosg((ring+1)*(180/vert))); pre.z = double(radius*sing(seg*(360/vert))*sing((ring+1)*(180/vert))); pre.u = 1.0f/double(vert)*double(seg); pre.v = 1.0f/double(vert)*double((ring+1)); glTexCoord2d(pre.u, pre.v); glVertex3d(pre.x, pre.y, pre.z); pre.x = double(radius*cosg(seg*(360/vert))*sing((ring)*(180/vert))); pre.y = double(radius*cosg((ring)*(180/vert))); pre.z = double(radius*sing(seg*(360/vert))*sing((ring)*(180/vert))); pre.u = 1.0f/double(vert)*double(seg); pre.v = 1.0f/double(vert)*double(ring); glTexCoord2d(pre.u, pre.v); glVertex3d(pre.x, pre.y, pre.z); } glEnd(); }
-
Vielen Dank...der src tut aber nicht...da kommt auch ein seltsames Gebilde dabei raus...und läuft auch noch extrem langsam.
MfG
Lizard77
-
LiquidAcid schrieb:
Guck dir mal den GLU Source an (gluSphere)
cya
liquid
-
Lizard77 schrieb:
..ich möchte in OpenGL eine Kugel erstellen. Die Kugel soll aber nicht mit einem Befehl aufgerufen werden (glutSolidSphere)...
Lese die Frage richtig...und mit einem Befehl kann das doch jeder. Ich möchte vor allem den mathematischen Teil verstehen. Du bist wahrscheinlich auch einer, der sagt, Programmieren geht auch ohne Studium...wenn man sich auf Befehle beschränken möchte...gerne...am besten springe gleich nach deinem zivi ins Berufsleben
-
Lizard77 schrieb:
Lese die Frage richtig...und mit einem Befehl kann das doch jeder. Ich möchte vor allem den mathematischen Teil verstehen. Du bist wahrscheinlich auch einer, der sagt, Programmieren geht auch ohne Studium...wenn man sich auf Befehle beschränken möchte...gerne...am besten springe gleich nach deinem zivi ins Berufsleben
Und guck du dir den SOURCE an. Ich habe nicht gesagt, dass du einfach die Funktion benutzen sollst - du sollst dir den QUELLCODE angucken. Jaja, manchmal lernt man auch viel daraus sich anderer Leute Arbeit anzugucken.
@Mülllaberei: Und du bist sicher auch einer der Sorte Mensch, die andere Menschen beurteilt ohne sie überhaupt ein Stück zu kennen. Nur zu deiner Information. Ich habe meinen Zivildienst längst abgeschlossen und werde dieses Wintersemester ein Mathe/Physik-Studium an einer deutschen Universität beginnen. Also halte dich mit deiner Beurteilung etwas zurück, da sowas ganz schnell mal nach hinten losgehen kann
cya
liquidEDIT: Und da ich darüberhinaus noch ein sehr netter Mensch bin. Hier der direkte Link zum Mesa Source.
-
Naja da gab es nichts zu lernen...ein perfektes durcheinander hat man da gefunden...reine Zeitverschwendung...da lohnt es sich mehr, selbst zu überlegen, als heraus zu finden, wie es die Profis machen. Sorry wenn ich dich angegriffen hab...aber wenn du nicht willst, dass du als zivi angesehen wirst...ändere dein "Benutzerprofil".
Also noch mal zurück zu meinem eigentlichen Problem...was ist an meinem Quellcode falsch?
Es wird doch jemand da draussen wissen, wo mein Denkfehler liegt?
-
Imho ist die gluSphere Funktion sehr übersichtlich. Ich weiß absolut nicht was du daran auszusetzen hast. Die Länge der Funktion kommt nur dadurch zustande, dass ziemlich viele Zeichenkombinationen abgedeckt werden müssen.
Für filled drawing ohne Texturkoordinaten wird zB folgender Inner-Loop genommen:
/* draw +Z end as a triangle fan */ glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, nsign * radius); for (j = 0; j <= slices; j++) { theta = (j == slices) ? 0.0 : j * dtheta; x = -sin(theta) * sin(drho); y = cos(theta) * sin(drho); z = nsign * cos(drho); if (normals) glNormal3f(x * nsign, y * nsign, z * nsign); glVertex3f(x * radius, y * radius, z * radius); } glEnd();
Der Code ist imho auch wesentlich übersichtlicher als der von Energyzer
cya
liquidEDIT:
Lizard77 schrieb:
Sorry wenn ich dich angegriffen hab...aber wenn du nicht willst, dass du als zivi angesehen wirst...ändere dein "Benutzerprofil".
Man greift so oder so die Leute nicht an, auch wenn sie Zivildienst leisten. Außerdem ist es überheblich sich einzubilden etwas davon ableiten zu können ob derjenige jetzt Zivildienst abgeleistet hat oder nicht.
Und wenn wir schonmal dabei sind möchte ich diese Aussage von dir -
Lizard77 schrieb:
Du bist wahrscheinlich auch einer, der sagt, Programmieren geht auch ohne Studium
- unterstützen. Um Programmieren zu können braucht man auch kein Studium, das ist Unsinn das zu glauben. Ich habe mir C/C++ und OpenGL auch autodidaktisch beigebracht, dafür brauchte ich kein Studium
-
Lizard77 schrieb:
..reine Zeitverschwendung...da lohnt es sich mehr, selbst zu überlegen, als heraus zu finden, wie es die Profis machen
Dann überlege endlich selbst und lass uns in Ruh'!
-
Oh ha...und nu sind wir bei der besonderen Freundlichkeit der Programmierer angekommen. Ich versteh eine Antwort nicht auf Anhieb..es entsteht ein kleines hin und her, und schon wird man verjagt. Wer ist denn da nun überheblich!
LiquidAcid...ich hab nie deine Tätigkeit als Zivildienstleistender angegriffen.
Ich bin dir auch dankbar über den Link zum Quellcode...die Stelle, die du mir zitiert hast, hab ich auch so gefunden und in meinen Code eingebaut. Nur läuft es noch nicht sauber. Aber trotzdem danke. Ich hätte nur gern verstanden, wieso meine Variante nicht klappt. Und du kannst bestimmt auch verstehen, wenn man tagelang an einem Problem sitzt und nicht voran kommt, dass man auf so manche kluggemeinten Ratschläge, pampig reagiert.Und zu Sgt. Nukem....kein Kommentar.
MfG
Lizard77
-
Lizard77 schrieb:
Und zu Sgt. Nukem....kein Kommentar.
Das war nur als Reaktion für Deine Überheblichkeit LiquidAcid entgegen!
Soviel zur "Freundlichkeit der Programmierer"...
-
Na die hab ja auch ich schon alles gepachtet.
Bye, TGGC \-/
-
TGGC schrieb:
Na die hab ja auch ich schon alles gepachtet.
Du ziehst es aber wenigstens konsequent durch, es gehört zu Deinem Stil, und machst nicht so halbgare Sachen...