Le modèle OpenGL : conception

| Witold Wysota | Traducteur : Thibaut Cuvelier |

La première chose à faire lors de la conception d'un modèle est de penser à l'intérêt de ce que l'on fait. Dans ce cas, on veut un modèle qui stocke des informations concernant une scène 3D qui peut alors être rendue avec OpenGL et QGLWidget. La scène sera constituée de quelques objets, qui peuvent être définis de différentes manières offertes par la spécification OpenGL.

Ce genre de modèle est souvent basé sur des items, la première chose à faire est donc de définir ce que représente un item. Pour des scènes 3D, cela peut être un seul objet (modèle 3D). Au début, un set d'attributs (représentés comme des rôles dans l'implémentation MVC de Qt 4) devrait être défini et ensuite seulement la hiérarchie du modèle.

Commentez

- Titre : Le modèle OpenGL : conception

- Auteurs : Witold Wysota, Traducteur : Thibaut Cuvelier

- Parution : 5 avril 2011

- Mise à jour : 2 mai 2011

- Licence : Copyright ® 2006 Witold Wysota. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. L'article original

- II. Les rôles

- III. La hiérarchie

- IV. La suite

- V. Remerciements

I - L'article original

Cet article est la traduction de l'article Designing the model de Witold Wysota.

II - Les rôles

Une entité 3D peut avoir plusieurs attributs, comme des coordonnées spatiales, des données matérielles, des composantes de vecteur normal, etc. Voici une suggestion d'attributs pour une représentation simple d'un objet 3D :

- XRole : coordonnée X de l'objet ;

- YRole : coordonnée Y de l'objet ;

- ZRole : coordonnée Z de l'objet ;

- MaterialRole : description matérielle (couleur) de l'objet ;

- TextureRole : description matérielle (texture) de l'objet ;

- FlagsRole : drapeaux OpenGL pour l'objet ;

- TypeRole : type de l'objet (voir plus bas) ;

- XNormalRole : composante X du vecteur normal à l'objet ;

- YNormalRole : composante Y du vecteur normal à l'objet ;

- ZNormalRole : composante Z du vecteur normal à l'objet ;

- NameRole : nom de l'objet ;

- SizeXRole : taille en X de l'objet ;

- SizeYRole : taille en Y de l'objet ;

- SizeZRole : taille en Z de l'objet ;

- Attr1Role : attribut personnalisé ;

- Attr2Role : attribut personnalisé.

Au lieu de définir ces rôles, on pourrait utiliser des colonnes séparées pour stocker les données associées aux différents attributs, mais on a préféré un modèle cohérent et facile à étendre. Si une représentation basée sur des colonnes était requise, il serait simple d'en créer une à l'aide d'un modèle proxy (un exemple suit dans une autre partie de l'article).

À peu près tous les rôles sont faciles à comprendre, sauf un, qui pourrait requérir plus d'attention, TypeRole, qui stocke le type de l'objet. On veut que le modèle soit capable de stocker différents types d'objets, comme différentes primitives (cubes, sphères...) ou des objets complexes définis en utilisant des fonctionnalités comme les listes d'affichage, les points, les lignes, etc. Grâce à ce rôle, il sera facile d'implémenter un moteur de rendu qui réagira différemment en fonction du type à dessiner.

Ces types pourraient être :

- un point ;

- une ligne ;

- plusieurs lignes ;

- un segment de droite ;

- un quadrilatère ;

- une liste d'affichage ;

- une sphère ;

- un cube ;

- un plan ;

- une source de lumière ;

- un objet complexe (un type qui consiste en une série de sous-objets, voir plus bas).

Évidemment, d'autres types pourront être ajoutés à la suite sur demande.

Ces rôles sont tous des rôles personnalisés, mais certains peuvent être implémentés à l'aide des rôles par défaut de Qt (comme MaterialRole qui pourrait être remplacé par Qt::DecorationRole ou NameRole par Qt::DisplayRole). On utilisera ici les rôles par défaut d'une autre manière : Qt::DisplayRole va afficher les coordonnées de l'objet et/ou le nom de l'objet, Qt::DecorationRole montrera une icône représentant le type d'objet, Qt::ToolTipRole affichera les coordonnées de l'objet, etc.

III - La hiérarchie

Après avoir défini les attributs des items, leur hiérarchie devrait être établie. Comme la plupart des objets sont complexes, ils sont constitués de sous-objets, qui eux-mêmes peuvent être créés à partir de sous-sous-objets, etc.) et devraient être représentés en utilisant ces sous-objets. Parce que le modèle aura une structure arborescente, où chaque niveau représentera un set de tous les sous-objets de l'objet parent (avec la scène complète à la racine du modèle).

Voici une hiérarchie d'exemple. Elle ne dispose que d'une source de lumière, un autre plan, un point seul, une ligne et deux objets complexes (un étant fait à partir de quatre points définissant un segment de droite et d'une sphère, l'autre à partir d'une liste d'affichage).

Scene
|
+-- Light source
+-- Plane
|   +-- Point
|   +-- Point
|   +-- Point
|   +-- Point
+-- Point
+-- Line
|   +-- Point
|   +-- Point
+-- Object
|   +-- Line Strip
|   |   +-- Point
|   |   +-- Point
|   |   +-- Point
|   |   +-- Point
|   +-- Sphere
+-- Object
+-- DisplayList

IV - La suite

Dans la prochaine partie, on se focalisera sur la définition de la représentation interne du modèle. Dans cet épisode, on montrera un exemple de code de la classe de modèle, ce qui permettra de le compiler, elle ne contiendra que des routines pour manipuler la représentation interne.

V - Remerciements

Merci à Louis du Verdier et à Claude Leloup pour leur relecture !