Problem bei Kugeldarstellung mittels gluQuadric

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von wegnera »

Ich bekomme immer nur ein schwarzes Fenster :cry:
Nachdem ich mich an den normalen 2D und 3D Objekten mittels GL versucht habe, wollte ich mich nun mal an eine Kugel wagen und diese mittels gluQuadric darstellen. Der Compiler zeigt auch keinen Fehler an, dennoch sehe ich nur einen schwarzen Bildschirm. Ich habe schon probiert die Perspektive anzupassen usw. Vielleicht hat jemand noch einen Idee.

danke euch
Dateianhänge
u_kugel.pas
(4.01 KiB) 129-mal heruntergeladen

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von wp_xyz »

Ich sehe hier nirgendwo ein glTranslate. Ich denke, du sitzt mitten in der Kugel...

Der Radius der Kugel ist 30 (der 2.Parameter von gluSphere. Daher schiebe mal die Kugel das doppelte, also etwa 60 Einheiten von dir weg: glTranslate(0, 0, -60) (die 3.Koordinaten ist in den Bildschirm hinein, ich bin aber nicht sicher, ob das Vorzeichen stimmt, probier's auch mit +60), statt den beiden glRotate (ohne die Translation wird nur die Kugel gedreht, in der du sitzt - da ändert sich nichts).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von wp_xyz »

OK, ich hab's jetzt selbst ausprobiert, mein Vorschlag oben hat nichts gebracht.

In dem Code unten sieht man die Kugel. Das sind die Änderungen:

- mit gluLookAt (im Wirkungsbereich der ModelViewMatrix) wird festgelegt, wo die Kamera sitzt (die ersten drei Parameter, hier 60 Einheiten vor dem Bildschirm in Höhe der Bildschirmmitte), wo sie hinblickt (zum Ursprung 0,0,0), und wie die Vertikale verläuft (in y-Richtung nach oben)
- die Translate und Rotate-Aufrufe sind entfernt
- die rote Farbe wird mit glColor3f(1,0,0) gesetzt, nicht mit glColor3b(1,0,0) - letzteres will bytes, 1,0,0 ist also nahezu schwarz.

Versuche, ausgehend von diesem Beispiel, zu verstehen, was passiert, wenn du glTranslate und glRotate einführst. Mache nur kleine Schritte, sonst wandert die Kugel leicht aus dem Blickfeld. Achte auf die Reihenfolge: zuerst Translate, dann Rotate ist nicht dasselbe wie zuerst Rotate, dann Translate. Und die Reihenfolge spielt auch bei den verschiednen Rotationen um die verschiedenen Achsen eine Rolle. Das musst du unbedingt verstehen, vorher ist OpenGL eine heillose Raterei! Mache dir immer klar, wo die Kamera sitzt und wo sie hinschaut, und wo die Objekte der Szene sind. Kann die Kamera die Objekte sehen? Ich finde: eine phantastische Übung für räumliches Vorstellungsvermögen.

Code: Alles auswählen

procedure TForm1.OpenGLControl1Paint(Sender: TObject);
 
var
  quadric : PGLuquadric;
 
begin
    // Screen- und Tiefenbuffer bereinigen
  glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );   // Clear the Screen and the Depth
 
  // Width  & Height existieren bereits in der Unit CONTROLS
 
  glMatrixMode(GL_PROJECTION);                            // Zvolí projekèní matici
  glLoadIdentity();                                       // Reset matice
  gluPerspective(65.0,Width/Height,0.1,100.0);            // Výpoèet perspektivy
  glViewport(0, 0, Width, Height);                        // Resetuje aktuální nastavení
 
  glMatrixMode(GL_MODELVIEW);                             // Zvolí matici Modelview
  glLoadIdentity;                                          // Reset the Current ModelView Matrix
  gluLookAt(0,0,60, 0,0,0, 0,1,0);
 
  glEnable(gl_normalize);
 
 
   //glPushMatrix();         // Startsystem wird gespeichert
   glLineWidth(1);
        glColor3f(1,0,0);
   quadric:=gluNewQuadric();
        gluQuadricOrientation(quadric,glu_outside);
   gluQuadricTexture(quadric,gl_false);
   gluQuadricDrawStyle(quadric, GLU_FILL);
        glShademodel(gl_flat);
        gluQuadricTexture(quadric, gl_false);
   gluSphere(quadric, 30, 40, 40);
   gluDeleteQuadric(quadric);
 
   //glPopMatrix();
        OpenGLControl1.SwapBuffers;
end;

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von wegnera »

danke, jetzt sehe auch ich die Kugel. Zwei Verständnisfragen:

1. habe die Kugel als Gitternetz rendern lassen. Es sieht so aus als wenn ich von oben auf die Kugel schaue. Wenn ich die Kugel nun rotieren lasse, verändert sich die Sicht auf das Gitternetz oder bleibt die Polsicht erhalten? Ich sehe nämlich ersteinmal keine Veränderung bei rotate .

2. wo muss ich die transformationsbefehle hinpacken, vor oder nach dem erzeugen des Objektes?

gruß
Andreas

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von Mathias »

Ich sehe nämlich ersteinmal keine Veränderung bei rotate .

Hast du auch mal versucht, um eine andere Achse zu rotieren ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von wp_xyz »

Bei gluLookAt(0,0,60, 0,0,0, ...) liegt die Kamera 60 Einheiten vor dem Objekt (die z-Achse ragt aus dem Bildschirm) und sieht auf die Kugel (im Ursprung). Ich weiß nicht, wie gluSphere die Kugel konstruiert, aber ich könnte mir durchaus vorstellen, dass die Breitenkreise entlang der z-Achse verlaufen, das wäre in unserem Beispiel die Blickrichtung, so dass du direkt auf den Pol blickst.

Setze einfach die Kamera etwas höher (y=30) und nach links (x=-20) um einen anderen Blickwinkel zu haben. --> gluLookAt(-20, 30, 60, 0, 0, 0, ...).

Darüber hinaus kannst du natürlich auch spezielle Rotate und Translate-Befehle einsetzen. Ich meine, das muss alles vor der Objekterzeugung stehen, weil alle Operationen in der ModellView-Matrix zusammenmultipliziert werden, die dann auf die Vertices des Objects angewendet werden. Würden sie nach der Objekterzeugung stehen, wären sie wirkungslos, weil das Objekt schon behandelt worden ist, aber die nachfolgend erzeugten Objekte betreffen. Ich habe mir damals das so versucht zu merken, dass man den Quellcode praktisch von hinten nach vorne lesen muss.

Diese Befehlssquenz
- glRotate (um y)
- glTranslate (in x-Richtung)
- Gegenstand erzeugen
erzeugt demnach einen Gegenstand im Ursprung, verschiebt ihn horizontal z.B. nach rechts und führt dann eine Drehung um die nach oben weisende y-Achse aus. Wenn du mit einem Timer den Drehwinkel immer weiter vergrößerst würdest du eine Planetenbewegung des Gegenstands um den Ursprung sehen. (Ich hoffe das stimmt...)

wegnera
Beiträge: 14
Registriert: Sa 21. Jan 2017, 16:21

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von wegnera »

Danke dir für die ausführliche Erklärung. Es hat soweit alles geklappt. Gibt es hinsichtlich der Matrizen, Perspektiven, usw. auch gut erklärende Literatur bei der man nicht ein Mathegenie sein muss.

Meine nächsten Schritte wären, die kugeln mit Oberflächen zu erzeugen und dann würde ich diese gerne auf einer Art Kreisbahn sich bewegen lassen.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von pluto »

Eine gute Anlauf stelle ist immer
www.delphigl.com

Dort gibt es gute und Ausführliche Tutorials. Das meiste sollte auch unter Lazarus laufen.
MFG
Michael Springwald

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem bei Kugeldarstellung mittels gluQuadric

Beitrag von Mathias »

Eine gute Anlauf stelle ist immer
http://www.delphigl.com


Da ist der TE schon registriert.
Das stimmt für OpenGL spezifische Sachen, ist dies ein sehr gute Seite.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten