#VRML V2.0 utf8 # # doorway.wrl # The Doorway # by David R. Nadeau # # Four sliding stairs lead forward along a path to a glowing white # doorway. # # A ProximitySensor routes to four TimeSensors, one per sliding # stair. Each stair's timer routes to a PositionInterpolator that # outputs varying positions side-to-side along the X axis. # The PositionInterpolator's positions are routed into translation # fields for Transform nodes surrounding each stair. # # By using different starting positions, the four stairs are made to # slide back and forth in a pattern. # # Things to experiment with: # Add sound! Perhaps the crackling of fire below and the grinding # sliding sounds of the stone stairs. # # Use a ScalarInterpolator to flicker the red light as if there is # fire below. # # Surround the doorway with an Anchor node that leads somewhere! # # Place a ProximitySensor around the doorway. As you approach it, # the ProximitySensor triggers an OrientationInterpolator which # slowly rotates the door open. The open door reveals ... ! # WorldInfo { title "The Doorway" info [ "Copyright (c) 1997, David R. Nadeau" ] } DEF Entry Viewpoint { position 0.0 3.1 10.0 description "Entry View" } NavigationInfo { type [ "WALK", "ANY" ] avatarSize [ 0.5, 3.0, 1.5 ] headlight FALSE } DEF Proximity ProximitySensor { size 10.0 10.0 50.0 } Background { skyColor [ 0.0 0.0 0.0, 0.0 0.0 0.0, 1.0 0.0 0.0 ] skyAngle [ 1.47, 1.67 ] } # # Generic light sources used to give the world ambience # #PointLight { # ambientIntensity 0.0 # intensity 1.0 # color 0.6 0.6 0.6 # location 0.0 6.0 -8.0 #} DirectionalLight { ambientIntensity 0.5 intensity 1.0 #color 0.0 0.15 0.5 color 0.0 0.3 1.0 direction 1.0 -1.0 -3.0 } DirectionalLight { ambientIntensity 0.3 intensity 1.0 color 1.0 0.0 0.0 direction -1.0 2.5 -1.0 } DirectionalLight { ambientIntensity 0.0 intensity 1.0 color 1.0 0.0 0.0 direction -1.0 2.5 -1.0 } # # Path to stairs # Transform { translation 0.0 -0.5 8.0 children [ Shape { appearance Appearance { material Material { diffuseColor 0.8 0.8 0.8 } texture DEF Granit ImageTexture { url "granit_g.jpg" } textureTransform TextureTransform { scale 0.5 0.5 } } geometry Box { size 4.0 0.4 16.0 } } ] } # # Moving stairs # DEF Stair1 Transform { translation 0.0 0.0 0.0 children [ DEF Stair Inline { url "tread.wrl" } ] } Transform { translation -1.0 0.5 -2.0 children [ DEF Stair2 Transform { translation 0.0 0.0 0.0 children [ USE Stair ] } ] } Transform { translation 1.5 1.0 -4.0 children [ DEF Stair3 Transform { translation 0.0 0.0 0.0 children [ USE Stair ] } ] } Transform { translation 0.0 1.5 -6.0 children [ DEF Stair4 Transform { translation 0.0 0.0 0.0 children [ USE Stair ] } ] } # # The last stair and a door # Transform { translation 0.0 2.0 -8.0 children [ USE Stair ] } Transform { translation 0.0 2.0 -10.0 scale 0.7 0.7 0.7 children [ Inline { url "glowdoor.wrl" } ] } # # An archway above the door # Transform { translation -2.0 6.0 -10.0 rotation 0.0 0.0 1.0 0.785 children [ DEF ArchBox Shape { appearance Appearance { material Material { ambientIntensity 0.0 diffuseColor 1.0 1.0 1.0 emissiveColor 0.4 0.4 0.4 } texture ImageTexture { url "marble_g.jpg" } } geometry Box { size 4.0 0.2 2.0 } } Transform { translation 1.0 0.2 1.0 children [ USE ArchBox ] } Transform { translation 2.0 0.4 2.0 children [ USE ArchBox ] } ] } Transform { translation 2.0 6.0 -10.0 rotation 0.0 0.0 1.0 -0.785 children [ USE ArchBox, Transform { translation -1.0 0.2 1.0 children [ USE ArchBox ] } Transform { translation -2.0 0.4 2.0 children [ USE ArchBox ] } ] } # # Animation control # # For each stair, a TimeSensor is triggered by a world ProximitySensor. # Once triggered, the time sensor outputs fractions forever. The fractions # are routed in to PositionInterpolators that smoothly interpolate a # sliding position back and forth along the X axis. These positions are # routed in to translations for the individual stairs. # DEF Stair1Timer TimeSensor { cycleInterval 4.0 loop TRUE } DEF Stair1Path PositionInterpolator { key [ 0.0, 0.25, 0.5, 0.75, 1.0 ] keyValue [ 0.0 0.0 0.0, 3.0 0.0 0.0, 0.0 0.0 0.0, -3.0 0.0 0.0, 0.0 0.0 0.0 ] } ROUTE Proximity.enterTime TO Stair1Timer.set_startTime ROUTE Stair1Timer.fraction_changed TO Stair1Path.set_fraction ROUTE Stair1Path.value_changed TO Stair1.set_translation DEF Stair2Timer TimeSensor { cycleInterval 4.0 loop TRUE } DEF Stair2Path PositionInterpolator { key [ 0.0, 0.25, 0.5, 0.75, 1.0 ] keyValue [ 3.0 0.0 0.0, 0.0 0.0 0.0, -3.0 0.0 0.0, 0.0 0.0 0.0, 3.0 0.0 0.0 ] } ROUTE Proximity.enterTime TO Stair2Timer.set_startTime ROUTE Stair2Timer.fraction_changed TO Stair2Path.set_fraction ROUTE Stair2Path.value_changed TO Stair2.set_translation DEF Stair3Timer TimeSensor { cycleInterval 4.0 loop TRUE } DEF Stair3Path PositionInterpolator { key [ 0.0, 0.25, 0.5, 0.75, 1.0 ] keyValue [ -3.0 0.0 0.0, 0.0 0.0 0.0, 3.0 0.0 0.0, 0.0 0.0 0.0, -3.0 0.0 0.0 ] } ROUTE Proximity.enterTime TO Stair3Timer.set_startTime ROUTE Stair3Timer.fraction_changed TO Stair3Path.set_fraction ROUTE Stair3Path.value_changed TO Stair3.set_translation DEF Stair4Timer TimeSensor { cycleInterval 4.0 loop TRUE } DEF Stair4Path PositionInterpolator { key [ 0.0, 0.25, 0.5, 0.75, 1.0 ] keyValue [ 0.0 0.0 0.0, -3.0 0.0 0.0, 0.0 0.0 0.0, 3.0 0.0 0.0, 0.0 0.0 0.0 ] } ROUTE Proximity.enterTime TO Stair4Timer.set_startTime ROUTE Stair4Timer.fraction_changed TO Stair4Path.set_fraction ROUTE Stair4Path.value_changed TO Stair4.set_translation