Transforming shapes
towers.wrl
#VRML V2.0 utf8
#
# The Tower
# towers.wrl
# by David R. Nadeau
#
# This world illustrates the use of translation, rotation, and scaling to
# build a multi-level tower.
#
# A tower is built starting with a single pole and archway inlined
# from "towerprt.wrl". This part is instanced 12 times around the perimeter
# of the tower by doing successive rotations. Add a cylinder for the
# ceiling, and a level is complete.
#
# A level is then instanced three more times to build the next three upper
# levels of the tower. Each instance moves up to the next level, then
# scales the generic level down a bit and puts it there. This repeated
# scaling is what gives the tower it's diminishing size for the upper
# levels.
#
# A glowing, rotating cube is added to the top of the generic tower. An
# OrientationInterpolator keeps the cube rotating.
#
# Things to experiment with:
# Add sound!
#
# Add a spiraling ramp that leads to the upper levels. Perhaps put
# something interesting on each level. Perhaps make the rotating
# cube on top do something... such as be an Anchor leading to
# another world!
#
WorldInfo {
title "The Tower"
info [ "Copyright (c) 1997, David R. Nadeau" ]
}
Viewpoint {
position 0.0 1.6 20.0
orientation 1.0 0.0 0.0 0.2
description "Entry View"
}
NavigationInfo {
type [ "WALK", "ANY" ]
headlight FALSE
speed 2.0
}
Background {
skyColor [
0.0 0.0 0.0,
0.0 0.0 0.0,
0.0 0.5 0.0,
]
skyAngle [
1.37,
1.57,
]
}
#
# Generic lighting
#
DirectionalLight {
direction 1.0 -0.5 -1.0
color 1.0 1.0 1.0
ambientIntensity 0.2
intensity 1.0
}
DirectionalLight {
direction -1.0 1.0 -1.0
color 0.0 0.3 1.0
ambientIntensity 0.2
intensity 0.7
}
#
# Tower
#
Transform {
scale 0.4 0.4 0.4
children [
#
# Bottom tower level
#
DEF OneLevel Transform {
translation 0.0 3.5 0.0
scale 2.0 1.0 2.0
children [
#
# Half a level using 6 pole-and-arch parts in a half
# circle
#
DEF HalfLevel Group {
children [
DEF Part Transform {
translation 0.0 0.0 7.73
rotation 0.0 1.0 0.0 0.26
children [
Inline {
url "towerprt.wrl"
}
]
}
Transform {
rotation 0.0 1.0 0.0 0.52
children [ USE Part ]
}
Transform {
rotation 0.0 1.0 0.0 1.05
children [ USE Part ]
}
Transform {
rotation 0.0 1.0 0.0 1.57
children [ USE Part ]
}
Transform {
rotation 0.0 1.0 0.0 2.09
children [ USE Part ]
}
Transform {
rotation 0.0 1.0 0.0 2.62
children [ USE Part ]
}
]
}
#
# Another half a level in order to complete a full circle
#
Transform {
rotation 0.0 1.0 0.0 3.14
children [ USE HalfLevel ]
}
#
# A ceiling for the level
#
Transform {
translation 0.0 3.5 0.0
children [
Shape {
appearance Appearance {
material Material {
ambientIntensity 0.6
}
texture ImageTexture {
url "marble_g.jpg"
}
textureTransform TextureTransform {
scale 1.0 1.0
}
}
geometry Cylinder {
height 0.05
radius 8.2
side FALSE
}
}
]
}
]
}
#
# A fake shadow under the first level
#
Shape {
appearance Appearance {
material Material {
diffuseColor 0.0 0.0 0.0
transparency 0.25
}
}
geometry Cylinder {
height 0.05
radius 16.4
side FALSE
bottom FALSE
}
}
#
# Second tower level
#
Transform {
translation 0.0 7.0 0.0
rotation 0.0 1.0 0.0 0.26
scale 0.8 0.9 0.8
children [ USE OneLevel ]
}
#
# Third tower level
#
Transform {
translation 0.0 13.3 0.0
scale 0.6 0.8 0.6
children [ USE OneLevel ]
}
#
# Fourth tower level
#
Transform {
translation 0.0 18.9 0.0
rotation 0.0 1.0 0.0 0.26
scale 0.4 0.7 0.4
children [ USE OneLevel ]
}
#
# Glowing thing
#
DEF Thing Transform {
translation 0.0 31.0 0.0
rotation 0.0 1.0 0.0 0.0
children [
Transform {
rotation -1.0 1.0 1.0 0.785
children [
Shape {
appearance Appearance {
material Material {
ambientIntensity 1.0
diffuseColor 0.0 1.0 0.0
}
texture DEF BlurImage ImageTexture {
url "fire_g.jpg"
}
}
geometry Box {
size 3.0 3.0 3.0
}
}
]
}
]
}
]
}
#
# Floor
#
Shape {
appearance Appearance {
material Material {
ambientIntensity 0.8
diffuseColor 0.0 1.0 0.3
}
texture USE BlurImage
textureTransform TextureTransform {
scale 5.0 5.0
}
}
geometry IndexedFaceSet {
coord Coordinate {
point [
-40.0 0.0 80.0,
40.0 0.0 80.0,
40.0 0.0 -40.0,
-40.0 0.0 -40.0,
]
}
coordIndex [ 0, 1, 2, 3, -1, ]
solid TRUE
}
}
#
# Animation control
#
DEF ThingTimer TimeSensor {
cycleInterval 4.0
loop TRUE
startTime 1.0
stopTime 0.0
}
DEF ThingSpinner OrientationInterpolator {
key [ 0.0, 0.5, 1.0 ]
keyValue [ 0.0 1.0 0.0 0.0, 0.0 1.0 0.0 3.14, 0.0 1.0 0.0 6.28 ]
}
ROUTE ThingTimer.fraction_changed TO ThingSpinner.set_fraction
ROUTE ThingSpinner.value_changed TO Thing.set_rotation