GLam Collection version 0.4 -  ACCUEIL -  CLASSES -  HIERARCHIE -  MEMBRES -  EXEMPLES


Référence de la classe GLamWidget

Interface de développement Qt/OpenGL. Plus de détails...

#include <glamwidget.h>

Liste de tous les membres

Signaux

void selected (int idParent, int idObj)

Fonctions membres publiques

 GLamWidget (QWidget *parent=0)
 ~GLamWidget ()
void setBackgroundColor (float r, float g, float b)
void setLightPosition (const XamPoint &pos, bool positional=true)
XamPoint lightPosition () const

Fonctions membres protégées

virtual void createObjects ()
virtual void drawObjects ()
virtual void animateObjects ()
virtual void keyPressEvent (QKeyEvent *event)

Description détaillée

Interface de développement Qt/OpenGL.

La classe GLamWidget est dérivée de la classe Qt QGLWidget.
Elle assure la préparation de la scène OpenGL en mettant en place un éclairage et en activant le tampon de profondeur (z-buffer). La scène est de dimensions 16 x 16.
Elle propose un modèle de développement permettant de faire apparaître des objets sur la scène. Ce modèle se résume à 4 méthodes virtuelles protégées :


La classe GLamWidget offre un certain nombre de commandes de manipulation de la scène. Elle assure notamment la mise en place des mécanismes de picking permettant une sélection d'objets sur la scène par action sur le bouton central de la souris.

Fonction Description
Trackball virtuel souris mouvement + bouton gaucherotations autour des axes X et Y
mouvement + bouton droit

rotation autour de l'axe Z

Zoom souris rotation molette

réduction/agrandissement par pas de 10%

Décalage
du point de vue
clavier flèche gauchedécalage vers la gauche
flèche droitedécalage vers la droite
flèche hautdécalage vers le haut
flèche basdécalage vers le bas
touche Home

vue centrée sur l'origine 0XYZ (défaut)

Vues ISO clavier Ctrl + flèche gauchevue de droite
Ctrl + flèche droitevue de gauche
Ctrl + flèche hautvue de dessous
Ctrl + flèche basvue de dessus
Ctrl + touche Homevue de face (défaut)
Ctrl + touche End

vue arrière

Animation clavier touche A[dés]activation de la rotation autour de l'axe Z
touche +augmentation de la vitesse de rotation
touche -

diminution de la vitesse de rotation

Position
de l'éclairage
clavier Shift + flèche gauchevers la gauche (X-)
Shift + flèche droitevers la droite (X+)
Shift + flèche hautvers le haut (Y+)
Shift + flèche basvers le bas (Y-)
Shift + touche PageUpvers l'arrière (Z-)
Shift + touche PageDown

vers l'avant (Z+)

Sélection d'objets souris bouton central

émission du signal selected()

Sauvegarde
de la scène
clavier touche Print-Screen

Sauvegarde au format PPM ou PNG

Fermeture de
l'application
clavier touche Esc


Gestion de l'éclairage

La lampe par défaut est une lumière blanche de type positionnel, elle est localisée en { 5, 5, 10 }.
La classe propose des possibilités de déplacer la lampe au moyen du clavier ; chaque action laisse apparaitre la lampe pendant un court instant (environ 1 seconde) sous la forme d'une petite sphère rouge.


Sauvegarde de la scène

La classe GLamWidget propose un moyen de sauvegarder la scène courante sous forme d'une image au format PPM ou PNG par la commande clavier Print-Screen (touches Maj-ImprEcran).
La génération du format PPM est codée en interne mais le format PNG nécessite le paquetage 'netpgm' (Linux).
La taille de l'image est équivalente à celle de la fenêtre d'application (800 x 800 pixels par défaut).


Classe minimale d'application

Pour exploiter la bibliothèque GLam sous Qt, une application doit tout simplement disposer d'une classe dérivée de GLamWidget telle que le modèle suivant :

// myoglappli.h

#ifndef MYOGLAPPLI_H
#define MYOGLAPPLI_H

#include <GLam/glamwidget.h>

class MyOglAppli : public GLamWidget
{
  Q_OBJECT

  public :
  MyOglAppli(QWidget* parent = 0 ) ;
  ~MyOglAppli() ;

  void keyPressEvent(QKeyEvent* event ) ;

  void createObjects() ;
  void drawObjects() ;
  void animateObjects() ;

  public slots :
  void selected(int idParent, int idObj ) ;

  private :
  // objets GLam membres
} ;

#endif



Documentation des constructeurs et destructeur

GLamWidget::GLamWidget ( QWidget *  parent = 0  ) 

Constructeur

GLamWidget::~GLamWidget (  ) 

Destructeur


Documentation des fonctions membres

void GLamWidget::animateObjects (  )  [protected, virtual]

Animation de la scène, avec une périodicité de 20 ms.
Cette méthode peut être surchargée dans la classe d'application cliente sans remettre en cause l'animation proposée par défaut (rotation autour de l'axe Z).

Exemple de surcharge dans une classe d'application nommée MyOglAppli dérivée de GLamWidget. Cet exemple reprend celui de la classe GLamSpring avec spring1 en tant que membre privé et provoque un mouvement alternatif extension/compression du ressort :

void MyOglAppli::animateObjects()
{
  static double   springLen = 5 ;
  static int    sign = 1 ;

  spring1->setLength( springLen ) ;

  if ( ( springLen >=  5.0 )&&( sign == +1 ) )  sign = -1 ;
  if ( ( springLen <= spring1->minLength() )&&( sign == -1 ) )  sign = +1 ;
  springLen += sign * 0.2 ;
}
void GLamWidget::createObjects (  )  [protected, virtual]

Création de 2 objets de base : un trièdre et une grille de référence 16x16.
Cette méthode doit être surchargée pour assurer la création des objets de l'application cliente. La création des 2 objets de base peut être conservée ou non...

Exemple de surcharge dans une classe d'application nommée MyOglAppli dérivée de GLamWidget. Cet exemple reprend celui de la classe GLamCube avec les objets cube1, cube2, et cube3 en tant que membres privés :

void MyOglAppli::createObjects()
{
  GLamWidget::createObjects() ; // objets de la classe de base

  cube1 = new GLamCube(3, 2.4, 1.3 ) ;
  cube1->setColor(0.8, 0.1, 0.0 ) ;

  cube2 = new GLamCube( *cube1 ) ;
  cube2->setColor(0.0, 0.8, 0.2 ) ;
  cube2->setThickness(0.5 ) ;

  cube3 = new GLamCube(2, 4, 0 ) ;
}
void GLamWidget::drawObjects (  )  [protected, virtual]

Projection des objets sur la scène.
Cette méthode doit être surchargée pour assurer la projection des objets de l'application cliente. La projection des 2 objets de base peut être conservée ou non...

Exemple de surcharge dans une classe d'application nommée MyOglAppli dérivée de GLamWidget. Cet exemple reprend celui de la classe GLamCube avec les objets cube1, cube2, et cube3 en tant que membres privés :

void MyOglAppli::drawObjects()
{
  GLamWidget::drawObjects() ;   // objets de la classe de base

  glPushMatrix() ;
    cube1->draw() ;
    glTranslated( 5.0, 0.0, 0.0 ) ;
    cube2->draw() ;
    glTranslated( -2.0, -3.0, 3.0 ) ;
    glRotated(-45, 1, 1, 0 ) ;
    cube3->draw() ;
  glPopMatrix() ;
}
void GLamWidget::keyPressEvent ( QKeyEvent *  event  )  [protected, virtual]

Intercepteur des événements liés au clavier.

Exemple de surcharge dans une classe dérivée d'application nommée MyOglAppli afin d'animer la pince de robot au moyen de la touche P du clavier :

void MyOglAppli::keyPressEvent(QKeyEvent* event )
{
  if ( event->modifiers() & Qt::ShiftModifier ) {
    switch( event->key() ) {
      case Qt::Key_P : if ( delta <= 6.0 )  delta += .2 ; break ;
    }
  }
  else {
    switch( event->key() ) {
      case Qt::Key_P : if ( delta > -6.0 )  delta -= .2 ; break ;
    }
  }
  GLamWidget::keyPressEvent( event ) ;
}
XamPoint GLamWidget::lightPosition (  )  const

Retourne la position courante (x,y,z) de la lampe.

void GLamWidget::selected ( int  idParent,
int  idObj 
) [signal]

Signal émis lors de la sélection d'un objet sur la scène, ou lors de la désélection de l'objet en cours de sélection.
L'argument idParent représente l'identifiant de la display list du parent de l'objet sélectionné lorsque cela est possible, ou 0 sinon. L'argument idObj contient l'identifiant de l'objet proprement dit.
Si il s'agit d'une désélection, les 2 arguments sont à 0.

Exemple de mise en place d'un slot de réception dans une classe d'application nommée MyOglAppli dérivée de GLamWidget. L'aspect de l'élément sélectionné est modifié par appel à la méthode GLamObject::setSelected(), et des informations d'usage sont envoyées sur la console (clause MYDEBUG) :

// connexion (dans constructeur de MyOglAppli)

connect( this, SIGNAL( selected(int,int)), SLOT( selected(int,int) ) ) ;

// slot

void MyOglAppli::selected(int idParent, int idObj )
{
  static GLamObject*  currentSelection = NULL ;

  if ( idParent == 0 && idObj == 0 ) {
    if ( currentSelection != NULL ) currentSelection->setSelected( false ) ;
    return ;
  }

  GLamObject* obj = GLamObject::objectAddress( idParent ? idParent : idObj ) ;
  if ( obj != NULL ) {
    if ( currentSelection != NULL ) currentSelection->setSelected( false ) ;
    obj->setSelected() ;
    currentSelection = obj ;
  }

#ifdef MYDEBUG
  cout << "--> id : " << idObj ;
  cout << ", class : " << GLamObject::objectClass(idObj ) ;
  cout << ", name : " << GLamObject::objectName( idObj ) ;
  if ( idParent ) {
    cout << " --- parent : " << idParent ;
    cout << ", class : " << GLamObject::objectClass(idParent ) ;
    cout << ", name : " << GLamObject::objectName( idParent ) ;
  }
  cout << endl ;
#endif
}
void GLamWidget::setBackgroundColor ( float  r,
float  g,
float  b 
)

Fixe la couleur de fond de la scène (blanche par défaut).
Les proportions RGB sont transmissibles sous forme de valeurs réelles dans l'intervalle [0;1] (pourcentage/100) ou sous forme de valeurs entières ]1;255] (proportion codée sur 8 bits).

void GLamWidget::setLightPosition ( const XamPoint pos,
bool  positional = true 
)

Fixe la position (x,y,z) de la lampe d'éclairage de la scène.
L'argument positional permet de choisir entre un éclairage de type ponctuel (défaut) ou directionnel.


Doxygen version 1.6.3 - GLam Collection - (c) 2009-2010 Alain Menu