Animating transforms
monolith.wrl

	

#VRML V2.0 utf8
#
#  Monolith World
#  monolith.wrl
#        by David R. Nadeau
#
#  Six vertical monoliths stand in a world.  Touching a monolith starts
#  it glowing in a pulsing fashion.
#
#  TouchSensors on the monoliths route to TimeSensors, one per monolith.
#  Each TimeSensor routes to the intensity field of a PointLight placed
#  just in front of the monolith.  Simultaneously, a monolith's TimeSensor
#  routes to the transparency field on a Material for a Box surrounding
#  the monolith.
#
#  As a monolith's TimeSensor fraction ramps up from 0.0 to 1.0, the
#  PointLight intensity ramps up from 0.0 (off) to 1.0 (full on).  At
#  the same time, the monolith's outer box transparency ramps from
#  0.0 (opaque) to 1.0 (transparent).  As the transparency increases,
#  an emissive textured inner box for the monolith becomes visible.
#  The inner box's emissive shading makes it appear to be a light source,
#  and the plausible source of the PointLight source's illumination.
#  The overall effect is one of pulsing glowing monoliths.
#
#  A grid mesh floor is used so that localized lighting effects will be
#  obvious.
#
#  Things to experiment with:
#        Try adding a ScalarInterpolator to each monolith and route it's
#        output in to the rotation field of the monolith's TextureTransform.
#        This will rotate the texture on the monolith.
#
#        Instead of the transparent box trick, try using a ColorInterpolator
#        to gradually increase the emissiveColor of a single monolith box
#        while decreasing the box's diffuseColor.
#
#        Try routing the TimeSensor's outputs in to a ScalarInterpolator
#        that varies up and down smoothly, then route this output in to the
#        light source's intensity, etc.  Instead of the 0.1-1.0 ramp, then
#        instant fall to 0.0 that the TimeSensor's fraction output gives, you
#        can shape an arbitrary smooth rise and fall curve in the Scalar
#        Interpolator's key values.
#

WorldInfo {
    title "Monolith World"
    info [ "Copyright (c) 1997, David R. Nadeau" ]
}

Viewpoint {
    position 0.0 1.6 9.0
    description "Entry View"
}

NavigationInfo {
    type [ "WALK", "ANY" ]
    headlight FALSE
}

Background {
    skyColor [
        0.0 0.0 0.0,
        0.0 0.0 0.0,
        0.0 0.1 0.5,
    ]
    skyAngle [
        1.37,
        1.57,
    ]
}


#
#  Generic light source used to give the world ambience before any
#  monoliths start glowing
#
PointLight {
    ambientIntensity 0.1
    color 0.2 0.2 0.2
    location 0.0 8.0 10.0
}


#
#  Glowing monoliths and their light sources
#        The monoliths are all structurally the same, but they have
#        different positions, and slightly different texture transforms
#        This latter difference insures that the texture on each
#        monolith is different.
#
#        A better way to do this would be to create a PROTO for the
#        monolith, then provide an argument to the PROTO node that
#        alters the texture transform.
#
DEF Monolith1Light PointLight {
    intensity 0.0
    ambientIntensity 0.2
    color 0.8 0.4 0.0
    location 0.0 2.0 0.5
}
Transform {
    translation 0.0 2.0 0.0
    children [
	# Outer
	Shape {
	    appearance Appearance {
		material DEF Monolith1Facade Material {
		    diffuseColor 0.2 0.2 0.2
		    transparency 0.0
		}
	    }
	    geometry DEF MonolithOuterBox Box {
		size 2.0 4.0 0.3
	    }
	}
	# Inner
	Shape {
	    appearance Appearance {
		material NULL # emissive texturing
		texture DEF MonolithInnerFire ImageTexture {
		    url "fire.jpg"
		}
		textureTransform TextureTransform {
		    scale 0.5 0.5
		}
	    }
	    geometry DEF MonolithInnerBox Box {
		size 1.9 3.9 0.2
	    }
	}
	DEF Monolith1Touch TouchSensor {
	}
    ]
}

DEF Monolith2Light PointLight {
    intensity 0.0
    ambientIntensity 0.2
    color 0.8 0.4 0.0
    location -3.0 2.0 2.5
}
Transform {
    translation -3.0 2.0 2.0
    children [
	# Outer
	Shape {
	    appearance Appearance {
		material DEF Monolith2Facade Material {
		    diffuseColor 0.2 0.2 0.2
		    transparency 0.0
		}
	    }
	    geometry USE MonolithOuterBox
	}
	# Inner
	Shape {
	    appearance Appearance {
		material NULL # emissive texturing
		texture USE MonolithInnerFire
		textureTransform TextureTransform {
		    scale 0.3 0.3
		    translation 0.2 0.2
		}
	    }
	    geometry USE MonolithInnerBox
	}
	DEF Monolith2Touch TouchSensor {
	}
    ]
}

DEF Monolith3Light PointLight {
    intensity 0.0
    ambientIntensity 0.2
    color 0.8 0.4 0.0
    location 4.0 2.0 -1.5
}
Transform {
    translation 4.0 2.0 -2.0
    children [
	# Outer
	Shape {
	    appearance Appearance {
		material DEF Monolith3Facade Material {
		    diffuseColor 0.2 0.2 0.2
		    transparency 0.0
		}
	    }
	    geometry USE MonolithOuterBox
	}
	# Inner
	Shape {
	    appearance Appearance {
		material NULL # emissive texturing
		texture USE MonolithInnerFire
		textureTransform TextureTransform {
		    scale 0.1 0.1
		    translation 0.3 0.5
		}
	    }
	    geometry USE MonolithInnerBox
	}
	DEF Monolith3Touch TouchSensor {
	}
    ]
}

DEF Monolith4Light PointLight {
    intensity 0.0
    ambientIntensity 0.2
    color 0.8 0.4 0.0
    location 4.5 2.0 3.5
}
Transform {
    translation 4.5 2.0 3.0
    children [
	# Outer
	Shape {
	    appearance Appearance {
		material DEF Monolith4Facade Material {
		    diffuseColor 0.2 0.2 0.2
		    transparency 0.0
		}
	    }
	    geometry USE MonolithOuterBox
	}
	# Inner
	Shape {
	    appearance Appearance {
		material NULL # emissive texturing
		texture USE MonolithInnerFire
		textureTransform TextureTransform {
		    scale 0.2 0.2
		    translation 0.4 0.6
		}
	    }
	    geometry USE MonolithInnerBox
	}
	DEF Monolith4Touch TouchSensor {
	}
    ]
}

DEF Monolith5Light PointLight {
    intensity 0.0
    ambientIntensity 0.2
    color 0.8 0.4 0.0
    location -3.5 2.0 -4.5
}
Transform {
    translation -3.5 2.0 -5.0
    children [
	# Outer
	Shape {
	    appearance Appearance {
		material DEF Monolith5Facade Material {
		    diffuseColor 0.2 0.2 0.2
		    transparency 0.0
		}
	    }
	    geometry USE MonolithOuterBox
	}
	# Inner
	Shape {
	    appearance Appearance {
		material NULL # emissive texturing
		texture USE MonolithInnerFire
		textureTransform TextureTransform {
		    scale 0.2 0.4
		    translation 0.5 0.1
		}
	    }
	    geometry USE MonolithInnerBox
	}
	DEF Monolith5Touch TouchSensor {
	}
    ]
}

DEF Monolith6Light PointLight {
    intensity 0.0
    ambientIntensity 0.2
    color 0.8 0.4 0.0
    location 2.0 2.0 -5.5
}
Transform {
    translation 2.0 2.0 -6.0
    children [
	# Outer
	Shape {
	    appearance Appearance {
		material DEF Monolith6Facade Material {
		    diffuseColor 0.2 0.2 0.2
		    transparency 0.0
		}
	    }
	    geometry USE MonolithOuterBox
	}
	# Inner
	Shape {
	    appearance Appearance {
		material NULL # emissive texturing
		texture USE MonolithInnerFire
		textureTransform TextureTransform {
		    scale 0.2 0.4
		    translation 0.5 0.1
		}
	    }
	    geometry USE MonolithInnerBox
	}
	DEF Monolith6Touch TouchSensor {
	}
    ]
}


#
#  Floor mesh
#
Inline {
    url "floor.wrl"
}


#
#  Animation control
#
#  For each monolith, route its touch sensor in to the timer to start it.
#  Route the timer's fraction output in to the facade box's transparency
#  level and the light's intensity level.
#
#  Use different cycle intervals for each time sensor so that they
#  monoliths pulse in an apparently random, out of sync manner.
#
DEF Monolith1Timer TimeSensor {
    cycleInterval 4.0
    loop FALSE
    startTime 0.0
    stopTime 0.1
}
ROUTE Monolith1Touch.touchTime        TO Monolith1Timer.set_startTime
ROUTE Monolith1Timer.fraction_changed TO Monolith1Facade.set_transparency
ROUTE Monolith1Timer.fraction_changed TO Monolith1Light.set_intensity


DEF Monolith2Timer TimeSensor {
    cycleInterval 4.5
    loop FALSE
    startTime 0.0
    stopTime 0.1
}
ROUTE Monolith2Touch.touchTime        TO Monolith2Timer.set_startTime
ROUTE Monolith2Timer.fraction_changed TO Monolith2Facade.set_transparency
ROUTE Monolith2Timer.fraction_changed TO Monolith2Light.set_intensity


DEF Monolith3Timer TimeSensor {
    cycleInterval 5.0
    loop FALSE
    startTime 0.0
    stopTime 0.1
}
ROUTE Monolith3Touch.touchTime        TO Monolith3Timer.set_startTime
ROUTE Monolith3Timer.fraction_changed TO Monolith3Facade.set_transparency
ROUTE Monolith3Timer.fraction_changed TO Monolith3Light.set_intensity


DEF Monolith4Timer TimeSensor {
    cycleInterval 5.5
    loop FALSE
    startTime 0.0
    stopTime 0.1
}
ROUTE Monolith4Touch.touchTime        TO Monolith4Timer.set_startTime
ROUTE Monolith4Timer.fraction_changed TO Monolith4Facade.set_transparency
ROUTE Monolith4Timer.fraction_changed TO Monolith4Light.set_intensity


DEF Monolith5Timer TimeSensor {
    cycleInterval 6.0
    loop FALSE
    startTime 0.0
    stopTime 0.1
}
ROUTE Monolith5Touch.touchTime        TO Monolith5Timer.set_startTime
ROUTE Monolith5Timer.fraction_changed TO Monolith5Facade.set_transparency
ROUTE Monolith5Timer.fraction_changed TO Monolith5Light.set_intensity


DEF Monolith6Timer TimeSensor {
    cycleInterval 6.5
    loop FALSE
    startTime 0.0
    stopTime 0.1
}
ROUTE Monolith6Touch.touchTime        TO Monolith6Timer.set_startTime
ROUTE Monolith6Timer.fraction_changed TO Monolith6Facade.set_transparency
ROUTE Monolith6Timer.fraction_changed TO Monolith6Light.set_intensity