 
      |  | 
 | 

 Installation.
Installation.
      
    
     Obtenir un viewer 3d:
Obtenir un viewer 3d: Utiliser les formulaires:
Utiliser les formulaires:x-tp/x-vrml97. Donc,
	utilisez le menu preferences->applications de votre navigateur pour
	ajouter votre helper à la liste.
 Introduction.
 Introduction.
      
    
     VRML (Virtual Reality Modeling Langage)
	VRML (Virtual Reality Modeling Langage)
       Conventions géométriques:
	Conventions géométriques:
       Structure d'un fichier VRML 97:
	Structure d'un fichier VRML 97:
      #VRML V2.0 utf8
MOT_CLÉ { PARAMÈTRES ... } et permet de produire des
	    formes ou des transformations géométriques, spécifier l'apparence
	    des objets, rajouter du texte ... Tous les paramêtres sont
	    optionnels, et des valeurs par défaut sont garanties. Si vous ne
	    voulez que les valeurs par défaut, vous êtes cependant obligés de
	    mettre les accolades. Ainsi, pour créer un cube, vous pouvez
	    écrire simplement ceci: Box { }
	    Les noeuds du langage ne peuvent pas s'utiliser n'importe comment
	    et à n'importe quelle place dans le fichier. Il existe en
	    particulier des «noeuds de groupe» qui peuvent contenir certains
	    autres noeuds dans leur paramètres. Nous en verrons certains.
	  DEF cube Box { size 3 3 3 }
	    Ensuite, au lieu d'être obligé de réécrire le noeud et l'ensemble
	    de ses paramêtres à chaque fois que vous en avez besoin, vous
	    pouvez simplement écrire: USE cubeNote: L'appel à DEF exécute réellement le noeud en question. Il ne s'agit donc pas seulement d'une définition, car le noeud défini prend effet immédiatement.

 Production des objets.
	Production des objets.
      
    
    Un objet au sens VRML est compose de deux éléments principaux: une géométrie et une apparence. Ce couple défini ce que l'on appelle une "forme" en VRML. Pour pouvoir utiliser un objet, on est donc obligé de passer par le noeud correspondant, le noeud Shape:
 Spécification
	  de «Forme»:
Spécification
	  de «Forme»:
      Le champ appearance, si non nul, contient un noeud Appearance qui permet de définir la couleur, les textures etc. Ceci sera vu plus tard, dans la section "Apparence". Le champ geometry contient un noeud spécifiant une géometrie d'objet, par exemple les primitives géométriques décrites dans la section suivante.

 Primitives géométriques.
 Primitives géométriques.
      
    
     VRML 97 reconnait 4 objets de base: boîtes, cônes, cylindres et
	sphères.
	VRML 97 reconnait 4 objets de base: boîtes, cônes, cylindres et
	sphères.
      
 A l'aide du champ ci-dessous:
	A l'aide du champ ci-dessous:
      
 Apparence des objets.
	Apparence des objets.
      
    
    Le noeud Appearance dont nous avons déja parlé contient deux champs, permettant de définir un "matériau" (couleur de l'objet, réflexion de la lumière) et une texture (image à plaquer sur l'objet). Sa syntaxe est la suivante:
 Spécification
	  d'«Apparence»:
Spécification
	  d'«Apparence»:
      Les champs material et texture contiennent des noeuds que nous allons voir immédiatement. Si le champ material est nul, aucune lumière n'est prise en compte. Si le champ texture est nul, l'objet n'est pas texturé.
Maintenant que nous avons les formes, nous allons donner une apparence aux objets. Il existe deux manières essentielles de modifier l'apparence d'un objet: définir un «matériau» (couleur de l'objet, manière dont il réfléchi la lumière etc.), et définir une «texture» (image calquée directement sur l'objet).
 Définir un matériau.
	Définir un matériau.
      
	  - Les paramètres sont soit des composantes de couleurs en RVB
	  comprises entre 0 et 1, soit des coefficients également compris
	  entre 0 et 1.
	  - diffuseColor défini la couleur de l'objet, au sens le
	  plus général du terme. Les lumières de la scène influent sur
	  l'apparence de l'objet grâce à cette couleur, en fonction de l'angle
	  de réflection de la lumière sur l'objet.
	  - ambientIntensity correspond à l'influence de la lumière
	  ambiente de la scène sur l'objet. La lumière ambiente est aussi
	  produite par les lumières de la scène, mais ne dépend pas des
	  diverses réflections (lumière isotropique).
	  - specularColor défini la couleur des rayons lumineux
	  réfléchis sur la surface de l'objet et renvoyés vers le point de vue
	  de l'utilisateur. C'est ce qui sert à produire les reflets localisés
	  sur des boules métaliques par exemple.
	  - emmissiveColor défini une couleur propre à l'objet, comme
	  s'il était luminescent. C'est à dire qu'en l'abscence de
	  lumière, l'objet emet cette couleur.
	  - Les champs shininess et transparency ne
	  nécessitent sans doute pas plus de détail que leur propre nom n'en
	  donne...
      
 À l'aide du champ ci-dessous,
	À l'aide du champ ci-dessous,
       Définir une texture.
	Définir une texture.
      
	  - url contient l'URL d'une image devant servir pour texturer
	  l'objet.
	
Ce noeud permet de définir une image pixel par pixel directement dans le code VRML. Le format du champ image est le suivant:
width height size [pixels ...]- width et height spécifient la taille de l'image (en pixels)
 À l'aide du champ ci-dessous,
	À l'aide du champ ci-dessous,
      
 Transformation et positionnement des objets.
	Transformation et positionnement des objets.
      
    
    Maintenant que nous savons créer des objets et leur donner une apparence particulière, nous allons pouvoir les transformer et les positionner dans la scène.
 Les objets précédents peuvent être
	  manipulés
Les objets précédents peuvent être
	  manipulés
      
Ce noeud fait partie de ce qu'on appelle les «noeuds de groupe». Ce sont des noeuds qui ont la propriété de pouvoir contenir d'autres noeuds du langage dans leur paramètres. Ici, le paramètre children contient d'autres noeuds (en particulier des Shape), auxquels les transformations géométriques seront appliquées.
	  Les transformations géométriques effectuées par ce noeud sont les
	  suivantes: 
	  - translation déplace l'objet selon les axes X Y et Z.
	  - rotation (x y z a) tourne de a (en radians) autour du
	  vecteur (x y z).
	  - scale (homothétie) modifie l'échelle selon les 3 axes du
	  repère défini par scaleOrientation (cet axe fonctionne de la
	  même manière que le paramètre rotation).
      
 À l'aide du champ ci-dessous,
À l'aide du champ ci-dessous,
       Pour mieux comprendre le noeud
	  Transform ...
Pour mieux comprendre le noeud
	  Transform ...
      Considérons que les opérations géométriques effectuées se déroulent dans l'ordre suivant:
| Transform { translation T rotation R scaleFactor S scaleOrientation SR center C } | <==> | - Translation de -C - Rotation de -RS - Homothétie de S - Rotation de RS - Rotation de R - Translation de C - Tranlsation de T | 

 Lumière !
Lumière !
      
    
    En général, les viewers s'occupent de mettre une lumière ambiante dans les scènes, et offrent souvent la possibilité de mettre une head light c'est à dire une lampe collée sur votre front ! Il peut parfois être utile de définir soi-même ses propres sources de lumière. Il en existe trois :
 Source ponctuelle:
Source ponctuelle:
	  - intensity spécifie l'intensité de la lumière.
	  - color spécifie sa couleur.
	  - location spécifie l'endroit où se trouve la source
	  ponctuelle. 
	  - radius spécifie la distance (en mètres) à l'interieur de
	  laquelle cette source lumineuse a un effet sur les objets. 
	  - attenuation donne les 3 coéficients d'une équation du
	  second degré donnant l'atténuation de la lumière en fonction de la
	  distance à l'objet éclairé. 
	  - ambientIntensity spécifie la quantité de lumière ambiente
	  générée par cette source.
      
 Projecteur:
Projecteur:
	  - direction donne la direction, ou l'axe du cône.
	  - cutOffAngle détermine l'angle d'ouverture du cône (à
	  l'interieur duquel la lumière est émise). Plus on se rapproche des
	  bords du cône, plus la lumière est atténuée grâce au champ
	  attenuation. 
	  - beamWidth détermine un cône interieur dans lequel la
	  lumière n'est pas atténuée (elle ne commencera à l'être qu'après
	  franchissement de ce sous-cône).
      
 Source directionnelle:
Source directionnelle: A l'aide du champ ci-dessous:
A l'aide du champ ci-dessous:
      
 Animation
 Animation
      
    
     VRML 97 permet d'animer les objets de façon plus ou moins complexe:
	VRML 97 permet d'animer les objets de façon plus ou moins complexe:
	 Les événements
      Les événements Les horloges
      Les horloges
	TimeSensor { 
	  exposedField SFTime cycleInterval 1.0 
	  exposedField SFBool enabled TRUE 
	  exposedField SFBool loop FALSE 
	  exposedField SFTime startTime 0.0 
	  exposedField SFTime stopTime 0.0 
	  eventOut SFTime cycleTime
	  eventOut SFFloat fraction_changed
	  eventOut SFBool isActive
	  eventOut SFTime time
	}
	Le champ cycleInterval détermine la durée d'un
	intervalle de temps en secondes (par défaut, 1 seconde). Le
	booléen enabled permet d'activer l'horloge tandis que
	loop permet de génèrer continuellement des événements
	au lieu de s'arrêter au premier intervalle. Les champs
	startTime et stopTime permettent de définir les
	dates de début et de fin de génération d'événements à partir
	du début de la scène. Les événements en sortie sont utilisés
	pour créer des animations; en particulier, l'événement
	fraction_changed pourra être récupéré par un
	interpolateur.
      
    
 Les interpolateurs
      Les interpolateurs
	PositionInterpolator { 
	  eventIn SFFloat set_fraction
	  exposedField MFFloat key [] 
	  exposedField MFVec3f keyValue [] 
	  eventOut SFVec3f value_changed
	}
	Le champ key est la liste des instants-clés de
	l'animation (ici, un déplacement), et le champ keyValue
	est la liste correspondante des valeurs-clés (ici, des
	positions). L'événement en entrée set_fraction permet
	de récupérer les fractions de temps générées par un
	TimeSensor, et l'événement en sortie
	value_changed renvoie la valeur-clé ou la valeur
	interpolée correspondant à la fraction de temps reçue.
    
 À l'aide du champ ci-dessous:
      À l'aide du champ ci-dessous:
     Les capteurs
      Les capteurs À l'aide du champ ci-dessous:
      À l'aide du champ ci-dessous:
    
 Quelques autres noeuds ...
	Quelques autres noeuds ...
      
    
    Voici en vrac un certain nombre d'autres noeuds intéressants. Attention, tous ne sont pas nécessairement supportés par le viewer que vous utilisez ...
 Ancres www:
	Ancres www:
       Billboard:
	Billboard:
       Collisions:
	Collisions:
       Texte:
	Texte:
      
 Un exemple complet.
	Un exemple complet.
      
    
    Un bon bout de code vaut mieux qu'un long discours ... Voici donc en cadeau une bille de clown, avec presque tous les noeuds qu'on a pu voir dans ce tutoriel. Triturez, déformez, cliquez-lui sur le nez ...