Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion: Débuter avec OpenGL

  1. #1
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut Débuter avec OpenGL

    Bonjour à toutes et à tous,

    Là, je patauge sévère ! Je n'arrive pas à trouver de tuto tout simple pour afficher un bitmap avec OpenGL.

    Aussi, je fais appel à vous pour me mettre le pied à l'étrier : y aurait-il une bonne âme pour me créer une petite application utilisant OpenGL pour charger un fichier .bmp ou .jpg et tout simplement l'afficher.

    Merci à vous.

    Pierre

  2. #2
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Re-Salut il y a d'excellent tutoriel pour OpenGL ici, la et la
    ici, ici (en allemand, je ne retouve plus la version anglaise)

    Sous Lazarus tu peux installer le paquet "LazOpenGLContext" au moins la tu auras déja le "Viewer" tu trouveras quelques exemples fournis Menu --> Outils --> Exemples de projets et tu filtres avec "OpenGL" pour les trouver.

    Voila tu as de quoi faire

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    En voila un autre excellent an anglais et un autre en francais

    A bientôt bonne lecture
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    ... Voila tu as de quoi faire ...
    Je te remercie pour tous ces tutoriels, mais le C n'est vraiment pas ma tasse de thé.

    Par contre, vue l'ampleur des possibilités (LCL / GLFW / GLUT, BGRABitmap, que choisir), je pense que je vais plutôt m'y noyer qu'autre chose.

    Si j'ai bien compris, il faut que je charge ma carte comme une texture que j'applique sur une forme. Pour obtenir ce que je souhaite, il faut que je puisse faire glisser ma texture sur cette forme, faire tourner et zoomer cette forme. Mais là où j'ai du mal à voir ce qu'il faut faire est que cette forme, c'est mon écran de 1024 x 600 pixels² qui lui, n'est ni déplaçable, ni capable de rotation pas plus que de redimensionnement.

    Cordialement.

    Pierre

  5. #5
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Re-salut

    Que ce soit du C/C#/C++ ce n'est pas grave car les commandes OpenGL sont les même dans tous les langages.
    Le tuto en allemand (langue que je ne parle pas) est très bien fait et surtout il est orienté Lazarus.

    Si GLScene fonctionne correctement chez toi, se sera beaucoup plus facile à mettre en place
    Je viens de mettre un exemple basique

    A bientôt

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    ... tu trouveras quelques exemples fournis Menu --> Outils --> Exemples de projets et tu filtres avec "OpenGL" pour les trouver. ...
    J'ai revisité ces exemples, et je suis tombé sur celui-ci : ...\bgrabitmap-9.6.2\test\test4lcl-opengl\opengltest2 où on voit la terre grossir, rapetisser, tourner ... manquait que le déplacement. J'ai regardé le code : d'un simplicité pas croyable.

    J'ai construit un petit projet avec non plus la terre mais une de mes cartes et des curseurs pour faire grossir, rapetisser, tourner et bouger et ça tourne sous Windows et sur mon Raspberry avec une vitesse de rafraichissement de l'ordre de quelques millisecondes .

    Voilà ce que ça me coûte comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    procedure TForm1.Load;
    var
      bmp: TBGLBitmap;
    begin
      if not DataLoaded then
      begin
        bmp := TBGLBitmap.Create(ExtractFilePath(Application.ExeName) + 'Herblay.jpg'); // 1280 x 1280 pixems²
        bmp.ResampleFilter := rfBestQuality;
        Carte := bmp.MakeTextureAndFree;
     
        bmp := TBGLBitmap.Create(ExtractFilePath(Application.ExeName) + 'viseur_croix.png'); // 64 x 64 pixels²
        bmp.ResampleFilter := rfBestQuality;
        Cible := bmp.MakeTextureAndFree;
        DataLoaded := True;
      end;
    end;
     
    procedure TForm1.OpenGLControl1Paint(Sender: TObject);
    begin
      Load;
      BGLViewPort(OpenGLControl1.Width, OpenGLControl1.Height, BGRABlack);
      Carte.StretchDrawAngle(Dec0.X-Depl.X, Dec0.Y-Depl.Y, 1280*kZoom, 1280*kZoom, CapDEg, PointF(OpenGLControl1.Width / 2,OpenGLControl1.Height / 2), False);
      Cible.Draw(OpenGLControl1.Width / 2,OpenGLControl1.Height / 2, $FF);
      OpenGLControl1.SwapBuffers;
    end;
    Je n'en reviens pas.

    Cordialement.

    Pierre

  7. #7
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Excellent, je n'ai encore jamais regardé les possibilités de BGRABitmap avec OpenGL
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Apparemment, avec la bibliothèque "TBGLBitmap", j'arrive à déplacer, tourner, zoomer rapidement une image de 1280 x 1280 pixels ² (sous Windows XP et sur mon raspbery Pi 3B raspbian Stretch).

    Pourtant, cela fait deux jours que je m'arrache les cheveux (les seuls qu'il me reste)à essayer de comprendre la cohérence de ces mouvements, je m'explique :

    A l'aide d'un TrackBar, je peux faire varier l'angle de rotation de mon image.

    En déplaçant la souris sur l'image, je le déplace.

    Si j'ai une rotation nulle, lorsque j'appuie sur la souris, et que je commence à la déplacer, l'image se déplace en la suivant et ce autant de fois que je fais un cycle "Appui, Déplacement, Relâchement".

    Par contre, après avoir fait tourner mon image d'un angle quelconque, la première séquence "Appui, Déplacement, Relâchement" déplace l'image à partir du pointage de la souris, mais pour les séquences suivantes, dès que je commence le déplacement, l'image fait un saut de déplacement qui semble proportionnel au déplacement précédent avant de suivre gentiment le mouvement de la souris. Ce saut empêche de comprendre ce qu'on est en train de faire : on ne sait plus où on s'est déplacé.

    Je n'arrive pas à comprendre la logique de ce saut. J'ai essayé tout un tas de trucs pour compenser ce saut (valeurs fixes, liées trigonométriquement à l'angle, ...).

    Cela ressemble fortement à un bug, mais c'est certainement moi qui n'ai rien compris.

    Je vous joins mon Text_BGLDA.zip. Si vous arrivez à comprendre ...

    Cordialement.

    Pierre

  9. #9
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Salut Pierre

    j'ai regardé un peu. J'ai pu corriger ton erreur de déplacement mais il semble que la rotation pose problème. En faisant des va-et-vient avec le trackbar l'image tourne bien mais elle se déplace toute seule.

    J'ai essayé la rotation comme ça, mais sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Carte.DrawAngle(XX, YY, CapDeg, PointF(640,640),true); // Force le point de pivot a rester au centre de l'image. Et l'idem l'image se déplace :(
    Carte.DrawAngle(XX, YY, CapDeg);
    BGLCanvas.PutImageAngle(XX,YY,Carte,CapDeg);
    A mon avis c'est un bug interne à BGRABitmap (surement un soucis avec les matrices de transformation) Ou comme toi j'ai rien compris au "Centre de rotation". En l'état ce point de pivot ne semble pas relatif à l'image, mais à la scene. Quoi qu'il en soit l'image ne devrait pas se déplacer

    Pour ton déplacement ton erreur était dans OnMouseUp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
     
     
    procedure TForm1.ZoneAffMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      if (ssLeft in Shift) then
      begin
        Depl.X:= (CurPos0.X-X);   // Depl = déplcement de la souris en pixels  // tu va du point A (OnMouseMouve) et tu te déplaces Jusqu'au point B (de X,Y) donc pas besoin de cumulé dans OnMouseUp. Le déplacement se cumule déja ici
        Depl.Y:= (CurPos0.Y-Y);
        CurPos0.X:= X;   
        CurPos0.Y:= Y;
        ZoneAff.DoOnPaint;
      end;
    end;
     
    procedure TForm1.ZoneAffMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     
      Dec0.X:= Dec0.X-Depl.X;  
      Dec0.Y:= Dec0.Y-Depl.Y;
      //Depl.X:= 0;
      //Depl.Y:= 0;
    end;
     
     
    // Note XX et YY sont des varibales globale
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      DataLoaded := False;
      CapDeg:= 0; // Initialisation Cap
    //  sincos(DegARad*CapDeg, sinCap, cosCap);
      Org.X:= ZoneAff.Width / 2-640;
      Org.Y:= ZoneAff.Height / 2-640;
      XX := Org.X;
      YY := Org.Y;
      PivotP.X :=640;
      PivotP.Y :=640;
    end;  
     
    procedure TForm1.ZoneAffPaint(Sender: TObject);
    begin
      Load;
      BGLViewPort(ZoneAff.Width, ZoneAff.Height, BGRABlack);
      //XX:= Org.X+Depl.X;
      //YY:= Org.Y+Depl.Y;
     
      XX:= XX-Depl.X;
      YY:= YY-Depl.Y;
     
      PivotP.X := PivotP.X + Depl.X;
      PivotP.Y := PivotP.Y + Depl.Y;
     
      Edit1.Text:= FloatToStr(XX);
      Edit2.Text:= FloatToStr(YY);
     
      Edit3.Text:= FloatToStr(PivotP.X);
      Edit4.Text:= FloatToStr(PivotP.Y);
     
      Carte.DrawAngle(XX, YY, CapDeg,PivotP, true); // False); // Déplcemenr et rotation de la Carte  
      Cible.Draw(ZoneAff.Width/2-32, ZoneAff.Height/2-32, $FF);  // Affichage de la cible
      Pivot.Draw(PivotP.X-32, PivotP.Y-32, $FF);  // Affichage de la cible
      ZoneAff.SwapBuffers;
    end;
    EDIT : En utilisant PivotP, la rotation est plus juste, l'image se déplace encore . De plus, maintenant les déplacements avec la souris sont relatif à la rotation (Ex : Tu bouge la souris vers le haut, ca part à droite.....)

    Bonne journée

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Pour le deplacement avec la rotation j'ai trouvé mon erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    procedure TForm1.ZoneAffPaint(Sender: TObject);
    begin
      Load;
      BGLViewPort(ZoneAff.Width, ZoneAff.Height, BGRABlack);
      //XX:= Org.X+Depl.X;
      //YY:= Org.Y+Depl.Y;
     
      XX:= XX-Depl.X;
      YY:= YY-Depl.Y;
     
      //PivotP.X := PivotP.X + Depl.X;
      //PivotP.Y := PivotP.Y + Depl.Y;
      //
      Edit1.Text:= FloatToStr(XX);
      Edit2.Text:= FloatToStr(YY);
     
      Edit3.Text:= FloatToStr(PivotP.X);
      Edit4.Text:= FloatToStr(PivotP.Y);
     
      PivotP.X := 640+Depl.X;
      PivotP.Y := 640+Depl.Y;
      Carte.DrawAngle(XX, YY, CapDeg,PivotP, True); // False); // Déplcemenr et rotation de la Carte
      //Carte.Draw(XX+Depl.X, YY+Depl.Y);
      Cible.Draw(ZoneAff.Width/2-32, ZoneAff.Height/2-32, $FF);  // Affichage de la cible
      Pivot.Draw(PivotP.X-32, PivotP.Y-32, $FF);  // Affichage de la cible
      ZoneAff.SwapBuffers;
    end;
     
    procedure TForm1.ZoneAffMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if (ssLeft in Shift) then
      begin
        CurPos0.X:= X;    //CurPos = Origine du pointage de la souris
        CurPos0.Y:= Y;
      end;
    end;
     
    procedure TForm1.ZoneAffMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      if (ssLeft in Shift) then
      begin
        Depl.X:= (CurPos0.X-X);   // Depl = déplcement de la souris en pixels
        Depl.Y:= (CurPos0.Y-Y);
        //Dec0.X:= Dec0.X-Depl.X;   // Dec0 = Somme des déplacements cumulés
        //Dec0.Y:= Dec0.Y-Depl.Y;
        CurPos0.X:= X;    //CurPos = Origine du pointage de la souris
        CurPos0.Y:= Y;
        ZoneAff.DoOnPaint;
      end;
    end;
    Par contre je ne comprend pas comment trouver les bonnes coordonées pour le point de pivot
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  11. #11
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    ... Par contre je ne comprend pas comment trouver les bonnes coordonnées pour le point de pivot
    C'est parce que tu as oublié le calage à l'origine de l'image (Org). Du coup, pas de problème.

    Pour ce qui est des déplacements de l'image avec la souris quand l'angle de rotation n'est plus nul il faut affecter aux valeurs de déplacement le changement de repère.

    Ci-joint ta version corrigée et recorrigée Text_BGLDA_1.zip

    Bon, ben maintenant, je vais m'attaquer au zoom en espérant que cela ne va pas tout casser !

    Cordialement.

    Pierre

  12. #12
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Tu as été plus rapide que moi j'avais justement corrigé. J'ai essayé de rajouter le zoom, mais ça casse la rotation, Dommage que l'on ne puisse pas mieux contrôler les transformations, en mode "absolue", la tout est relatif et local. Bref avec le zoom il faut aussi compenser le point de pivot, mais je n'ai pas trouvé la formule qui va bien.

    Nickel ton exemple avec le changement de repère pour le déplacement
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  13. #13
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Bon, ben je pense que là, tout est bon :Test_BGLDAZ_0.zip

    Maintenant, il va falloir que je raccroche ça au GPS

    Cordialement.

    Pierre

  14. #14
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Bien vue ! L'inverse du facteur zoom, c'etait ce qui me manquait lors de mes tests. je n'y ai vraiment pas penser.

    Bonne fin de journée

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  15. #15
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Il y a encore un petit bug. Pour que lors des déplacements, l'image suive exactement le curseur, il faut, dans la procédure OnMouseMove, diviser la valeur Depl par kZoom, soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Depl.X:= (CurPos0.X-Xa)/kZoom;   // Depl = déplacement de la souris en pixels
        Depl.Y:= (CurPos0.Y-Ya)/kZoom;
    Cordialement.

    Pierre

  16. #16
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Pour accélérer les chargements d'image, je voudrais introduire les flux. A titre d'essai, j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Load;
    var
      bmpStream: TStream;
      Hnd: TFPCustomImageWriter;
     
    begin
      if not DataLoaded then
      begin
        bmp:= TBGLBitmap.Create(DimCarte, DimCarte);
        bmp.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Herblay.jpg');
        BmpStream:= TStream.Create;
        bmp.SaveToStream(bmpStream, Hnd); // Ça plante ici
        bmp.LoadFromStream(bmpStream);
        ...
    Malheureusement, je ne peux même pas dépasser le cap du chargement dans un flux. L'instruction "bmp.SaveToStream(bmpStream, Hnd);" crée un erreur :

    ...classe d'exception "EStream Error avec le message :

    TStream.Seek not implemented.


    Si je remplace TStream par TMemoryStream, j'ai l'erreur suivante ;

    ...classe d'exception "External : SIGSEGV"

    Y a-t-il moyen de s'en sortir ?

    Cordialement.

    Pierre

  17. #17
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par ChPr Voir le message
    Pour accélérer les chargements d'image, je voudrais introduire les flux. A titre d'essai, j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Load;
    var
      bmpStream: TStream;
      Hnd: TFPCustomImageWriter;
     
    begin
      if not DataLoaded then
      begin
        bmp:= TBGLBitmap.Create(DimCarte, DimCarte);
        bmp.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Herblay.jpg');
        BmpStream:= TStream.Create;
        bmp.SaveToStream(bmpStream, Hnd); // Ça plante ici
        bmp.LoadFromStream(bmpStream);
        ...
    Bonjour Pierre

    ton Hnd: TFPCustomImageWriter; ne devrait-il pas être initialisé avec le format dans lequel tu souhaites exporter ? Car cela m'étonnerai que le SaveToStream le fasse à ta place

    EDIT : TFPCustomImageWriter est une classe avec une méthode abstraite a surcharger

    Bonne fin de dimanche

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  18. #18
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    Je viens tester vite fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure TForm1.Load;
    var
      bmp: TBGLBitmap;
      bmpStream: TStream;
      BmpWriter: TFPWriterPNG;  //TFPCustomImageWriter;
      BmpReader: TFPReaderPNG;
    begin
      if not DataLoaded then
      begin
        bmp := TBGLBitmap.Create(ExtractFilePath(Application.ExeName) + 'Herblay.jpg');
        bmp.ResampleFilter := rfBestQuality;
     
        // procedure SaveToStreamAsPng(Str: TStream); virtual;
        BmpWriter := TFPWriterPNG.Create;
        BmpReader := TFPReaderPNG.Create; 
        BmpStream:= TMemoryStream.Create; //<---- Important TStream est une classe abstraite
        bmp.SaveToStream(bmpStream, bmpWriter);
        bmp.LoadFromStream(bmpStream, bmpReader);
        FreeAndNil(BmpStream);
        FreeAndNil(BmpWriter);
        FreeAndNil(BmpReader);
     
        Carte := bmp.MakeTextureAndFree;
    Le hic ici vient de LoadfromStream qui renvoie inexorablement 'Image format Unknown' (Bug de FPC dans FPImage, ou j'ai rien compris )

    EDIT : Pourquoi ne pas simplement garder une copie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Var
      bmpCopie : TBGLBitmap;
    ...
      bmpCopie := Bmp.Duplicate(True, True);
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  19. #19
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 087
    Points : 2 854
    Points
    2 854
    Billets dans le blog
    2

    Par défaut

    La solution est toute bête il faut se repositionner au début du stream avant de charger. (logique quand on y pense) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     bmp.SaveToStream(bmpStream, bmpWriter);
     BmpStream.Position := 0; //-----------------> IMPORTANT  FAUT SE REMETTRE AU DEBUT DU FLUX
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  20. #20
    Membre confirmé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 293
    Points : 531
    Points
    531

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    ... Le hic ici vient de LoadfromStream qui renvoie inexorablement 'Image format Unknown' (Bug de FPC dans FPImage, ou j'ai rien compris )

    EDIT : Pourquoi ne pas simplement garder une copie. ... [/CODE]
    Effectivement, j'ai essayé différents méthodes (SaveToStream, SaveToStreamAs, SaveToStreamAsPng) et toutes donnent "Unknown" au retour.Tu as raison, une copie est aussi simple.

    Mais cela ne se passe pas tout seul : il faut d'abord transtyper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            bmpCopie := BmpCarte.Duplicate(True, True) as TBGLBitmap;
    A l'usage, la copie est redimensionnée alors que je n'ai rien demandé et de plus, son centre de rotation est parti je ne sais où !

    Au lieu de faire une copie, j'ai créé un autre bitmap dans lequel j'ai copié l'original (il faut aussi transtyper en Tbitmap pour que ça compile) et à l'usage j'obtiens une erreur comme quoi ce bitmap est trop grand pour OpenGL !

    J'ai aussi essayé par un copyRect : je n'ai pas trouvé.

    Enfin, ma dernière solution et qui apparemment donne satisfaction est de ne pas détruire le bmp en remplaçant "Carte:= Bmp.MakeTextureAndFree;" par "Carte:= bmp.Texture;"

    Je me sers alors de ce bmp pour y dessiner mes traces de GPS, cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure TAffCarte.Load;
    begin
      if not DataLoaded then // première passe et dezsin de la carte seulement
      begin
        BmpCarte:= TBGLBitmap.Create(ExtractFilePath(Application.ExeName) + 'Herblay.jpg');
        BmpCarte.ResampleFilter := rfBestQuality;
        Carte:= BmpCarte.Texture;
    //    Carte:= bmp.MakeTextureAndFree;
     
        BmpCible:= TBGLBitmap.Create(ExtractFilePath(Application.ExeName) + 'viseur_croix.png');
        BmpCible.ResampleFilter := rfBestQuality;
        Cible:= BmpCible.MakeTextureAndFree;
     
        DataLoaded:= True;
      end
      else
      begin // passes suivantes
        Si un nouveau point de tracer alors
        begin // là, ça perd un peu de fluidité (pas beaucoup), mais cela arrive au mieux toutes le secondes
          Tracé de ce  nouveau segment sur le BmpCarte;  
          Carte:= BmpCopie.Texture; // Transformation en texture
        end;
      end;
    end;
    Pfouiiiii

    Ne pas oublier de détruire le BmpCarte au sortir du programme

    Cordialement.

    Pierre

Discussions similaires

  1. Installer et débuter avec WebGL, l'implémentation d'OpenGL pour nos navigateurs
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 24/04/2013, 23h56
  2. Débuter avec openGL, problem pour afficher des primitives
    Par kosa_nostra dans le forum OpenGL
    Réponses: 1
    Dernier message: 06/11/2011, 20h40
  3. Débuter avec OpenGL 3.x
    Par mohdaef dans le forum OpenGL
    Réponses: 24
    Dernier message: 04/06/2010, 01h39
  4. Débuter avec OpenGL
    Par Franck.H dans le forum OpenGL
    Réponses: 3
    Dernier message: 26/11/2009, 19h12
  5. Débuter avec OpenGL, quelel version ?
    Par Kromagg dans le forum OpenGL
    Réponses: 11
    Dernier message: 03/07/2009, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo