Ce rapport conclu le projet consistant à modéliser une cuisine dans le langage, de description de scènes et d'objets 3D, VRML version 2. Ce rapport présente quelques remarques concernant les choix effectués et les problèmes rencontrés lors de la réalisation et liste les objets que nous avons réalisé.
Dans le but de bien comprendre le fonctionnement de VRML nous avons essayé de mettre en œuvre le plus de nœuds disponibles dans la syntaxe VRML.
On a vérifié que l'on pouvait construire des objets à l'aide de groupe, mais aussi simplement par une liste des objets dans un fichier, que l'on rappelle grâce à l'URL du fichier. On peut procéder de deux manières différentes pour les fichiers d'objets. Soit choisir l'option du fichier qui comporte toutes les formes permettant la réalisation de l'objet (par exemple la porte fenêtre), ou bien découper chaque pièce formant un objet dans un fichier différent (par exemple pour la desserte). Pour les objets simples un regroupement est possible, mais dés que l'objet est complexe ou que l'on souhaite réutiliser des parties, il est nécessaire de découper les pièces dans des fichiers externes et de les mettre dans des dossiers.
Tous nos objets ont été réalisés avec des côtes les plus exactes possibles, c'est à dire en limitant au maximum les intersections inutiles. Cependant parfois, on ne peut pas faire autrement en particulier, lorsque l'on veut créer un effet. Par exemple pour la courbure des poignées des tiroirs, la courbure est réalisée à l'aide de sphères entre les cylindres, cela permet d'avoir un effet de coude parfait, cependant les sphères sont cachées en partie. Par contre tous les meubles ont été réalisés sans aucune intersection inutile.
On a construit tous les objets centrés à l'origine. Cependant, certains objets n'ont pas été recentrés ni même construit au centre du repère. En effet, pour la poignée de porte par exemple, il est plus intéressant d'avoir une origine sur la plaque et non pas un recentrage entre la plaque et la clef, car la clef n'est pas importante, elle dépasse et l'objet deviendrait plus difficile à placer. De même, si tous les meubles, qui ne sont pas de vulgaires cubes car ils respectent la construction réelle, c'est à dire des bords de toutes la hauteur et des plaques insérées entre ces bords, ainsi qu'un léger renfoncement pour le fond du meuble, ont été centrés, la porte et la façade viennent s'ajouter au meuble. Le recentrage du meuble en incluant la façade n'est pas nécessaire pour deux raisons, d'une part il est contraignant et d'autre part si l'on souhaite exploiter différents modèles de façades, il est plus facile de venir plaquer chaque façade avec son épaisseur sur des meubles fixés que de faire bouger tous les meubles. Idem pour les tiroirs.
Un grand nombre d'objets ont été réalisés à l'aide de prototypes qui permettent une réutilisation des formes et un redimensionnement à la demande. Par exemple les meubles bas et haut ont les mêmes objets : les côtés, les supports et le fond, il suffit de changer la taille des objets prototypes et l'ont obtient ainsi une grande variété de meubles avec un minimum de manipulation. De plus, comme la forme prototype peut contenir les paramètres de couleur, une fois attribuée cette couleur sera utilisée par tous les objets utilisant le prototype.
Une technique, une fois acquise, par exemple le dessin d'un arc de cercle à l'aide des IndexedFaceSet, a été réutilisée avec des dimensions différentes, des épaisseurs différentes. Le dessin du porte bouteille présente une hauteur fixe, alors que le cache des roulettes de la desserte, lui suit l'arc avec une épaisseur constante, ce qui permet d'obtenir une surface fine en arc de cercle. Or ces deux objets sont basés sur le même arc de cercle.
Certains objets ont été construit dans le but d'un redimensionnement (scale). Ne sachant pas à l'avance la dimension du plan de travail unifié des meubles bas. On a construit un "morceau" de plan de travail avec un placement des objets et une profondeur fixe dépendant de la profondeur fixe des meubles bas, mais une largeur de 1 m. On redimensionne alors facilement la largeur du plan de travail par un coefficient multiplicateur, suivant ses besoins. Cela permet une réutilisation optimale de cet objet quelque soit la largeur du plan du travail. La plainte en fait également partie.
Par contre on pourrait se dire que les façades des meubles, portes, tiroirs peuvent être facilement redimensionnés à l'aide de scale, mais non car on perd la notion de petit décalage qui suit le scale. Il est donc nécessaire de reconstruire de nouveaux objets dans certains cas.
On a utilisé la méthode de l'extrusion pour fabriquer par exemple les pieds carrés obliques de la table. Cette technique permet de décrire un volume 3D à partir d'une surface 2D, et de le construire par rotation, mais c'est surtout l'option de redimensionnement lors du passage en volume que l'on a utilisé. Cela permet d'avoir des volumes progressifs agréables, impossibles à obtenir autrement.
Toutes les façades en "chapeau de gendarme" ont été façonnées à partir d'arcs de cercle améliorés sur les bords construit avec des objets IndexedFaceSet précis.
La desserte présente un plateau (comme le plan de travail) au rebord arrondi en angle dessus et un bord plat dans le prolongement en dessous. Cette présentation est obtenu en plaçant dans le prolongement du plateau un Cylinder, de diamètre l'épaisseur du plateau, couché placé à moitié dans le plateau et dépassant de l'autre moitié. Une longue Box, de dimension la moitié de l'épaisseur du plateau placée en avant et à mi hauteur du plateau donne l'aspect plat car elle vient exactement se placée dans un quart du cylindre.
Nous avons choisi pour un débuggage efficace, lors de la construction d'objets complexes, de construire les objets avec des propriétés de transparence moyenne et des couleurs différentes pour chaque pièce. Par débuggage, on entend : vérifier que les objets sont bien dimensionnés et bien positionnés. Cela permet d'une part de bien distinguer les objets et d'autre part de vérifier qu'ils sont positionnés où l'on souhaite. Tous nos objets ont donc étaient réalisés avec cette technique.
Comme dessiner des arcs de cercle ou des formes circulaires à la main demande à la fois pas mal de calcul et surtout ne présente pas une très grande précision et donc un mauvais rendu. Nous avons donc réaliser une "moulinette" en langage C permettant de construire n'importe quelle forme courbe à partir de la rotation et du déplacement d'un objet simple. Le rendu est alors supérieur. Mais il ne faut pas non plus tomber dans l'extrême, qui consiste à construire des objets avec trop de faces. D'une part la résolution n'est pas suffisante pour que cela se voit et d'autre part le temps de calcul lors des réaffichages successifs est trop important et l'ordinateur a du mal à suivre, ce qui est désagréable à l'utilisation. Il faut donc trouver un juste milieu.
Au lieu d'utiliser un logiciel annexe nous avons donc réalisé nous même notre propre logiciel minimal.
Lors de la construction de l'évier, nous avons rencontré un problème d'orientation des faces lié à la représentation VRML. Un même objet construit symétriquement (les courbures de l'évier) se comportait différemment dans sa réflexion de la lumière suivant une position différente dans l'espace. Pour résoudre ce problème, qui ne semblait pas être un problème de vecteur normal, nous avons placé une petite lumière au centre de l'évier, afin de forcer, en quelque sorte, une représentation uniforme des courbures par le moteur VRML.
Afin d'utiliser des techniques différentes certains objets ont été coloriés avec une couleur travaillée (shiness, specularColor) tel la table et d'autres ont été texturés à partir d'image GIF que l'on plaque sur l'objet.
Certains objets, tel le meuble texturé ou la desserte, comportent un nœud d'éclairage particulier ainsi qu'une position d'examen rapide afin de facilité leur présentation.
La dalle du sol a été texturée à l'aide d'un nœud particulier : PixelTexture, qui permet à partir d'une description pixel par pixel de définir une texture à appliquer. Cette méthode semble bien adaptée pour les carreaux au sol par exemple, et permet une répétition fine et rectangulaire du dessin.
Nous avons également travaillé avec les différents mouvements présents dans VRML.
Chaque porte de placard possède un CylinderSensor, et permet une ouverture droite ou gauche et chaque tiroir possède un PlaneSensor définissant son mouvement d'avant en arrière. Afin de respecter l'axe naturel de rotation des portes, cet axe n'est pas au bout de la porte, mais est légèrement à l'intérieur pour donner l'impression d'une charnière.
Un PlaneSensor a été utilisé afin de déplacer les portes fenêtres. D'ailleurs, il faut noter que l'on a trouvé une méthode pour déplacer deux objets en parallèle à l'aide d'un unique PlaneSensor, donnant ainsi l'impression que l'on manipule deux objets à la fois.
Unité choisi lors de la construction est 1 = 1 m donc 0.01 = 1 cm. Afin d'avoir une représentation réaliste des objets les uns par rapport aux autres, le choix d'une unité était nécessaire.
Afin de faciliter la construction de la cuisine, on a pris au centre du repère un meule. On a donc un meuble origine, dont la carcasse est exactement centrée dans le repère. Ce meuble sert alors de référence pour les trois dimensions de positionnement.
La cuisine se décomposent en un très grand nombre d'objets qu'elle regroupe.
Nous avons tout d'abord, dans le but de pouvoir modéliser n'importe quelle cuisine, construit tous les meubles possibles:
Bas : de 40 ou 60 cm de largeur, porte à ouverture vers la droite ou la gauche ou de haut en bas, avec ou sans tiroir, ainsi que les blocs de 5 tiroirs. Les meubles bas sont de hauteur 72 cm pour permettre le positionnement d'une plainte de 10 cm au dessous des meubles.
Haut : de 40 ou 60 cm de largeur avec ouverture à droite ou à gauche.
Colonne : idem avec les 2 types de profondeurs indiquées.
Plan de travail : au rebord arrondi et texturé avec du 'bois'.
Cependant, les meubles n'étant que des cubes, avec un positionnement précis des parois, nous avons décidé de donner un style à la cuisine : ancien (type MYKONOS) avec des façades très travaillées. Pour cela nous avons, à l'aide d'objets IndexedFaceSet définis à l'aide de calcul à la main, construit des façades "chapeau de gendarme". Les façades ont été construites pour des portes de 72 cm de haut et de 40 cm de largeur et des portes de 72 cm de haut et de 60 cm de largeur, puis redimensionnées aux dimensions des portes de tailles voisines. Mais, dans le cas des portes de 153 cm de haut pour les meubles colonnes, il a fallu reprendre la structure de construction, car un redimensionnement étirait trop le dessin.
Nous avons deux meubles spéciaux :
celui de l'évier, ou les façades des tiroirs ne sont la qu'en trompe l'œil et qui possède pas de toit et
un meuble haut avec une porte différente en verre avec des baguettes fines formant un dessin.
Les poignées des meubles présentent également un travail particulier. En respectant le style des façades, nous avons défini :
- une poignée mobile 'métallique' pour les tiroirs
- une poignée 'métallique' avec une plaque et une clef dépassant pour les portes (tore par extrusion et coins par IndexedFaceSet)
Un soin tout particulier a été apporté à la construction d'un évier, aux formes arrondies. Il a été défini à l'aide d'objet produit par le logiciel écrit spécialement. Le robinet lui, est mobile, on peut déplacer le bec et faire tourner les poignées d'un quart de tour.
Un décor a été construit afin de mettre en scène la cuisine, afin de lui donner un peu plus de vie. Un sol carrelé, des murs texturés, ainsi que des objets (lampe au plafond, plante, plat, lampe à pétrole) ont été positionnés. Des ouvertures ont été placé. Ainsi que des lumières, venant de la lampe au plafond et de la baie vitrée.
Les caractéristiques :
Une porte mobile automatique permet de mettre en œuvre à la fois le TouchSensor et les interpolateurs (OrientationInterpolator) et les timer (TimeSensor). On touche la poignée, la porte s'ouvre et se referme toute seule.
Un baie vitrée permet de voir, le mouvement de deux objets à partir d'un seul PlaneSensor.
Le sol est texturé à l'aide d'un PixelTexture et les murs sont texturés par des images.
Les sources lumineuses, une entrant par la baie : DirectionalLight et une autre SpotLight donnée par la lampe au plafond éclairent la scène.
Un interrupteur à été défini afin de mettre en place un script JavaScript. Ce script permet à la fois de gérer les deux positions du bouton et uniquement deux, et d'interagir avec la lumière car le bouton commande la lumière du plafond.
Nous avons réalisé une table, avec des pieds extrudés. Les chaises ont été "piquées" sur le Web.
Un meuble desserte a été également réalisé, comme sur le document de travail. Les dimensions ont été calculées avec précision. Il est formé de clayettes de deux dimensions, d'un plateau au bord arrondi au dessus mais plat en dessous, de roulettes. Les roulettes sont mobiles autour du cylindre de fixation. Elles sont formées d'un capot demi-circulaire et de sphères aplaties. Un porte bouteille construit à l'aide d'IndexedFaceSet, apporte la touche finale.