Animation erstellen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Animation erstellen

Beitrag von Mathias »

Schon die Trigonometrie bringt mich oft an meine Grenzen.
Ein paar Formeln habe ich hier gefunden: http://www.sengpielaudio.com/Rechner-dreieck.htm

Da sieht man wenigstes gut, wie man die drei Winkel Alpha, Beta und Gamma ausrechnen kann.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

Danke. Auf einer ähnlichen Seite habe ich auch schon meinen alten Wissensstand aufgefrischt. Ist ja schon über 40 Jahre her seitdem ich das mal gelernt habe.

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

Hallo,
gibt es eine Möglichkeit die Position eines Punktes in OpenGL zu speichern?
Wenn ich,z.b., in einer Funktion glTranslate / glRotate benutze um einen Punkt zu bestimmen und später eine Verbindung zu diesem Punkt von einer anderen Stelle im Code herstellen möchte muss ich jedesmal diese Transformationen wieder beachten. Das kann bei einigen Dingen doch recht aufwändig sein.

Gruß

Hannes

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

Re: Animation erstellen

Beitrag von Mathias »

Ja, du kannst die Matrix speichern, aber ich muss zuerst gucken, wie dies geht.
Aber erst morgen. Auf dem Tablet ist dies recht mühsam. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

Hallo Mathias,
langsam bekomme ich ein schlechtes Gewissen weil ich Deine Hilfe so sehr in Anspruch nehme.
Wäre die schöne Schweiz nicht so weit würde ich Dir gern einmal persönlich danken!

Mit freundlichen Grüßen

Hannes

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

Re: Animation erstellen

Beitrag von Mathias »

langsam bekomme ich ein schlechtes Gewissen weil ich Deine Hilfe so sehr in Anspruch nehme.
Das gute dabei, ich lerne dabei auch etwas.
Irgendwie setze ich mich da mit Sachen auseinander, welche ich nie in der Schule hatten.
So wie ich mich erinnern mag, war in der Schule mit Pythagoras Schluss.

Ich versuche grade eine Bibliothek zusammen zu stellen, welche die Winkelfunktionen vereinfachen sollen.
Wen man aus a + b den Winkel will, muss man nur noch a_b_To_Alpha(a, b) eingeben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

Hallo Mathias,
ich wünsche Dir viel Erfolg dabei.
Kannst Du mir Literatur, deutsch, zu OpenGL empfehlen? Ständig tauchen neue Fragen auf und ich möchte auch selbst versuchen weiter zu kommen.Tutorials die ich bisher gefunden habe bringen mich oft nicht recht weiter. Meistens geht es dabei um Spiele.
Warum, z.B., hat die Verwendung von " gluQuadricDrawStyle(quadricParam,GLU_Line)" keine Auswirkung? Es wird weiter gefüllt gezeichnet.

Code: Alles auswählen

begin
 
 //   gluQuadricDrawStyle(quadricParam,GLU_FILL);
    gluQuadricDrawStyle(quadricParam,GLU_Line);
    glBegin(GL_QUADS);
    glColor3f(0,0,0);
    glVertex3f(IAA-IAJ*0.75, IAJ*0.5, 0);
    glVertex3f(IAA-IAJ*0.75, -IAJ*0.5, 0);
    glVertex3f(IAA+IAJ*0.75, -IAJ*0.5, 0);
    glVertex3f(IAA+IAJ*0.75, IAJ*0.5, 0);
    glEnd();                                       
Hannes

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

Re: Animation erstellen

Beitrag von Mathias »

Warum, z.B., hat die Verwendung von " gluQuadricDrawStyle(quadricParam,GLU_Line)" keine Auswirkung? Es wird weiter gefüllt gezeichnet.
Weil gluQuadricDrawStyle nur einen Einfluss auf die vordefinierten Mesh hat, zB. gluDisk.
Normalerweise verwende ich diese nicht mehr, ich zeichne meine Mesh lieber selbst, man ist dann viel flexibler, dies wird interessant, wen man mit Shadern, Licht und Texturen arbeitet.

Wen es unbedingt ein Drahtgitter sein soll, dann verwende einfach:

Code: Alles auswählen

  // Für Linen  
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  // Gefüllt, Standard
  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  // Punkte
  glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
Du kannst zur Laufzeit jederzeit den Modus ändern.
Kannst Du mir Literatur, deutsch, zu OpenGL empfehlen?
Damit sieht es leider recht schlecht aus.
Was noch eine Frage ist, willst du weiter mit dem alten OpenGL arbeiten, oder willst du mit dem modernen, ab Version 3.3 einsteigen ?
Für den Anfang ist dies komplizierter, aber dafür bist du viel flexibler. ZB. Bumpmaping, Beleuchtung etc.

Gut für diese Animation ist das alte OpenGL gut, aber vielleicht willst du später mal etwas in echtem 3D machen.
Oder spätestens, wen du etwas für Android machen willst, dann geht ist nicht mehr anders.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Animation erstellen

Beitrag von wp_xyz »

Johannes hat geschrieben:Kannst Du mir Literatur, deutsch, zu OpenGL empfehlen?
Unser Lieblingsversender hat "3D-Grafik mit OpenGL" (http://www.amazon.de/3D-Grafik-mit-Open ... 3826655125). Sieht auf den Probeseiten recht vernünftig aus. Ist allerdings für C, aber da die OpenGL-Befehle identisch sind, sollte man auch mit Pascal damit klarkommen.

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

Danke. Da kann ich ja lange probieren. Es muss auch nicht unbedingt ein Drahtgitter sein. Mich hatte es nur interessiert.
Ich werde meine kleine Animation wohl mit dem "alten" OpenGL fertig stellen. Das ist, für mich, schon genug Neuland. Wenn das erledigt ist sehe ich weiter.
Shader,Licht und Texturen werde ich wohl kaum so schnell brauchen obwohl: Um Schnittflächen (z.B.Zylinder aufgeschnitten) schraffiert darzustellen braucht man eigentlich schon eine Textur.
Hab mal nach "Matrix speichern" gesucht aber damit bin ich auch noch nicht weiter gekommen.

Danke auch für die Buchempfehlung. Ich schau mir das gleich einmal an.

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

Re: Animation erstellen

Beitrag von Mathias »

Hab mal nach "Matrix speichern" gesucht aber damit bin ich auch noch nicht weiter gekommen.
Hier ein Beispiel:

https://wiki.delphigl.com/index.php/glLoadMatrix
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Animation erstellen

Beitrag von Mathias »

Kannst Du mir Literatur, deutsch, zu OpenGL empfehlen?
Ich kenne doch ein Buch, das recht gut ist, es hat meistens eine Beispiel mit altem und Modernem OpenGL.
Aber das Buch ist eher als Ergänzung, wen man schon ein Basis-Wissen von OpenGL hat.

"Computergrafik und Bildverarbeitung: Band I: Computergrafik "
Aber ja nicht den den Band II kaufen, dort steht überhaupt nichts mehr von OpenGL, es ist somit Schrott. Leider habe ich den Fehler gemacht. :evil:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

Danke. Etwas zur Hilfe muss jedenfalls her.
Bisher habe ich einige Punkte per glLine verbunden um mein Gestänge sichtbar zu machen. Nun wollte ich daraus glQuads machen um auch die Breite der Stangen vernünftig darstellen zu können.
Leider bin ich nun schon wieder in einer Sackgasse.
Um die Höhe eines Quads festzulegen braucht es Parameter in y. Wenn aber die zu verbindenden Objekte rotieren klappt das natürlich nicht mehr da ja meine Stange nicht mehr parallel zur y-Achse bleibt.
So wird,z.B., meine Schwinge durch einen zweiten Exenter des Rades angelenkt. Die Koordinaten dieses Exenters sind bekannt und liegen um einen Winkel versetzt zum Exenter der Treibstange (Pleuel).
Beide Exenter sind durch die "Gegenkurbel" verbunden.

Das ist der momentane Zustand (mit glLine):

Der Aufruf für den Hauptexenter:

Code: Alles auswählen

     // Exenter
  zx := cos(alpha) *(IAJ/2);
  zy := sin(alpha) *(IAJ/2);
  glTranslatef(zx, zy, 0);
       // Treibstange / Kreuzkopfgelenk
  glRotatef(arcsin(-zy / IAK) / Pi * 180, 0.0, 0.0, 1.0);
  Treibstange(TRR / 8, IAK);         
und für die Gegenkurbel:

Code: Alles auswählen

     // Gegenkurbel Exenter
  gx := cos(GKW) *(Mathe.RAJ);
  gy := sin(GKW) *(Mathe.RAJ);
  glPushMatrix;
  glTranslatef(0,0,0);
  Gegenkurbel(zx,zy,gx,gy);
  glPopMatrix;                  
procedure "Gegenkurbel":

Code: Alles auswählen

procedure TSteuerung.Gegenkurbel(x1,y1,x2,y2:single);
       begin
    glLineWidth(10);
    glBegin(GL_LINES);
         glColor3f(0, 0, -0.08);
         glVertex3f(x1,y1,-0.08);
         glVertex3f(x2,y2,-0.08);
   glEnd();
     glTranslatef(x2,y2,-0.07);
  Lager(7);
     end;                             
Der Code ist nur zur Verbindung von Hauptexenter zum 2.Exenter. Die Anlenkung der Schwinge wird dann auf ähnliche Probleme stossen.

Es ist mir unangenehm schon wieder zu fragen aber vor lauter "glTranslate" / "glRotate" wächst das Brett vor meinem alten Kopf immer weiter..
Einige Stunden habe ich schon versucht selbst eine Lösung zu finden.
Hoffentlich ist meine Beschreibung verständlich.
Gruß

Hannes

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

Re: Animation erstellen

Beitrag von Mathias »

Es ist mir unangenehm schon wieder zu fragen aber vor lauter "glTranslate" / "glRotate" wächst das Brett vor meinem alten Kopf immer weiter..
Am besten stellst du dich in die Mitte deines Wohnzimmers, guckst Richtung Tür.

Als erster Versuch machst du 2 Schritte vorwärts und drehst dich anschliessend um 45°. Merke dir deine Position.

Gehe wieder zu Mitte zurück(Ursprunsposition).

Als zweiter Versuch, drehe dich um 45° und gehst anschliessend 2 Schritte vorwärts. Merke dir deine Position.

Du stellst fest, da du an 2 verschiedenen End-Positionen gestanden bist.

Mit Scaled verhält sich das ganze gleich, wen du vorher schrumpfst und 2 Schritte machst, oder das Ganze umgekehrt machst.
Wen du kleiner bist, sind deine Schritte(translate) auch kleiner.

Ich hoffe du verstehst jetzt, wie das in OpenGL geht.

Am Anhang noch ein kleines Beispiel.

PS: Dank dir weiss ich unterdessen was das arc vor sin,cos,tan bedeutet. Das hatten wir nie in der Schule :wink:
Dateianhänge
Rotate_Translate.zip
(125.47 KiB) 53-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

weiss ich unterdessen was das arc vor sin,cos,tan bedeutet. Das hatten wir nie in der Schule
Ich habe das auch nie gelernt und mir im WWW angelesen.
Ich glaube das mit dem Verschieben und Rotieren in OpenGL verstanden zu haben. Es gibt dazu auch gute Erklärungen im Netz.
Wahrscheinlich habe ich mich bei meiner letzten Frage nicht klar ausgedrückt.
Ich versuche es mal anders zu beschreiben:
Meine Schwinge wird von einer Exenterstange angetrieben. Die Schwinge selbst habe ich durch mehrere Transformationen in einer eigenen procedure erstellt und animiert. Nun fehlt mir die Darstellung der Exenterstange. Das eine Ende dieser Stange beschreibt einen Kreis um das Zentrum meines Rades. (gx := cos(GKW) *(Mathe.RAJ), gy := sin(GKW) *(Mathe.RAJ)) Das andere Ende treibt meine Schwinge an.
Ich habe per glLine eine Verbindung schaffen können nur kann ich mit glLineWidth keine vernünftige Breite der Exenterstange darstellen.
Wenn ich das Problem mit glQuads lösen möchte brauche ich den Winkel um den ich meine Stange drehen muss um ein Viereck mit richtiger Breite zu schaffen. Da es aber um Winkel aus 2 verschiedenen Objekten geht finde ich dazu keine Lösung.
Hoffentlich ist das so verständlicher.

Antworten