Animation erstellen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
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 »

Leider kann ich von Deinem Webspace keine Dateien öffnen/speichern.
Bei mir geht es, sogar vom Firmen PC aus, aber es wäre vielleicht besser, wen ich es als ZIP speichere, sonst muss man jede Datei einzeln holen.
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 lag wohl an mir, jetzt kann ich Deine Dateien, allerdings einzeln, laden. Danke.

Um mal wieder ein Efolgserlebnis zu haben wollte ich die Schnittflächen meines Zylinders schraffiert darstellen. Dazu habe ich versucht eine Textur zu laden. Einige Tutorials habe ich dazu gelesen aber, nach einigen Stunden, habe ich nun aufgegeben. Benutzt hatte ich die "glBitmap.pas" und auch "Textures.pas" zum Laden.

Ein weiterer Versuch meine Eingaben mit Records zu ordnen scheitert ebenso an meinem Unwissen.
Hier geht es nur um das dynamische erstellen von Komponenten,
Mit ein bisschen Änderung kann man dies auch auf TEdit und TLabel anwenden.
Kannst Du mir dazu vielleicht einen Tipp geben?
Es ist frustrierend aber momentan geht gar nix mehr bei mir weiter. Vielleicht sollte ich mir doch eine andere Freizeitbeschäftigung suchen.

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 »

Einige Tutorials habe ich dazu gelesen aber, nach einigen Stunden, habe ich nun aufgegeben.
Ich wies wie dies mit den Tutorials ist, zum Teil viel zu kompliziert.
Einfache Beispiele sin viel mehr wert.
Benutzt hatte ich die "glBitmap.pas" und auch "Textures.pas" zum Laden.
Der Umweg über diese Units kannst du dir sparen, der einfachsten Weg ist es, eine Images direkt in den Textur-Puffer zu schreiben, siehe Anhang.
Bei gedrückter ToggleBox dreht sich ein einfaches Rechteck mit einer Textur.
Da deine Animation aber nur in 2D ist, hast du es mit den Textur-Koordinaten sehr einfach, man kann einfach die x und y Punkte des Meshes übernehmen.
Dies wird in Arc mit der procedure gl(x,y) demonstriert.

Was noch wichtig ist, wen man Texturen und farbige Dreicke mischt, das man mit glEnable(GL_TEXTURE_2D) und glDisable(GL_TEXTURE_2D) den Textur Modus ein und aus schaltet.

Ich hoffe die Demo bringt dich weiter.
Es ist frustrierend aber momentan geht gar nix mehr bei mir weiter. Vielleicht sollte ich mir doch eine andere Freizeitbeschäftigung suchen.
Nur nicht den Kopf hängen lassen, aller Anfang ist schwer.
Ich bin bei gewissen Sachen auch schon fast die Wände hoch gegangen. :wink:
Dateianhänge
Texturen.zip
(197.8 KiB) 94-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 »

Vielen Dank für das Beispiel und den Zuspruch.

Woher kommt die Textur ? (im Beispiel scheint es das Lazarus-Icon zu sein?)
"Image1.Picture.Bitmap" kann ich nicht finden.
Meine Textur muss doch erst einmal irgendwo als bmp,jpg,png o.ä. vorhanden sein.

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 »

"Image1.Picture.Bitmap" kann ich nicht finden.
Es ist ein bisschen blöd, das TImages versteckt sich unter dem OpenGLControl, im Objectinspektor sieht man es auf Anhieb.
Natürlich kann man auch ein TBitmap oder TPicture nehmen, alles was ein TRawImages hat und 24 oder 32 Bit ist.
Die Textur-Masse müssen x² sein, zB. 256,515,1024, etc.

Auch ist eine 32Bit-Images erforderlich, ansonsten muss man folgende Zeile anpassen.

Code: Alles auswählen

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Image1.Picture.Bitmap.RawImage.Data);
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 »

im Objectinspektor sieht man es auf Anhieb.
Wahrscheinlich bin ich zu blöd. Ich finde leider nix.

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

Re: Animation erstellen

Beitrag von Johannes »

Ich war zu schnell. Sorry, hab es gefunden.
Meine Nerven sind auch nicht mehr die besten!
Entschuldigung!

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 »

Wahrscheinlich bin ich zu blöd. Ich finde leider nix.
Es müsste unter Form1 und oberhalb OpenGLControl sichtbar sein.

Ich habe noch Lade-Routine von mir gefunden, diese sollte so ziemlich alles unterstützen, welches 24/32 Bit hat.
Evtl. gehen auch 8Bit Images., da Lazarus diese in 24/32 Bit umwandelt.
Monochrom geht nicht, ausser 8Bit grau stufen Bilder.

Code: Alles auswählen

function LoadTexture(RawImage: TRawImage): GLuint;
type
  TLookUpTableEntry = packed record
    Description: packed record
      Bits,
      RPrec, RShift,
      GPrec, GShift,
      BPrec, BShift,
      APrec, AShift: byte;
    end;
    GLformat: packed record
      InternalFormat: GLint;
      Format: GLenum;
      DataFormat: GLenum;
    end;
  end;
 
const
  FORMAT_LUT: array[0..5] of TLookUpTableEntry = (
 
    // 32Bit mit Alpha
    (Description: (Bits: 32; RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 8; AShift: 24);
    GLformat: (InternalFormat: GL_RGBA8; Format: GL_BGRA; DataFormat: GL_UNSIGNED_BYTE)),
 
    // 32Bit mit Alpha ( Linux / Unit BGRABitmap )
    (Description: (Bits: 32; RPrec: 8; RShift: 0; GPrec: 8; GShift: 8; BPrec: 8; BShift: 16; APrec: 8; AShift: 24);
    GLformat: (InternalFormat: GL_RGBA8; Format: GL_RGBA; DataFormat: GL_UNSIGNED_BYTE)),
 
    // 32Bit ohne Alpha
    (Description: (Bits: 32; RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 24);
    GLformat: (InternalFormat: GL_RGB8; Format: GL_BGRA; DataFormat: GL_UNSIGNED_BYTE)),
 
    // 32Bit ohne Alpha ( Linux JPG )
    (Description: (Bits: 32; RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 0);
    GLformat: (InternalFormat: GL_RGB8; Format: GL_BGRA; DataFormat: GL_UNSIGNED_BYTE)),
 
    // 8Bit 256 Graustufen
    (Description: (Bits: 8; RPrec: 8; RShift: 0; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 24);
    GLformat: (InternalFormat: GL_Luminance; Format: GL_Luminance; DataFormat: GL_UNSIGNED_BYTE)),
 
    //// 1Bit Monochrom      geht nicht
    //(Description: (Bits: 1; RPrec: 1; RShift: 0; GPrec: 1; GShift: 0; BPrec: 1; BShift: 0; APrec: 0; AShift: 0);
    //GLformat: (InternalFormat: GL_RGB; Format: GL_COLOR_INDEX; DataFormat: GL_BITMAP)),
 
    //// 1Bit Monochrom PNG   geht nicht
    //(Description: (Bits: 1; RPrec: 1; RShift: 0; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 24);
    //GLformat: (InternalFormat: GL_RGB; Format: GL_COLOR_INDEX; DataFormat: GL_BITMAP)),
 
    // 24Bit
    (Description: (Bits: 24; RPrec: 8; RShift: 16; GPrec: 8; GShift: 8; BPrec: 8; BShift: 0; APrec: 0; AShift: 0);
    GLformat: (InternalFormat: GL_RGB8; Format: GL_BGR; DataFormat: GL_UNSIGNED_BYTE)));
 
var
  TabNr, i: integer;
begin
  TabNr := -1;
  for i := 0 to Length(FORMAT_LUT) - 1 do begin
    with RawImage.Description, FORMAT_LUT[i].Description do begin
      if (Bits = BitsPerPixel) and
        (RPrec = RedPrec) and (RShift = RedShift) and (GPrec = GreenPrec) and (GShift = GreenShift) and
        (BPrec = BluePrec) and (BShift = BlueShift) and (APrec = AlphaPrec) and (AShift = AlphaShift) then begin
        TabNr := i;
        Break;
      end;
    end;
  end;
 
  if TabNr <> -1 then begin
    glGenTextures(1, @Result);
    glBindTexture(GL_TEXTURE_2D, Result);
    with RawImage.Description, FORMAT_LUT[TabNr].GLformat do begin
      glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, Width, Height, 0, Format, DataFormat, RawImage.Data);
      //      glTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, Width, Height, 0, Format, GL_UNSIGNED_INT_8_8_8_8_REV, RawImage.Data);
    end;
    glGenerateMipmap(GL_TEXTURE_2D);
  end else begin
    ShowMessage('Undefiniertes Format');
    Result := 0;
  end;
end; 
Der Auffruf geht zB. so:

Code: Alles auswählen

var
   TexID: GLuint;    
 
 
TexID := LoadTexture(Image1.Picture.Bitmap.RawImage);   
glBindTextur geht gleich wie im obigen Beispiel.
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 dafür.

Sobald ich:
glEnable(GL_TEXTURE_2D);
die Texture freigebe ist mein Bildschirm komplett weiß (leer). Ich habe praktisch das funktionierende Beispiel in mein Projekt übernommen. Was ist nun bei mir anders?

Code: Alles auswählen

    // Initialisierung
procedure TSteuerung.FormCreate(Sender: TObject);
  begin
  SWWG:=0;
  SWWB:=30;
 
  InitOpenGL;
  OpenGLControl1.MakeCurrent;
  ReadExtensions;
  ReadImplementationProperties;
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LESS);
    // ------------ Texturen laden --------------
  with Image1.Picture.Bitmap do begin
    glGenTextures(1, @textureID0);
    glBindTexture(GL_TEXTURE_2D, textureID0);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Image1.Picture.Bitmap.RawImage.Data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glGenerateMipmap(GL_TEXTURE_2D);
  end;
 
  glEnable(GL_TEXTURE_2D);
  glMatrixMode(GL_TEXTURE);  // Textur Scalieren
  glLoadIdentity();
  glScalef(5.2, 5.2, 1.0);
 
  quadricParam := @gluNewQuadric;
  TBSpeed.Position:= 30;
  Winkel:=0;
  VOR:= true;
  BtVor.caption:= 'rückwärts';
  DoubleBuffered := true;
    end;                                              




Jetzt mag ich erst einmal nicht mehr.
So schön es sein mag OpenGL zu nutzen aber der Preis dafür ist, für Anfänger wie mich, hoch. Trotz der großen Hilfe die man hier erhält schwindet irgendwann das Selbstvertrauen und damit die Motivation wenn man sich stundenlang nur im Kreis dreht. Viele Tutorials stiften mehr Verwirrung anstatt hilfreich zu sein.

Langsam zweifel ich wirklich ob es für mich Sinn macht noch mehr Frust aufzubauen. Ohne die Hilfe vom Mathias wäre schon Feierabend.

Ich muss mal drüber schlafen...

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 »

Setzt mal mit glClearColor eine andere Farbe als weiss, wen mit den Texturen etwas nicht in Ordnung ist, werde diese Objekte auch weiss. somit unsichtbar.
Dann siehst du vielleicht auch mehr, was falsch sein kann.
Ich gucke am Abend dein Code-Schnippsel an vielleicht sehe ich noch was.
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 »

Wenn ich eine andere Farbe nehme bleibt das Fenster leer (mit der neuen Hintergrundfarbe).
Meine Animation ist nicht mehr zu sehen.

Ich bewundere Deine Geduld mit mir!

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 »

Klammere mal diese beiden Zeilen aus, dann sollte das Object zumindest in schwarz sichtbar sein.

Code: Alles auswählen

  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Diese Zeilen sinf für Alpha-Blendig ( Transparent-Effekte ). Wen in deiner Textur im Alpha-Kanal eine 0 steht, dann ist die Textur Transparent, also nicht sichtbar.

Was hast du für eine Textur genommen, das Icon von Lazarus ?
Wen es mit diesem geht, dann muss dies Zeile mit glTexImage2D...( für deine Textur angepasst werden.
Wen nicht, dann zeige mal den Code zwischen glBegin und glEnd. Stehen dort schön brav ein glTexCoord2f und ein glVertex3f ?

Probiere mal verschiedene Texturen in meinem Demo-Code aus.

Wen deine Textur nicht geht, aber das Icon von Lazarus, dann sende mir mal deine Textur und dann schaue ich welche Parameter du in glTexImage2D eintragen musst.
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 »

Wenn ich die von Dir genannten Zeilen auskommentiere wird es dunkel. Meine Animationskomponenten sind schwarz aber sichtbar.
Ich habe,erst einmal, das Lazarus-Icon, wie in Deinem Beispiel, genutzt.
Was meinst Du mit:
zeige mal den Code zwischen glBegin und glEnd
Ich habe ja, außer der Initialisierung, noch nix damit gemacht.

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 ja, außer der Initialisierung, noch nix damit gemacht.
Dann ist klar, wieso das nix kommt.

Füge mal bei deinem Code noch folgendes ein, am besten vor OpenGLControl1.SwapBuffers; , dann sollte ein Rechteck sichtbar werden.

Code: Alles auswählen

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  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);    
Und hier kannst das glEnable ausklammern.

Code: Alles auswählen

// glEnable(GL_TEXTURE_2D); // entfernen
  glMatrixMode(GL_TEXTURE);  // Textur Scalieren
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 habe Deinen Code eingefügt. Nun kann ich auch ein Quadrat welches mit dem Lazarus-Icon (mehrfach) gefüllt ist sehen.
Allerdings hat sich etwas an der Skalierung meines Fensters geändert. Das Rad ist "nicht mehr rund".
Alles scheint, in y, gestaucht zu sein.

Eigentlich wollte ich nur die Schnittflächen meines Zylinders schraffiert darstellen. Das daraus ein solcher Aufwand werden würde hatte ich nicht erwartet.
Die Schraffur ist als Bild vorhanden und sollte "nur" auf meinen Zylinder projeziert werden.

Antworten