X3D - regroupement et transformations

De EduTech Wiki
Aller à la navigation Aller à la recherche

Cet article est en construction: un auteur est en train de le modifier.

En principe, le ou les auteurs en question devraient bientôt présenter une meilleure version.



Introduction

Un fichier X3D fonctionne comme un "arbre". Dans ce type de fichier, on retrouve les concepts de noeuds parents et noeuds enfants.

Le regroupement des nœuds organisent des objets dans X3D. Pour cela, il existe plusieurs possibilités:

  • Group et StaticGroup: regroupe des noeuds ensemble.
  • Transform : c'est probablement le noeud le plus important. Il contrôle la position, l'orientation et l'échelle (scale) des noeuds enfants.
  • Inline: ce noeud permet d'importer d'autres objets X3D (scene).
  • LOD (level of detail): ce noeud fournit différents niveaux de qualité géométrique selon le point de vue de l'utilisateur (proche ou éloigné).
  • Switch: ce noeud peut être utilisé pour changer facilement le contenu d'une scène ou pour cacher certains nœuds
  • Anchor: ce noeud permet de d'insérer des liens URL vers une autre scène de X3D ou une autre page dans un navigateur Web. En cliquant sur l'ancre, le contenu est remplacé par un autre contenu.
  • Billboard: ce noeud de groupement qui peut contenir plusieurs noeuds. En clair, imaginons un contenu faisant face à un utilisateur. Ce noeud permet de définir un axe autour duquel l'objet fera des rotations.
  • Collision: Le nœud de collision est un nœud de regroupement qui spécifie les propriétés de détection de collision pour les noeuds enfants. Les noeuds de collision peuvent être utilisés pour générer des événements lorsque le spectateur et les objets entrent en collision. Ils peuvent aussi être utilisés pour désigner que certains objets ne doivent pas être considérés comme étant soumis à la détection de collision.


Regroupement (grouping)

Le noeud Group recueille les noeuds ayant un but connexe. Souvent, ces nœuds sont proches les uns des autres dans l'espace 3D.

Si un DEF (DEF defini un ID unique pour le noeud), le groupe de noeuds peut être réutilisés. (voir en:X3D shape and geometry).

Ci dessous, voici un exemple de scène faite avec seulement 3 formes. Nous définissons une maison avec un cube et le cylindre que nous réutilisons deux fois.

X3d-house.jpg


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.2//EN" "../../schemas/x3d-3.2.dtd">
<X3D profile='Interchange' version='3.1' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-3.1.xsd'>
  <head>
    <meta content='house.x3d' name='title'/>
    <meta content='Example for Group node' name='description'/>
  </head>
  <Scene>
    <!-- Creation d'un fond blanc pour l'impression -->
    <Background skyColor='0.9 0.9 0.9'/>

    <!-- Definir une maison: un cube avec un cône sur le dessus -->
    <Group DEF='House'>

      <Transform translation="0 1 0">
	<Shape>
	  <Appearance>
	    <Material diffuseColor='1 1 0'/>
	  </Appearance>
	  <Box/>
	</Shape>
      </Transform>

      <Transform translation="0 2.5 0">
	<Shape DEF='Roof'>
	  <Appearance>
	    <Material diffuseColor='1 0 0'/>
	  </Appearance>
	  <Cone bottomRadius="2" height="1">
	  </Cone>
	</Shape>
      </Transform>

    </Group>

    <!-- Réutilisation: réduction de la forme et positionnement sur le dessus de la maison -->
    <Transform translation="0 2.5 0" scale="0.5 0.5 0.5">    
      <Shape USE="House"/>
    </Transform>

    <!-- Réutilisation : compresser la forme et la mettre à côté -->
    <Transform translation="3.5 0 0" scale="1.0 0.5 0.5">    
      <Shape USE="House"/>
    </Transform>

    <Inline Center="0.0 0.0 0.0" bboxSize="10.5 10.5 10.5" url="../common/coordinates.x3d"/>

    <Transform translation="0 -0.05 0">
      <Shape DEF="floor">
	<Appearance>
	  <Material diffuseColor='0 1 0'/>
	</Appearance>
	<Cylinder height="0.1" radius="5"/>
      </Shape>
    </Transform>

    <Inline url='"../common/coordinates.x3d" "http://tecfa.unige.ch/guides/x3d/ex/common/coordinates.x3d"'/>

  </Scene>
</X3D>


Transformations (Transform)

Le noeud Transform est un noeud de regroupement qui permet de définir les coordonnées (axe X, Y, Z) des noeuds enfants. En clair, ce noeud offre la possibilité de faire des translations, des rotations et des mises à l'échelle.

La racine d'une scène graphique ainsi que toutes les formes que vous créez dans X3D se réfèrent X3D est toujours aux coordonnées (0 0 0). Gràce au noeud Transform , vous pouvez transférer le système de coordonnées d'origine vers un autre système de coordonnées que vous définissez.

Exemple: si vous souhaitez créer deux cubes l'un à côté de l'autre avec la Shape Box, l'un des deux cubes devra être défini à l'intérieur d'une balise Transform.

Dans X3dom documentation, on peut lire :

  • La balise center défini le décalage par rapport au système de coordonnées initial (0,0,0)
  • La balise Rotation défini la rotation du système de coordonnées
  • La balise Scale spécifie l'échelle du système de coordonnées. Les valeurs de l'échelle peuvent être positive, négative ou égale à zéro (la valeur zéro indique que toute la géométrie du noeud enfant ne doit pas être affiché).
  • La balise Scale orientation spécifie la rotation du système de coordonnées avant de procéder au redimensionnement. L'orientation ne s'applique qu'à l'échelle définie.

Ainsi, la balise Transform peut positionner, faire tourner autour d'un axe et redimensionner la taille du/des oibjet(s)(scale) quelconque et de l'échelle. C'est probablement le noeud le plus couramment utilisé pour la mise en page d'une scène 3D.

Voyons maintenant quelques transformations

Translations

Pour comprendre comment fonctionne les translations, il faut comprendre le système des coordonnées expliqué notamment dans en:X3D graphics principles.

Translation = 'x y z'

Les translations sont en mètres depuis l'origine du système de coordonnées (0 0 0)

Rotations

Les rotations sont plus difficiles à comprendre que les rotations car il est possible de définir un axe de rotation arbitraire.

Rotation = 'angle x y z'

x y z détermine l'axe de rotation, l'angle détermine la valeur de la rotation en radians (ie 180 degrees = Pi)

La tableau ci-dessous montre la conversion en radians de quelques valeurs (en degrés):

Conversion des degrés en radians
30: 0.5236
60: 1.0472
90: 1.5708
180: 3.1416
270: 4.7124


Pour faciliter vos conversions, utilisez notre

Javascript Radian Converter


Pour obtenir la rotation que vous souhaitez, nous vous suggérons de faire pivoter un objet seulement autour de l'axe principal (le cas échéant un axe après l'autre) et donc utiliser le code comme par Don Brutzman dans ses diapositives:

<Transform rotation='0 1 0 yaw'>
  <Transform rotation='0 0 1 pitch'>
    <Transform rotation='1 0 0 roll'>
       <!-- Shape (le long de l'axe X et Y) -->
    </Transform>
  </Transform>
</Transform>

Yaw, Pitch et Rool sont les noms d'angles; ces noms ont été empruntés à la navigation à la voile.

Right-hand-rule.gif

La direction de la rotation utilise la règle de la main droite comme cela est expliqué dans la page en:X3D graphics principles

Translations

Lien X3Dom documentation: http://doc.x3dom.org/ Tutoriels de Brutzman