Les objets complexes

Les objets complexes peuvent être difficiles à obtenir par mélange de formes simples : Terrains, Animaux, Plantes, Véhicules ...

Au lieu de construire ces objets à partir de formes primitives, on les construits à partir de formes atomiques : Points, Lignes, Faces

Les objets complexes sont rarement créés avec un éditeur de texte. On utilisera plutôt une application graphique 3D appelée un modeleur. La plupart de ces applications permettent de générer du VRML.

On peut citer :

Cosmoworld - SGI : http://www.sgi.com 
3DS Max - Kinetix : http://www.ktx.com/
Internet 3D Space Builder - Paragraph http://www.paragraph.com/
VRealm Builder - IDS http://www.ids-net.com/
Webgraphics Suite - Corel http://www.corel.com/
3D Website builder - Virtus http://www.virtus.com/

Construction d'objets à partir de coordonnées

La construction d'objet à partir de coordonnées se fait en 2 étapes : Placement de points par définition de coordonnées 3D. Connexion de ces points pour former des objets.

La définition de coordonnées est relative au référentiel courant et se fait dans un noeud Coordinate.

La connexion de ces coordonnées est faite par un noeud de géométrie parmi les suivants : PointSet IndexedLineSet IndexedFaceSet

Noeud Coordinate

Un noeud Coordinate contient une liste de coordonnées nécessaire à la construction d'un objet : 

point : MFVect3f ( Liste des coordonnées ) 
Les coordonnées (de R3) sont séparées par une virgule

Coordinate { 
    point [ 
                # X   Y   Z 
                2.0 1.0 3.0,
                4.0 2.5 5.3, 
                . . .
     ]
}

Noeud PointSet

Un noeud PointSet définit un nuage de points dans R3 : 

    coord : SFNode ( Noeud de définition des coordonnées ) 
    Un point est placé à chaque coordonnée

Shape { 
    appearance Appearance { . . . }
    geometry PointSet { 
        coord Coordinate {
            point [ . . . ]
         }
    }
}

 

Noeud IndexedLineSet

Un noeud IndexedLineSet définit un ensemble de lignes brisées construites sur des points : 

coord : SFNode ( Noeud de définition des coordonnées des points ) 
coordIndex : MFInt32 ( Noeud de définition des lignes brisées )
on indique dans coordIndex les indices des points (dans le noeud coord) composant chaque ligne brisée en terminant chaque ligne par -1
exemple : 0, 1, 2, 3, -1, 4, 5, -1 définit deux lignes : 
la première passe par les points d'indices 0 1 2 et 3, 
la seconde par les points d'indices 4 et 5. 

Shape { 
    appearance Appearance { . . . }
    geometry IndexedLineSet {
        coord Coordinate { point [ . . . ] }
        coordIndex [ . . . ]
    }
}

Exemple :

        # Dessin des Axes dans le fichier ci-dessous
        Shape {
            appearance Appearance {
                material Material {
                    diffuseColor 1.0 1.0 1.0 # blanc
                }
            }
            geometry IndexedLineSet {
                coord Coordinate {
                    point [
                         0.0 0.0 0.0, # origine (pt numéro 0)
			10.0 0.0 0.0, # X maximum (pt numéro 1)
			 0.0 8.0 0.0  # Y maximum (pt numéro 2)
                    ]
                }
                coordIndex [
                    	0, 1, -1,  # première ligne
			0, 2, -1   # deuxième ligne
                ]
            }
        }

 

 

Noeud IndexedFaceSet

Un noeud IndexedFaceSet définit un objet à partir d'un ensemble de polygones : 

coord : SFNode ( Noeud de définition des coordonnées des points ) 
coordIndex : MFInt32 ( Noeud de définition des polygones ) 
on indique dans coordIndex les indices des points (dans le noeud coord) composant chaque polygone en terminant chaque polygone par -1
exemple : 0, 1, 2, 3, -1, 4, 5, 6, -1 définit deux polygones : 
le premier passe par les points d'indices 0 1 2 et 3 (c'est un polygone à quatre cotés), 
le second par les points d'indices 4, 5 et 6 (c'est donc un triangle). 
solid : SFBool ( Indique que les faces de l'objet doivent être dessinées des deux cotés )
ccw : SFBool ( Indicateur d'ordre des sommets des polygones. ccw signifie couter-clock wise : dans le sens contraire des aiguilles d'une montre )
convex : SFBool ( Indicateur de convexité des polygones )
de nombreux autres champs existent permettant de préciser la couleur en chaque point ou sur chaque face, comment l'objet doit être texturé, qu'elles sont les normales aux points ou aux faces (permet de faire des effets d'éclairage sur l'objet)...

Shape {
    appearance Appearance { . . . }
    geometry IndexedFaceSet {
        coord Coordinate { . . . }
        coordIndex [ . . . ]
        solid TRUE
        ccw TRUE
        convex TRUE
    }
}

Exemple :

Shape {
	appearance Appearance {
		material Material {
			diffuseColor 1.0 1.0 0.0 # jaune
		}
	}
	geometry IndexedFaceSet {
		coord Coordinate {
			point [
			# Pointe de l'éclair
				0.0  0.0  0.0,
			# Points de la face avant
				5.5  5.0  0.88,
				4.0  5.5  0.968,
				7.0  8.0  1.408,
				4.0  9.0  1.584,
				1.0  5.0  0.88,
				2.5  4.5  0.792,
			# Points de la face arrière
				5.5  5.0 -0.88,
				4.0  5.5 -0.968,
				7.0  8.0 -1.408,
				4.0  9.0 -1.584,
				1.0  5.0 -0.88,
				2.5  4.5 -0.792,
			]
		}
		coordIndex [
		# Face avant
			0,  1,  2,  3,  4,  5,  6, -1,
		# Face arrière
			0, 12, 11, 10,  9,  8,  7, -1,
		# Cotés
			0,  7,  1, -1,
			1,  7,  8,  2, -1,
			2,  8,  9,  3, -1,
			3,  9, 10,  4, -1,
			4, 10, 11,  5, -1,
			5, 11, 12,  6, -1,
			6, 12,  0, -1,
		]
		convex FALSE
		solid TRUE
		ccw TRUE
	}
}

Contrôle de la couleur d'un objet

Un noeud Material définit un matériau applicable à la totalité d'un objet.

On peut fixer la couleur d'une partie d'un objet en utilisant un noeud Color.

Un noeud Color contient un ensemble de triplet RGB. Color { color [ 1.0 0.0 0.0, . . . ] }

Un noeud Color peut être utilisé comme valeur du champ color des noeuds de géométrie IndexedFaceSet, IndexedLineSet, PointSet et ElevationGrid.

Pour les IndexedLineSet, on utilisera ensuite le champ colorPerVertex pour indiquer si les couleurs doivent être traitées par sommet ou par ligne. Le champ colorIndex servant à préciser les indices des couleurs à appliquer au sommets (dans l'ordre des sommets du champ coord) ou aux lignes (dans l'ordre de définition des lignes du champ coordIndex).

Pour les IndexedFaceSet, on utilisera ensuite le champ colorPerVertex pour indiquer si les couleurs doivent être traitées par sommet ou par face. Le champ colorIndex servant à préciser les indices des couleurs à appliquer au sommets (dans l'ordre des sommets du champ coord) ou aux faces (dans l'ordre de définition des faces du champ coordIndex).