#VRML V2.0 utf8 Transform { # on deplace l'axe de rotation # l'axe de rotation est déplacé à gauche # de (largeur de la porte)/2-(profondeur de la porte)/2 # le fait de la décaller de 0.8 plutot que 1, permet d'éviter que la porte # n'entre dans le mur une fois qu'elle a tourné d'un quart de tour. translation 0.8 0 0 children Group { children [ # On créée un groupe Transform # Nous allons modifier l'angle de rotation du groupe pour ouvrir la porte DEF Porte Transform { # une fois la rotation opérée, on redécalle la porte vers la droite # pour lui faire prendre sa position normale children Transform { translation -0.8 0 0 children Shape { appearance Appearance { material Material { diffuseColor 1 0 0 } } geometry Box { size 2 2 .4} } } } ] } } # Le proximitySensor. # La porte est au centre de la scène, # le centre du ProximitySensor est aussi celui de la porte # on définit un cube de 8 unités d'arrête autour de la porte # lorsque l'utilisateur va entrer dans le ProximitySensor, la porte va s'ouvrir # lorsqu'il va en sortir la porte va se ferme DEF PS ProximitySensor { size 8 8 8 } # Le TimeSensor qui va rythmer l'animation # Uniquement sur l'ouverture de la porte DEF TimeSOuverture TimeSensor { # La porte s'ouvrira une 1 seconde cycleInterval 1 } # Le TimeSensor qui va rythmer l'animation # Uniquement sur la fermeture de la porte DEF TimeSFermeture TimeSensor { # La porte se fermera une 1 seconde cycleInterval 1 } # De fermé à ouvert DEF OrientationIOuverture OrientationInterpolator { key [ 0, 1 ] keyValue [ 0 1 0 0, 0 1 0 -1.57 ] } # D'ouvert à fermé DEF OrientationIFermeture OrientationInterpolator { key [ 0, 1 ] keyValue [ 0 1 0 -1.57, 0 1 0 0 ] } # Les routes pour l'ouverture # Le TimeSensor pour le PositionInterpolator ROUTE TimeSOuverture.fraction_changed TO OrientationIOuverture.set_fraction # L'OrientationInterpolator recopie son orientation sur le groupe Transform de la porte ROUTE OrientationIOuverture.value_changed TO Porte.set_rotation # Quand on entre dans le ProximitySensor, on démarre le timeSensor de l'ouverture ROUTE PS.enterTime TO TimeSOuverture.startTime # Les routes pour la fermeture # Le TimeSensor pour le PositionInterpolator ROUTE TimeSFermeture.fraction_changed TO OrientationIFermeture.set_fraction # L'OrientationInterpolator recopie son orientation sur le groupe Transform de la porte ROUTE OrientationIFermeture.value_changed TO Porte.set_rotation # Quand on sort dans le ProximitySensor, on démarre le timeSensor pour la fermeture ROUTE PS.exitTime TO TimeSFermeture.startTime # Le decor # On place trois cubes autour de la porte # Ils serviront de mur Transform { translation -2 1 0 children Shape { appearance DEF ApDecor Appearance { material Material { diffuseColor 0 .5 0.3 } } geometry Box { size 2 4 2} } } Transform { translation 2 1 0 children Shape { appearance USE ApDecor geometry Box { size 2 4 2} } } Transform { translation 0 2 0 children Shape { appearance USE ApDecor geometry Box { size 2 2 2} } } Viewpoint { position 0 0 20 }