Animation erstellen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Mathias
Beiträge: 6955
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 Deinen Code eingefügt. Nun kann ich auch ein Quadrat welches mit dem Lazarus-Icon (mehrfach) gefüllt ist sehen.
Somit bist du ein sehr grosses Stück weiter gekommen.
Allerdings hat sich etwas an der Skalierung meines Fensters geändert. Das Rad ist "nicht mehr rund".
Alles scheini, in y, gestaucht zu sein.
Das liegt an diesen beiden Zeilen, ich habe dies nur eingefügt, das ich sicher sein kann, das du ein Rechteck sieht.

Code: Alles auswählen

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
Die kannst du getrost weglassen. aber dann müssen die Masse in meinem Rechteck proportional zu deiner Animation sein.
Du kann die 0.8 in glVertex3f zB. durch deinen Treibrad-Durchmesser ersetzen (Bitte das '-' beachten). Dann sollte ein Rechteck erscheinen, das etwa so gross ist wie dein Rad.
Die Werte in glTexCoord2f lässt du am besten vorläufig unverändert.
Eigentlich wollte ich nur die Schnittflächen meines Zylinders schraffiert darstellen.
Wen du die 0.8 durch deine Masse des Zylinder ersetzt, sollte dort die Textur erscheinen.

Ich denke dies sollte dir ein bisschen weiter helfen. :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 »

Wie muss meine Texture aussehen um zu funktionieren?
Ich habe bisher nur ein bmp mit der entsprechenden Schraffur erstellt.

Ich habe nun versucht das Ganze auf meinen Zylinder anzuwenden. Dabei entsteht ein Chaos!
Hier der ursprüngliche Code zum Zylinder:

Code: Alles auswählen

procedure TSteuerung.Zylinder;
begin
    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);
    glColor3f(1,1,1);
    glVertex3f(IAA-IAJ*0.7, IAJ*0.3,-0.02);
    glVertex3f(IAA-IAJ*0.7, -IAJ*0.3,-0.02);
    glVertex3f(IAA+IAJ*0.7, -IAJ*0.3,-0.02);
    glVertex3f(IAA+IAJ*0.7, IAJ*0.3,-0.02);
            //Schieberkasten
    glColor3f(0,0,0);
    glVertex3f(IAA-IAJ*0.75,2*IAD-(IAJ/2), 0);
    glVertex3f(IAA-IAJ*0.75,IAJ/2, 0);
    glVertex3f(IAA+IAJ*0.75,IAJ/2, 0);
    glVertex3f(IAA+IAJ*0.75,2*IAD-(IAJ/2), 0);
    glColor3f(1,1,1);
    glVertex3f(IAA-IAJ*0.7,IAD+IAJ/7,-0.02);
    glVertex3f(IAA-IAJ*0.7,IAD-IAJ/7,-0.02);
    glVertex3f(IAA+IAJ*0.7,IAD-IAJ/7,-0.02);
    glVertex3f(IAA+IAJ*0.7,IAD+IAJ/7,-0.02);
    glEnd();
end;                                           
Mein Versuch das in meine Procedure einzufügen ergibt recht lustige Effekte. Natürlich müssen die Koordinaten noch angepasst werden.

Code: Alles auswählen

procedure TSteuerung.Zylinder;
begin
    glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
         // --- Textur Aktivieren
      glEnable(GL_TEXTURE_2D);
 
      glActiveTexture(GL_TEXTURE0);
      glBindTexture(GL_TEXTURE_2D, textureID0);
 
        glBegin(GL_QUADS);
        glTexCoord2f(0.0, 0.0);
        glVertex3f(-0.8, -0.8, 0);
        glTexCoord2f(1.0, 0.0);
        glVertex3f(-0.8, 0.8, 0);
        glTexCoord2f(1.0, 1.0);
        glVertex3f(0.8, 0.8, 0);
        glTexCoord2f(0.0, 1.0);
        glVertex3f(0.8, -0.8, 0);
        glEnd();
 
      glDisable(GL_TEXTURE_2D);
 
 
    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);
    glColor3f(1,1,1);
    glVertex3f(IAA-IAJ*0.7, IAJ*0.3,-0.02);
    glVertex3f(IAA-IAJ*0.7, -IAJ*0.3,-0.02);
    glVertex3f(IAA+IAJ*0.7, -IAJ*0.3,-0.02);
    glVertex3f(IAA+IAJ*0.7, IAJ*0.3,-0.02);
            //Schieberkasten
    glColor3f(0,0,0);
    glVertex3f(IAA-IAJ*0.75,2*IAD-(IAJ/2), 0);
    glVertex3f(IAA-IAJ*0.75,IAJ/2, 0);
    glVertex3f(IAA+IAJ*0.75,IAJ/2, 0);
    glVertex3f(IAA+IAJ*0.75,2*IAD-(IAJ/2), 0);
    glColor3f(1,1,1);
    glVertex3f(IAA-IAJ*0.7,IAD+IAJ/7,-0.02);
    glVertex3f(IAA-IAJ*0.7,IAD-IAJ/7,-0.02);
    glVertex3f(IAA+IAJ*0.7,IAD-IAJ/7,-0.02);
    glVertex3f(IAA+IAJ*0.7,IAD+IAJ/7,-0.02);
    glEnd();
end;                                                          
Code abzutippen reicht leider nicht. Wenn ich nur verstehen könnte wie das funktionieren soll.
Einfach nur frustrierend...

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

Re: Animation erstellen

Beitrag von Johannes »

Hab es jetzt soweit hinbekommen, dass meine Zylinderfläche eine Texture erhalten hat. Nur ist das alles Andere als die gewollte Schraffur.
Welche Größe muss das bmp mit der Texture haben?

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

Welche Größe muss das bmp mit der Texture haben?
Irgend etwas, das x² ist, zB. 16,32,64 usw.
Und achte darauf, das du die bmp als 32Bit abspeicherst.
Klar wäre eine 1Bit bmp besser, aber diese habe ich bis jetzt nicht geschafft an glTexImage2D zu übergeben.
Was noch gehen würde, wäre eine 8Bit Graustufen-Textur. Aber dazu müssen noch die Parameter in glTexImage2D geändert werden.

Ich denke deine Textur ist im Zylinder noch verzogen, oder hast du dies schon richtig hingekriegt ?
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 »

Ich kämpfe immer noch damit das richtige Format für mein Texture-Bitmap zu finden.
Entweder sehe ich gar nix auf meiner Zylinderfläche oder mein Programm endet mit einer Speicherverletzung.

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

Poste doch mal deine Textur in den Anhang, dann kann ich gucken, ob diese richtig ist.
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 »

Hier ist ein Beispiel:
Dateianhänge
Schraffur.bmp
Schraffur.bmp (347.93 KiB) 2690 mal betrachtet
Schraffur.png

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

Mit diesen Parametern müsste es gehen.

Code: Alles auswählen

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Image1.Picture.Bitmap.RawImage.Data);
Diese Textur ist aber für eine Schraffur sehr schlecht geeignet, siehe Vergrösserung im Anhang.
Das Bild kann natürlich viel kleiner sein, 3-4 Linien sollten vorig reichen, da man die Texturen nebeneinander legen kann, siehe Logo von meinem Textur-Demo.

Mit dem einfachen Paint von Windows sollte es kein Problem sein eine geeignet Textur zu erstellen,
Dateianhänge
Zwischenablage-1.jpg
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Die Schraffur kannst gut auch selbst rasch zur Laufzeit erstellen.

Code: Alles auswählen

function CreateBitmap: TBitmap;
begin
  Result := TBitmap.Create;
  with
    Result do begin
    Width := 16;
    Height := 16;
    with Canvas do begin
      Pen.Color := clWhite;
      Brush.Color := clWhite;
      Rectangle(0, 0, Result.Width, Result.Height);
      Pen.Color := clBlack;
      Line(0, 0, Result.Width, Result.Height);
    end;
  end;
end; 
Das laden der Textur sieht dann so aus:

Code: Alles auswählen

    glGenTextures(1, @textureID0);
    glBindTexture(GL_TEXTURE_2D, textureID0);
 
    bit := CreateBitmap;
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, bit.Width, bit.Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, bit.RawImage.Data);
    bit.Free; // Temporäre Bitmap wieder frei geben.
 
    // Dies habe ich ausgeklammert, das die Schraffur mit einer Kantenglättung erscheint.
    //    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    //    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
    glGenerateMipmap(GL_TEXTURE_2D);   
Evtl. musst du noch die Textur richtig scalieren mit:

Code: Alles auswählen

  glMatrixMode(GL_TEXTURE);  // Textur Scalieren
  glLoadIdentity();
  //  glScalef(0.02, 0.02, 1.0);
  glScalef(50, 50, 1.0); 
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 »

Nochmals vielen Dank!
Um mal wieder etwas selbst zu machen habe ich mich, zur Erholung vom Thema Texturen in OpenGL, einer schon längst überfälligen Aufgabe zugewandt.
Um die Bedeutung der Eingaben in meinem Programm zu zeigen habe ich eine kleine Procedure gebastelt. Wenn das entsprechende TEdit den Focus hat werden Pfeile zu den Positionen eingeblendet.

Code: Alles auswählen

procedure TSteuerung.Bemassung(xa, ya, xe, ye, Breite: single);
var
  B, l, w: double;
begin
  B := Breite * SCLF;
  l := sqrt(sqr(xe - xa) + sqr(ye - ya));
  Edit1.Text := FloatToStr(l);
  if xe = xa then
  begin
    w := 90;
  end
  else
  begin
    if ye = ya then
    begin
      w := 0;
    end
    else
    begin
      w := (arccos((sqr(ye - ya) - sqr(l) - sqr(xe - xa)) / (-2 * l * (xe - xa)))) /
        Pi * 180;
    end;
  end;
  glPushMatrix;
  glTranslatef(xa, ya, -0.5);
  glRotatef(w, 0, 0, 1);
  glBegin(GL_QUADS);
  glColor3f(1, 0.5, 0);
  glVertex3f(B * 6, B, 0);
  glVertex3f(B * 6, -B, 0);
  glVertex3f(l - B * 6, -B, 0);
  glVertex3f(l - B * 6, B, 0);
  glEnd();
  glBegin(GL_TRIANGLES);
  glVertex3f(B * 6, -B * 2, 0);
  glVertex3f(B * 6, B * 2, 0);
  glVertex3f(0, 0, 0);
  glEnd();
  glBegin(GL_TRIANGLES);
  glVertex3f(l - B * 6, -B * 2, 0);
  glVertex3f(l - B * 6, B * 2, 0);
  glVertex3f(l, 0, 0);
  glEnd();
  glPopMatrix;
end;                                   
Mit dem Ergebnis bin ich recht zufrieden.
Außerdem wurde es höchste Zeit mal wieder eigene Ideen umzusetzen.
Zuletzt geändert von Johannes am Sa 2. Apr 2016, 11:44, insgesamt 1-mal geändert.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Animation erstellen

Beitrag von Komoluna »

Wusstest du, dass wenn man in Lazarus im Quelltext Editor Strg + D drückt, man den Code automatisch formatieren kann?
Ich finde das macht den Code wesentlich lesbarer und übersichtlicher. In den Einstellungen von Lazarus kann man unter "JFC-formatter" auch anpassen was man unter "formatiertem" Code versteht.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

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

Schön, das bei dir auch mal etwas auf Anhieb läuft. :D

Kannst du mir sagen, wie das kleine Stück, zwischen Schieber-Stange-Kreuzkopf und Schieberschubstange heisst ?
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 »

Das mit dem automatischen Formatieren war mir tatsächlich neu. Danke!

Welches "kleine Stück" meinst Du ?
Hier: http://dlok.dgeg.de/115.htm sind eigentlich alle Komponenten zu sehen.

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

Diese Tafel habe ich für mich benutzt, nur sehe ich keine Bezeichnung für das kleine Stück zwischen 15 und 26.
Das mit dem automatischen Formatieren war mir tatsächlich neu. Danke!
Das ist ein praktische Sache, die benutzte ich auch regelmässig, auch wen sie nicht perfekt ist.
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 »

Das Stück zwischen 15 und 26 ist das obere Ende des Voreilhebels.
Bitte nicht diesen "Kreuzkopf"(ist für die Führung der Schieberstange da) mit dem eigentlichen Kreuzkopf verwechseln.

Antworten