Animation erstellen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Animation erstellen

Beitrag von Johannes »

So funktioniert es jetzt:

Code: Alles auswählen

procedure TSteuerung.Schwingenwinkel(rg,sx,sy,ex,sa,bs:single);
          //rw=Winkel,rg=Radius Gegenkurbel,sx=Schwingenlager x,sy=Schwingenlager y,
          //ex=Exenterstange,sa=Anlenkung, bs=Backset
      var   c,w,zx,zy,a :single;
        begin
          a:= -sa;
         zx := cos(gkw) *(rg);
         zy := sin(gkw) *(rg);
                    // Abstand zwischen Gegenkurbelzapfen und Schwingenlager
         c := sqrt(sqr(zy - sy) + sqr(sx - zx));
                    // Winkel c
         w:=arcsin((-zy+sy)/c)/ pi * 180;
                    // Winkel Exenterstange  (Pleuel_W)
         SWEX:=(arccos((-sqr(a)+sqr(ex)+sqr(c))/(2*ex*c)))/Pi*180-w;
                    // Winkel Schwinge (Schwinge_W)
         SW:=180.0-(arccos((-sqr(ex)+sqr(a)+sqr(c))/(2*a*c)))/ pi * 180+w+90;
         end;                                                                      
Jetzt muss ich "nur" noch das Backset (Versatz des Anlenkpunktes auf der X-Achse) einbauen.
Die Exenterstange passt endlich auch.

Mathias
Beiträge: 6917
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 unterdessen einen Zylinder und ein Schieber eingebaut, der Schieber läuft Zeit-versetzt.

So funktioniert es jetzt:
Schön das es hingekriegt hast, manchmal kann man üben, bis es einen frustet.
Dateianhänge
OpenGL_Rad.zip
(131.66 KiB) 62-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 »

Ist ja irre! Ich quäle mich hier langsam vorwärts und von Dir kommt schon wieder, so ganz nebenbei, eine neue Erweiterung.
Ähnlich will ich das auch einmal darstellen. Zur Auswertung wollte ich dann Chart-Komponenten vom Lazarus benutzen. Bis dahin wird aber noch einige Zeit vergehen.

Mathias
Beiträge: 6917
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 eine interessante Seite über das Gestänge gefunden, das sieht man wenigsten ,mal, wie die einzelnen Teile heissen.
Zum Teil habe ich Fantasie-Namen im meinem Programm.

https://www.themt.de/org-0015-49.html
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 »

Es freut mich, dass ich Dein Interesse geweckt habe.
Deine "Phantasienamen" kenne ich mittlerweile ganz gut.

Hab mir eine böse Grippe eingefangen. Mit Fieber und Kopfweh macht es keinen Sinn sich mit dem Programm zu beschäftigen.
Es ist leider eine Zwangspause nötig.
Mal sehen was morgen der Doc dazu sagt..

Gruß
Hannes

Mathias
Beiträge: 6917
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 »

Doppel Post
Zuletzt geändert von Mathias am Di 15. Mär 2016, 19:46, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6917
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 mir eine böse Grippe eingefangen. Mit Fieber und Kopfweh macht es keinen Sinn sich mit dem Programm zu beschäftigen.
Dann gute Besserung.
Deine "Phantasienamen" kenne ich mittlerweile ganz gut.
Aber es wird besser werden. :wink:

Den Knie-Hebel (TSchwinge) habe ich noch angepasst, jetzt kann man sagen, auf welcher Seite er ist.

Code: Alles auswählen

procedure TSchwinge.SetParam(Rad_W: single; Rad_R, Schwinge_x, Schwinge_y,
  Pleuel_L, Schwinge_L: single; Invert: boolean);
(*  @Rad_W:           Winkel, des Excenter, des Rades.
    @Rad_R:           Distanz, Rad-Zentrum bis Excenter.
    @Schwinge_x / y:  Drehpunkt der Schwinge.
    @Pleuel_L:        Länge des Pleuels, vom Rad-exenter bis Schwinge-Ende, im Beispiel Verbindung der blauen und grünen Stange.
    @Schwinge_L:      Distanz, Drehpunkt-Schwinge bis Pleuelbefestigung.
    @Invert:          Rechnet seitenverkehrt.
*)
 
var
  c,           // Ist der Abstand zwischen dem Radexcenter und dem Zentrum der Schwinge.
  w: single;   // Ist der Winkel von C   ( Ister der Winkel von c, wen die eine Linie wäre.
begin
  RadExzenter := Trigo.Alpha_c_To_xy(Rad_W, Rad_R);
  c := sqrt(sqr(RadExzenter.y - Schwinge_y) + sqr(Schwinge_x - RadExzenter.x));
  w := arcsin((-RadExzenter.y + Schwinge_y) / c) / Pi * 180.0;
 
  if Invert then begin
    Pleuel_W := w - Trigo.a_b_c_To_Beta(Pleuel_L, Schwinge_L, c);
    Schwinge_W := w + Trigo.a_b_c_To_Alpha(Pleuel_L, Schwinge_L, c) + 180;
  end else begin
    Pleuel_W := w + Trigo.a_b_c_To_Alpha(Schwinge_L, Pleuel_L, c);
    Schwinge_W := w - Trigo.a_b_c_To_Beta(Schwinge_L, Pleuel_L, c) + 180;
  end;
 
end;      
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6917
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 den Kniehebel in eine separaten record gepackt. Auch hatte die Kniehebelberechnung noch einen Fehler gehabt.
Wen die Dreieckseite a kleiner 0 wurde, war der Winkel um 180° versetzt.

Code: Alles auswählen

{ TKniehebel }
 
procedure TKniehebel.SetParam(Point1, Point2: TPointF; Stange1_L, Stange2_L: single; reverse: boolean);
var
  c,             // Ist der Abstand zwischen dem Radexcenter und dem Zentrum der Schwinge_xy.
  w_c: single;   // Ist der Winkel von C   ( Ister der Winkel von c, wen die eine Linie wäre.
begin
  c := Trigo.a_b_To_c(Point1.y - Point2.y, Point2.x - Point1.x);
 
  if Point1.x < Point2.x then begin
    w_c := Trigo.a_c_To_Alpha(Point2.y - Point1.y, c);
  end else begin
    w_c := Trigo.a_c_To_Alpha(Point1.y - Point2.y, c) - 180;
  end;
 
  Write(w_c: 40: 4);
  //  w_c := Trigo.a_c_To_Alpha(Point2.y - Point1.y, c);
 
  if reverse then begin
    Stange1_W := w_c - Trigo.a_b_c_To_Beta(Stange1_L, Stange2_L, c);
    Stange2_W := w_c + Trigo.a_b_c_To_Alpha(Stange1_L, Stange2_L, c) + 180;
  end else begin
    Stange1_W := w_c + Trigo.a_b_c_To_Alpha(Stange2_L, Stange1_L, c);
    Stange2_W := w_c - Trigo.a_b_c_To_Beta(Stange2_L, Stange1_L, c) + 180;
  end;
 
end;
 
{ TSchwinge }
 
procedure TSchwinge.SetParam(Rad_W, Rad_R: single; Schwinge_xy: TPointF; Pleuel_L, Schwinge_L: single; reverse: boolean);
(*  @Rad_W:           Winkel, des Excenter, des Rades.
    @Rad_R:           Distanz, Rad-Zentrum bis Excenter.
    @Schwinge_x / y:  Drehpunkt der Schwinge.
    @Pleuel_L:        Länge des Pleuels, vom Rad-exenter bis Schwinge-Ende, im Beispiel Verbindung der blauen und grünen Stange.
    @Schwinge_L:      Distanz, Drehpunkt-Schwinge bis Pleuelbefestigung.
    @reverse:         Rechnet seitenverkehrt.
*)
 
var
  KnieHbl: TKniehebel;
begin
  RadExzenter := Trigo.Alpha_c_To_xy(Rad_W, Rad_R);
 
  KnieHbl.SetParam(RadExzenter, Schwinge_xy, Pleuel_L, Schwinge_L, reverse);
  Pleuel_W := KnieHbl.Stange1_W;
  Schwinge_W := KnieHbl.Stange2_W;
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 »

Jetzt muss ich aber schnell wieder fit werden sonst bist Du mit meiner Animation schneller fertig. :)
Vielen Dank. Du hast mir schon so viel geholfen.
So richtig beschäftigen kann ich mich damit leider noch nicht.

Mathias
Beiträge: 6917
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 »

Wen ich folgenden Code ausführe, wird die Stange nur an der echten Seite des Rades gezeichnet.
Somit nur in einem Bereich von 180°

Code: Alles auswählen

function TTrigo.a_b_To_Alpha(a, b: single): single;
begin
  Result := arctan(a / b);
  if grad then begin
    Result := Result / pi * 180;
  end;
end;
 
function TTrigo.a_b_To_Beta(a, b: single): single;
begin
  Result := arctan(b / a);
  if grad then begin
    Result := Result / pi * 180;
  end;
end;   
 
------
    glRotatef(Trigo.a_b_To_Alpha(ExzenterSchubstange_xy.x,ExzenterSchubstange_xy.y), 0,0,1);
    Pleuel.Draw;
    glLoadIdentity();
 
    glRotatef(Trigo.a_b_To_Beta(ExzenterSchubstange_xy.x,ExzenterSchubstange_xy.y), 0,0,1);
    Pleuel.Draw;
    glLoadIdentity();  
Wieso dies so ist, ist hier im unteren drittel beschrieben: http://www.mathe-online.at/mathint/wfun/i.html
Wie Sinus und Cosinus sind Tangens und Cotangens periodische Funktionen; allerdings ist die Periode für sie kürzer − sie beträgt 180°:

tan(α + 180°) = tan α
cot(α +180°) = cot α.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6917
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 »

Nun kann die Lok jetzt vorwärts und rückwärts fahren, und gleichzeitig hat der Schieber-Zylinder immer einen Vorlauf.
Wen ich es richtig sehe, dient die Schwinge dazu, das die Schieber immer einen Vorlauf hat, egal ob die Lok vorwärts oder rückwärts fährt, sie inkrementiert den Vorlauf des Schiebers.
Man kann ja nicht einfach den Exzenter für den Schieber, auf dem Treibrad rasch an einen anderen Ort fixieren.
Dateianhänge
OpenGL_Rad.zip
(132.03 KiB) 71-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 »

Der Vorlauf des Schiebers ist, in Grenzen, in beiden Fahrtrichtungen beabsichtigt und wird durch den Winkel der Gegenkurbel (2.Exenter am Rad) bestimmt.
Dein neues Beispiel ist mir eine große Hilfe!
Ich bin zwar noch nicht richtig fit aber ein wenig habe ich doch geschafft. Alles was zur Schwinge gehört funktioniert nun in einer eigenen procedure:

Code: Alles auswählen

procedure TSteuerung.Schwingenwinkel(trw,rg,sx,sy,ex,sa,bs,bsw,nw,st,ssm,gk1,gk2,Hub:single);
 //trw=Winkel Treibrad,rg=Radius Gegenkurbel,sx=Schwingenlager x,sy=Schwingenlager y,
 //ex=Exenterstange,sa=Anlenkung,bs=Backset,bsw=Backsetwinkel,nw=Neigungswinkel,
 //st=Schwingenstange,ssm=Schwingenstein max.,gk1/gk2=Gegenkubel,Hub
      var   c,w,zx,zy,a,GKW1,GKW2 :single;
        begin
          a:= -sqrt(sqr(bs)+sqr(sa));
         zx := cos(gkw) *(rg);
         zy := sin(gkw) *(rg);
                    // Abstand zwischen Gegenkurbelzapfen und Schwingenlager
         c := sqrt(sqr(zy - sy) + sqr(sx - zx));
                    // Winkel c
         w:=arcsin((-zy+sy)/c)/ pi * 180;
                    // Winkel Exenterstange  (Pleuel_W)
         SWEX:=(arccos((-sqr(a)+sqr(ex)+sqr(c))/(2*ex*c)))/Pi*180-w;
                    // Winkel Schwinge (Schwinge_W)
         SW:=180.0-(arccos((-sqr(ex)+sqr(a)+sqr(c))/(2*a*c)))/ pi * 180+w+90;
         SW:=SW+bsw;// Addition Backsetwinkel
         SW:=SW+nw; // Addition Neigungswinkel
                    // Schwingenbogen Länge
       SWWB:=RadToDeg(2*(arcsin(sa*sin(90)/st)));
                    // Winkel Auslenkung Schwingenstein max.
       SWWS:=RadToDeg((arcsin(ssm*sin(90)/st))*2);
                    // Winkel Auslenkung Schwingenstein
       SWSPW:=RadToDeg((arcsin(SWSP*sin(90)/st))*2);
                    // Winkel Gegenkurbelexenter
  GKW1:=Arccos((sqr(gk1)-sqr(rg)-sqr(Hub/2))/(-2*Hub*(Hub/2)));
  GKW2:=Arccos((sqr(gk2)-sqr(rg)-sqr(Hub/2))/(-2*Hub*(Hub/2)));
                    // Position Schwingenstein
  SWSP:=  TrackBar1.Position/100;
                    // Steuerungsart
  if ChBSteuerunsart.checked then begin
           GKW:=(trw+GKW2);
           GKL:= gk2;
        end else begin
           GKW:=(trw-GKW1);
           GKL:= gk1;
        end;
           end;                                                   
Habe nicht mit Kommentaren gespart damit man auch nachvollziehen kann was ich da verbrochen habe.
Wahrscheinlich könnte man die Formeln noch kürzen aber ich bin, als Mathe-Null, sehr zufrieden, dass der Kram so funktioniert.
Gruß und Dank
Hannes

Mathias
Beiträge: 6917
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 bin an der Lösung recht nahe gekommen, ich denke wen die Länge der Stangen stimmen würde, dann wäre es recht realistisch.
Als Schwinge habe ich eine blaue Stange missbraucht.
Dateianhänge
OpenGL_Rad.zip
(132.74 KiB) 64-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,
Du bist der Lösung sogar sehr nahe gekommen. Dein Beispiel sollte ausreichen um alle noch anstehenden Fragen bezüglich der Animation zu beantworten. Sogar der Voreilhebel funktioniert!
Mir hilft es, mal wieder, sehr. Allerdings muss ich Deinen Programmcode erst nachvollziehen können und das wird erst funktionieren wenn ich wieder fieberfrei bin.
Momentan kann ich mich ganz schlecht darauf konzentrieren.
Deine Kommentare enthalten jetzt ja auch schon richtige Bezeichnungen. Interessiert Dich das Thema selbst oder liegt das an Deiner großen Hilfsbereitschaft ?

Dankbare Grüße

Hannes

Mathias
Beiträge: 6917
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 »

und das wird erst funktionieren wenn ich wieder fieberfrei bin.
Das hat es dich anscheinend recht erwischt, mit Fieber geht wirklich nichts.

Jetzt bin ich am basteln, weil der Schieber einen minimal Hub braucht, jetzt habe ich fast 2h geübt, aber ich bin leider nicht viel weiter gekommen.
Sehr wahrscheinlich ist es etwas sehr kleines.
Der Hänge-hebel kann man jetzt stufenlos verstellen.
Dateianhänge
OpenGL_Rad.zip
(133.02 KiB) 66-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten