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 »

Noch eine kleine Verbesserung:

Man beachte den Farbübergang im Hintergrund.
Dateianhänge
OpenGL_Rad.zip
(126.54 KiB) 54-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 »

Hallo Mathias,
mir gehen langsam die "Danke" aus!
Eine Frage dazu: Die Togglebox soll doch das Multisampling umschalten, richtig?
Bei mir passiert beim 1. Betätigen nix Sichtbares. Beim 2.Mal wird die Darstellung dann "3d".
Ein Zurückschalten zur normalen Ansicht geht nicht mehr. Das muss ich mir aber erst noch genauer anschauen.
Habe Deine "Räder" erst jetzt entdeckt.
Gibt es so Etwas wie eine Referenz zu OpenGL/GLU welche mir die Möglichkeiten aufzeigt die ich noch nicht kenne ?
Die Aufgabe eine einfache Linie zu zeichnen scheint zu trivial zu sein um sie in einem Tutorial zu finden.
Du bist ein absoluter Jenie, das habe ich schon seit Monaten gesucht. :oops:
Ich wollte dies später mal mit FrameBuffer und ähnlichem lösen.
Manchmal geht etwas sehr einfach. :wink:
War das kein Scherz?
Ich würde mich natürlich freuen Dir etwas für Deine Mühen zurückgeben zu können, halte es aber für unwahrscheinlich.

Jetzt sollte ich aber auch mal wieder etwas tun sonst bist Du mit meinem Projekt schneller fertig..

Beste Grüße

Hannes

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

Re: Animation erstellen

Beitrag von Johannes »

Hallo,
ich hatte jetzt ein wenig Zeit mich mit der Umsetzung für mein Vorhaben zu befassen.
Dank der Beispiele von Mathias und ein wenig Recherche im Web fällt es mir immer Leichter
meine kleine Animation per OpenGL zu realisieren.
Viele Probleme die ich mit der alten Lösung hatte haben sich fast von selbst erledigt.
Wenn man mal den Einstieg geschafft hat fängt es richtig an Spaß zu machen.

Sicher werden auch noch Fragen aufkommen aber ich bin jetzt davon überzeugt endlich
die, für mich, richtige Lösung gefunden zu haben.

Danke und 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 »

Eine Frage dazu: Die Togglebox soll doch das Multisampling umschalten, richtig?
Bei mir passiert beim 1. Betätigen nix Sichtbares. Beim 2.Mal wird die Darstellung dann "3d".
Ich habe es gerade mit VB und WinXP getestet, das Verhalten es anderes als mit Linux.
Die Togglebox ist nur für Testzwecke.
War das kein Scherz?
Das war kein Scherz, ich habe viel zu weit gesucht.
Wenn man mal den Einstieg geschafft hat fängt es richtig an Spaß zu machen.
Das ist so, grafische Sachen zu schreiben finde ich das interessanteste auf dem PC.
OpenGL hat mich schon zur Win98-Zeiten begeistert, im dem DirektX-Zeugs konnte ich nie etwas anfangen.

Ein bisschen Eigenwerbung, was man mit OpenGL alles machen kann.
http://mathias1000.bplaced.net/Windows/ ... zeiger.exe
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 »

Jetzt wird die Fähigkeit von OpenGL erst richtig sichtbar.
Man beachte dir Räder.
Dateianhänge
OpenGL_Rad.zip
(126.84 KiB) 56-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 »

Hallo Mathias,
ist schon irre was man für Möglichkeiten hat. Ich kenne ja bisher nur wenige davon.
Umso mehr helfen mir Deine Beispiele. Die Farbverläufe sehen gut aus.
Dein Füllstandsanzeiger geht mir nicht aus dem Kopf.Man könnte auf Ideen kommen..
Ich kämpfe momentan mit dem Problem einen animierten Kreisbogen für meine Schwinge/Kulisse
zu erstellen aber auch das wird schon langsam.

Ohne Deine Unterstützung wäre es wohl nix geworden mit meinem Einstieg in OpenGL.

Danke

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 »

Ich kämpfe momentan mit dem Problem einen animierten Kreisbogen für meine Schwinge/Kulisse

Code: Alles auswählen

procedure TForm1.Arc(ri, ra, w: single; aufl: integer);
var
  w2: single;
begin
 
  glBegin(GL_QUAD_STRIP);
  w2 := 0;
  repeat
    w2 += aufl;
    glVertex3f(cos(w2 / 180 * Pi) * ri, sin(w2 / 180 * Pi) * ri, 0);
    glVertex3f(cos(w2 / 180 * Pi) * ra, sin(w2 / 180 * Pi) * ra, 0);
  until w2 > w;
  w2 := w;
  glVertex3f(cos(w2 / 180 * Pi) * ri, sin(w2 / 180 * Pi) * ri, 0);
  glVertex3f(cos(w2 / 180 * Pi) * ra, sin(w2 / 180 * Pi) * ra, 0);
  glEnd();
 
end;
 
// Als Beispiel
  if winkel < 180 then begin
    glRotatef(winkel / 10, 0.0, 0.0, 1.0);
  end else begin
    glRotatef(180 / 10 - (winkel / 10 - 180 / 10), 0.0, 0.0, 1.0);
  end;
  Arc(radR * 1.2, radR * 1.4, 60, 10); // deutet eine Schwinge an
PS: Bei Kreissegment hatte sich noch einen kleinen Fehler eingeschlichen.

Code: Alles auswählen

  until w2 > w;
  w2 := 0;
// Sollte so sein:
  w2 := w;
Am Anhang eine Demo.
Dateianhänge
OpenGL_Rad.zip
(126.95 KiB) 56-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 »

Warum sieht das Alles bei Dir immer so einfach aus?
Ich hatte mir einen Kreis, zu Fuß, gebastelt und wollte daraus einen Kreisbogen stricken:

Code: Alles auswählen

procedure TSteuerung.Schwinge;
     var
     i, res: integer;
     x, y, rd : single;
   begin
 RES:=360;
 rd:=IAA/100;
        glLineWidth(3);
        glColor3f(0,0,0);
   for i := 0 to res -1 do
   begin
    glBegin(GL_LINE_LOOP);
    x :=IAB+  sin(DegToRad(i*360 / res))*rd;
    y :=IAC+  cos(DegToRad(i*360 / res))*rd;
        glVertex3f(x,Y,-0.03);
        end;
        glEnd;
 end;                              
Dein Beispiel muss ich mir genauer ansehen.

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 »

Irgendwie sieht dein Code komisch aus.
RES ist 360 und unten hast du i * 360 / RES.

Anstelle von GL_LINE_LOOP habe ich alles aus Dreiecken und Rechtecken gezeichnet.
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 »

Stimmt, sieht komisch aus. RES ist die Anzahl der Liniensegmente von einer vollen Umdrehung = 360°.
Wenn da 360 drin steht kommt natürlich 1 raus, also eine Teillinie für 1° des Kreises.
Ich hätte vielleicht, vor dem Einstellen, einen anderen Wert nehmen sollen.
Es funktioniert aber, auch wenn es nicht so elegant ist wie bei Dir.

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 »

Ich habe mir deinen Code nochmal angeguckt, da hat es noch einen gröberen Fehler verbaut.

Code: Alles auswählen

  for i := 0 to res - 1 do begin
    glBegin(GL_LINE_LOOP);
    x := IAB + sin(DegToRad(i * 360 / res)) * rd;
    y := IAC + cos(DegToRad(i * 360 / res)) * rd;
    glVertex3f(x, Y, -0.03);
  end;
  glEnd;
Das glBegin muss ausserhalb der for-to Schleife sein, so wie das glEnd.

Code: Alles auswählen

  glBegin(GL_LINE_LOOP);
  for i := 0 to res - 1 do begin
    x := IAB + sin(DegToRad(i * 360 / res)) * rd;
    y := IAC + cos(DegToRad(i * 360 / res)) * rd;
    glVertex3f(x, Y, -0.03);
  end;
  glEnd;
Komisch, das dies überhaupt funktioniert hat.
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 hatte viel ausprobiert und wahrscheinlich vergessen das zu korrigieren.
Erstaunlich, dass dieser Code funktioniert hat. Ich sollte mehr Aufmerksamkeit aufbringen bevor ich hier was einstelle.
Jetzt hab ich mich aus Deinen Beispielen bedient und das gebastelt:

Code: Alles auswählen

procedure TSteuerung.Schwinge;
   var
  Res: integer;               // Auflösung
  ri,ra :single;
  w,w2,wa,we: single;
begin
  Res:= 10;
  w:= 40  ;//SWWL;            // Winkel Schwingenbogen
  wa:= 180-(w/2);             // Winkel Schwingenbogen Anfang
  we:= 180+(w/2);             // Winkel Schwingenbogen Ende
  ri:= Mathe.RAB-IAA/70;      // Radius Schwingenbogen innen
  ra:= Mathe.RAB+IAA/70;      // Radius Schwingenbogen aussen
  glBegin(GL_QUAD_STRIP);
  w2 := wa;
  repeat
    w2 += Res;
    glVertex3f(cos(w2 / 180 * Pi) * ri, sin(w2 / 180 * Pi) * ri, 0);
    glVertex3f(cos(w2 / 180 * Pi) * ra, sin(w2 / 180 * Pi) * ra, 0);
  until w2 = we;
  w2 := we;
  glVertex3f(cos(w2 / 180 * Pi) * ri, sin(w2 / 180 * Pi) * ri, 0);
  glVertex3f(cos(w2 / 180 * Pi) * ra, sin(w2 / 180 * Pi) * ra, 0);
  glEnd();
  Lager(2);                   // Mittelpunkt Schwingenkreis
  end;                                   
Muss nur noch rausfinden warum das letzte (erste?) Segment nicht gezeichnet wird.
Ansonsten funktioniert das bestens. Außerdem kommt mir "GL_QUAD_STRIP" sehr entgegen.
So hab ich auch gleich die gewünschte Kontur.
Ich hab noch viel zu lernen.
Danke
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 »

Muss nur noch rausfinden warum das letzte (erste?) Segment nicht gezeichnet wird.
Ganz einfach, ich habe etwas übersehen. :oops:

Code: Alles auswählen

    w2 += Res;
    glVertex3f(cos(w2 / 180 * Pi) * ri, sin(w2 / 180 * Pi) * ri, 0);
    glVertex3f(cos(w2 / 180 * Pi) * ra, sin(w2 / 180 * Pi) * ra, 0);
Zuerst zeichnen, dann addieren, somit war alles um 10° verdreht.

Code: Alles auswählen

    glVertex3f(cos(w2 / 180 * Pi) * ri, sin(w2 / 180 * Pi) * ri, 0);
    glVertex3f(cos(w2 / 180 * Pi) * ra, sin(w2 / 180 * Pi) * ra, 0);
    w2 += Res;    
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 »

Ich habe die Schwinge noch optimiert, jetzt gibt es eine Start und End-Winkel.
aufl ist, wie viele Sektoren es hat, bezogen auf einen Vollkreis.

Ich würde mich noch angewöhnen, die Variablen der Procedure zu übergeben, anstelle in der Procedure globale Variablen zu verwenden.
Vielleicht brauchst du zwei oder mehrere Schwingen.

Code: Alles auswählen

procedure TForm1.Arc(ri, ra, wa, we: single; aufl: integer);
 
  procedure CalcAndDraw(w: single);
  var
    c, s: single;
  begin
    c := cos(w / 180 * Pi);
    s := sin(w / 180 * Pi);
    glVertex3f(c * ri, s * ri, 0);
    glVertex3f(c * ra, s * ra, 0);
  end;
 
begin
  glBegin(GL_TRIANGLE_STRIP);
  repeat
    CalcAndDraw(wa);
    wa += 360 / aufl;
  until wa > we;
  CalcAndDraw(we);
  glEnd();
end;    
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,
bei den Parametern des Schwingenbogens bin ich auf externe Variablen angewiesen da diese in einer anderen Unit
berechnet werden. Anfang und Ende mache ich dann selbst. (siehe mein Code-Beispiel)
Danke für die Hilfe mit der Korrektur (Zuerst zeichnen, dann addieren..). Das hat mir einige Zeit gespart.
Jetzt muss ich erstmal einige alte Fehler beheben die durch die Umstellung entstanden sind. Durch den Spaß am
OpenGL hatte ich das etwas verdrängt. Bevor sich nun das Chaos nun zu groß wird muss erst einmal Ordnung geschaffen
werden. Viele alte Variablen werden ja auch gar nicht mehr benötigt.
Dein letztes Beispiel "Arc" ist sehr interessant.

Grüße
Hannes

Antworten