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.
- 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 !