IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

GLUT Discussion :

[GLUT + DELPHI] Redimensionnement fenetre


Sujet :

GLUT

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 19
    Par défaut [GLUT + DELPHI] Redimensionnement fenetre
    Bonjour tout le monde !

    Voila, j'ai un petit problème avec le code suivant :

    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
     
    program Template;
     
    uses
      Windows,
      Messages,
      glut,
      OpenGL;
     
    const
      WND_TITLE = 'Mes premiers en pas OpenGL';
     
    var
      spin : integer;
     
    {$R *.RES}
     
    procedure init();
    begin
      glclearcolor(0,0,0,0);
      glshademodel(gl_flat);
    end;
     
    procedure display ;cdecl;
    begin
      glclear(GL_color_buffer_bit);
      glpushmatrix();
      glrotate(45,0,0,1);
      glcolor3f(1,1,1);
      glrectf(-25,-25,25,25);
      glpopmatrix();
      glutswapbuffers();
    end;
     
    procedure reshape(Width, Height : Integer);cdecl;
    begin
      glViewport(0, 0, Width, Height);
      glmatrixmode(gl_projection);
      glloadidentity();
      glortho(-50,50,-50,50,-1,1);
      glmatrixmode(gl_modelview);
      glloadidentity();
    end;
     
    begin
      glutinit(MS_LIB);
      glutinitdisplaymode(GLUT_DOUBLE or GLUT_RGB);
      glutinitwindowsize(250,250);
      glutinitwindowposition(100,100);
      glutcreatewindow(WND_TITLE);
      init();
      glutdisplayfunc(display);
      glutreshapefunc(reshape);
      glutmainloop();
    end.
    Je m'explique :
    Une fois le code compilé et éxécuté, la fenetre openGL s'ouvre bien, avec un joli petit

    carré en son centre, pivoté de 45 degré selon l'axe z, jusque là, pas de problème.
    Par contre, dés que je veux redimensionner la fenetre, au lieu de me recalculer la

    scène pour un affichage correct, il me déforme mon jolie petit carré, j'arrive pas à

    trouver de solution, au secours !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 108
    Par défaut
    Cela vient de glOrtho, il doit être fonction de la résolution.

    Par exemple : glOrtho(0, 0, width, height)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 19
    Par défaut
    Oui, je me doutais que ça venais de là, mais à ce moment là, comment récupérer les dimensions de la fenetre pour actualiser "glOrtho(0, 0, width, height)" en fonciton des dimensions pour ne pas avoir de pertubation ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 108
    Par défaut
    Dans ton cas, il faut faire appel à glOrtho que lorsque l'on redimmensionne la fenêtre. Lorsque celle-ci est redimensionnée, glut appel la fonction reshape en te passant la largeur et la hauteur de la fenêtre. En définitive, ta fonction reshape devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure reshape(Width, Height : Integer);cdecl; 
    begin 
      glViewport(0, 0, Width, Height); 
      glmatrixmode(gl_projection); 
      glloadidentity(); 
      glortho(0, 0, Width, Height, 0, 1000);
      glmatrixmode(gl_modelview); 
      glloadidentity(); 
    end;
    Normalement, tu devrais voir un quart de ton rectangle.

    Les push et pop matrice sont inutiles dans ton cas. Faudrait-il pas plutôt écrire glrotate4f à la place de glrotate ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 19
    Par défaut
    J'ai cherché un peu, et j'ai trouvé !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure reshape(W,H: Integer);cdecl;
    begin
      glViewport(0, 0, w, h);
      glmatrixmode(gl_projection);
      glloadidentity();
      if w <= h
      then glOrtho (-50, 50, -50*h/w, 50*h/w, -1, 1)
      else glOrtho (-50*w/h, 50*w/h, -50, 50, -1, 1);
      glmatrixmode(gl_modelview);
      glloadidentity();
    end;
    J'avais essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure reshape(Width, Height : Integer);cdecl; 
    begin 
      glViewport(0, 0, Width, Height); 
      glmatrixmode(gl_projection); 
      glloadidentity(); 
      glortho(0, 0, Width, Height, 0, 1000); 
      glmatrixmode(gl_modelview); 
      glloadidentity(); 
    end;
    Mais le résultat n'étais pas satisfaisant.

    Effectivement, la logique voudrais que j'écrive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glrotate4f(spin,0,0,1);
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glrotate(spin,0,0,1);
    J'avais pas fait gaffe, mais ce qui est étrange, c'est que cela fonction avec juste glrotate !

    Pour ce qui est des push pop, je me suis pas penché sur la question.
    En fait, ce code est tiré du livre "OpenGL 1.4" de chez Campus press, le problème est que les exemples du livre sont donné en C, j'essaie de les transcrire en pascal, et le probleme est que je cherche midi à 14 h, en fait, en cherchant un peu dans le livre, la réponse est doinné.

    En passant, je conseil à tous ce bouquin, vraiment interressant et complet (traduction du redbook donc forcement !)

    En tout cas, merci pour ces réponse qui m'ont bien mis sur la bonne voie.

    Laurent...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème GridBagLayout et redimensionnement fenetre
    Par Perbugi dans le forum Débuter
    Réponses: 2
    Dernier message: 29/09/2009, 15h53
  2. redimensionner fenetre avec JTabbedPane
    Par mouss4rs dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 17/04/2008, 19h25
  3. [Holala] redimensionnement fenetre mere
    Par aupetitbonheur dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/08/2006, 15h01
  4. Réponses: 2
    Dernier message: 12/11/2004, 17h34
  5. redimensionnement d'une fenetre DirectX
    Par tibyann dans le forum DirectX
    Réponses: 3
    Dernier message: 11/06/2004, 13h09

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