VRML Examples

VRML has been superceded by X3D, but I thought it would be fun to retain these examples for historical interest.

Static Objects

A static picture of a yellow cone

yellowcone.wrl
#VRML V2.0 utf8
#-----------------------------------------------------------------------------
# yellowcone.wrl
#
# A really simple VRML world consisting of a yellow cone lit from above.
#-----------------------------------------------------------------------------

# A directional light source, shining down from above.

DirectionalLight {
  direction 0 -1 0
}

# A yellow cone rotated about 57 degrees from vertical.

Transform {
  rotation 0 0 -1 1
  children [
    Shape {
      appearance Appearance {
        material Material {diffuseColor 1 1 0}
      }
      geometry Cone {
        bottomRadius 2 
        height 8.1
      }
    }
  ]
}

Illustration of textures and anchors

boxandsphere.wrl
#VRML V2.0 utf8
#-----------------------------------------------------------------------------
# boxandsphere.wrl
#
# A really simple VRML world consisting of a ellipsoid and a box.  The
# ellipsoid has a marble texture mapped on to it and the box is anchored
# to LMU's main web page.
#-----------------------------------------------------------------------------

# A light

DirectionalLight {
  direction 1 0 -1
}

# A camera

PerspectiveCamera {
  position -8.6 2.1 5.6
  orientation -0.14 -1 -0.12 1.142
  focalDistance 10.84
}

# A marble ellipsoid

Transform {
  translation 3 0 1
  scale 1.5 1 0.75
  children [
    Shape {
      appearance Appearance {
        material Material {diffuseColor 1 1 0}
        texture ImageTexture {url "marble.jpg"}
      }
      geometry Sphere {
        radius 2.3
      }
    }
  ]
}

# A box with a hyperlink

Transform {
  rotation 0 0 1 3.1 
  translation 2 2.5 1.25
  children [
    Anchor {
      url "http://www.lmu.edu"
      description "Loyola Marymount"
      children [
        Shape {
          appearance Appearance {
            material Material {emissiveColor 1 1 0}
          }
          geometry Box {}
        }
      ]
    }
  ]
}

Case Studies in Creating Axes

Naive way to make axes

axes1.wrl
#VRML V2.0 utf8
#-----------------------------------------------------------------------------
# axes1.wrl
#
# Draws the X, Y and Z coordinate axes, each 10 meters long: X red, Y green
# and Z blue, as cylinders with radius 0.1m.
#
# This is a very ugly document because each axis is constructed separately
# and transforms are used to scale the cylinder.
#-----------------------------------------------------------------------------

# Red X-axis

Transform {
  scale 0.1 5 0.1
  rotation 0 0 1 -1.57080
  translation 5 0 0
  children [
    Shape {
      appearance Appearance {material Material {diffuseColor 1 0 0}}
      geometry Cylinder {}
    }
  ]
}

# Green X-axis

Transform {
  scale 0.1 5 0.1
  translation 0 5 0
  children [
    Shape {
      appearance Appearance {material Material {diffuseColor 0 1 0}}
      geometry Cylinder {}
    }
  ]
}

# Blue Z-axis

Transform {
  scale 0.1 5 0.1
  rotation 1 0 0 1.57080  
  translation 0 0 5
  children [
    Shape {
      appearance Appearance {material Material {diffuseColor 0 0 1}}
      geometry Cylinder {}
    }
  ]
}

# Spere at origin

Shape {geometry Sphere{}}

# Sphere at end of X-axis

Transform {
  translation 10 0 0
  children [Shape {geometry Sphere{}}]
}

# Sphere at end of Y-axis

Transform {
  translation 0 10 0
  children [Shape {geometry Sphere{}}]
}

# Sphere at end of Z-axis

Transform {
  translation 0 0 10
  children [Shape {geometry Sphere{}}]
}

Slightly better way to make axes, but still stupid

axes2.wrl
#VRML V2.0 utf8
# ----------------------------------------------------------------------------
# axes2.wrl
#
# Draws the X, Y and Z coordinate axes, each 10 meters long: X red, Y green 
# and Z blue, as cylinders with radius 0.1m.
#
# Each axis is constructed separately in a rather brute force manner.  At
# least the fields of the Cylinder node are used.
# ----------------------------------------------------------------------------

# Red X-axis

Transform {
  rotation 0 0 1 -1.57080
  translation 5 0 0
  children [
    Shape {
      appearance Appearance {material Material {diffuseColor 1 0 0}}
      geometry Cylinder {radius 0.1 height 10 top FALSE bottom FALSE}
    }
  ]
}

# Green X-axis

Transform {
  translation 0 5 0
  children [
    Shape {
      appearance Appearance {material Material {diffuseColor 0 1 0}}
      geometry Cylinder {radius 0.1 height 10 top FALSE bottom FALSE}
    }
  ]
}

# Blue Z-axis

Transform {
  rotation 1 0 0 1.57080  
  translation 0 0 5
  children [
    Shape {
      appearance Appearance {material Material {diffuseColor 0 0 1}}
      geometry Cylinder {radius 0.1 height 10 top FALSE bottom FALSE}
    }
  ]
}
# Spere at origin

Shape {geometry Sphere{}}

# Sphere at end of X-axis

Transform {
  translation 10 0 0
  children [Shape {geometry Sphere{}}]
}

# Sphere at end of Y-axis

Transform {
  translation 0 10 0
  children [Shape {geometry Sphere{}}]
}

# Sphere at end of Z-axis

Transform {
  translation 0 0 10
  children [Shape {geometry Sphere{}}]
}

Smart way to make axes, using PROTO

axes3.wrl
#VRML V2.0 utf8
# ----------------------------------------------------------------------------
# axes3.wrl
#
# Draws the X, Y and Z coordinate axes, each 10 meters long: X red, Y green 
# and Z blue, as cylinders with radius 0.1m.
#
# This document illstrates using PROTO to make a new SimpleAxis node, which
# is the combination of a cylinder and cone, parameterized by its appearance.
# ----------------------------------------------------------------------------

# Define a new node called SimpleAxis with one parameter, its appearance.
# A SimpleAxis is basically a cylinder of base radius 0.1 and height 10
# resting on the xz plane pointing upward.  Sitting on top of the cylinder
# is a cone of base radius 0.25 and height 1.

PROTO SimpleAxis [field SFNode axisAppearance NULL] {
  Transform {
    translation 0 5 0
    children [
      Shape {
        appearance IS axisAppearance
        geometry Cylinder {radius 0.1 height 10}
      }
      Transform {
        translation 0 5.5 0
        children [
          Shape {
            appearance IS axisAppearance
            geometry Cone {bottomRadius 0.25 height 1}
          }
        ]
      }
    ]
  }
}

# Red X-axis

Transform {
  rotation 0 0 1 -1.57080
  children [ 
    SimpleAxis {
      axisAppearance Appearance {material Material {diffuseColor 1 0 0}}
    } 
  ]
}

# Green X-axis

Transform {
  children [ 
    SimpleAxis {
      axisAppearance Appearance {material Material {diffuseColor 0 1 0}}
    } 
  ]
}

# Blue Z-axis

Transform {
  rotation 1 0 0 1.57080  
  children [ 
    SimpleAxis {
      axisAppearance Appearance {material Material {diffuseColor 0 0 1}}
    } 
  ]
}

# Sphere at origin

Shape {geometry Sphere{}}

Creating your own meshes

Example of using IndexedFaceSet to make a polyhedron

house.wrl
#VRML V2.0 utf8
#-----------------------------------------------------------------------------
# house.wrl
#
# A very basic "house".
#-----------------------------------------------------------------------------

Shape {
  appearance Appearance {
    material Material {diffuseColor 1 1 0}
  }
  geometry IndexedFaceSet {
    coord Coordinate {
      point [                           # define the ten points
        -1 0  2,
        -1 0 -2,
         1 0 -2,
         1 0  2,
        -1 1  2,
        -1 1 -2,
         1 1 -2,
         1 1  2,
         0 2  2,
         0 2 -2
      ]
    }
    coordIndex [                        # define the seven faces
      0, 1, 2, 3, -1,
      0, 3, 7, 8, 4, -1,
      1, 5, 9, 6, 2, -1,
      2, 6, 7, 3, -1,
      0, 4, 5, 1, -1,
      7, 6, 9, 8, -1,
      4, 8, 9, 5, -1
    ]
  }
}

Animation and Triggers

A ball that rolls down a cone when you click on it

roller.wrl
#VRML V2.0 utf8

Transform {
  children Shape {
    appearance DEF SolidYellow Appearance {
      material Material {
        diffuseColor 1 1 0
      }
    }
    geometry Cone { }
  }
}

Group {
  children [
    DEF TheTouchSensor TouchSensor {}
    DEF LittleSphere Transform {
      translation 0 1.2 0
      children Shape {
        appearance USE SolidYellow
        geometry Sphere {radius 0.2}
      }
    }
  ]
}

DEF TheTimeSensor TimeSensor {cycleInterval 10}

DEF TheInterpolator PositionInterpolator {
  key [ 0, 1 ]
  keyValue [ 0 1.2 0, 1.2 -1 0 ]
}

ROUTE TheTouchSensor.touchTime TO TheTimeSensor.startTime
ROUTE TheTimeSensor.fraction_changed TO TheInterpolator.set_fraction
ROUTE TheInterpolator.value_changed TO LittleSphere.set_translation

An elevator that goes up when you walk into it

elevator.wrl
#VRML V2.0 utf8

# Stolen from the VRML 97 Final Specification

Transform {
  translation 0 0 -3.5
  children Shape {
    appearance Appearance {
      material Material {
        diffuseColor 0 1 0
      }
    }
    geometry Cone { }
  }
}

Transform {
  translation 0 4 -3.5
  children Shape {
    appearance Appearance {
      material Material {
        diffuseColor 1 0 0
      }
    }
    geometry Cone { }
  }
}

Transform {
  translation 0 8 -3.5
  children Shape {
    appearance Appearance {
      material Material {
        diffuseColor 0 0 1
      }
    }
    geometry Cone { }
  }
}

Group {
  children [
    DEF ETransform Transform {
      children [
        DEF EViewpoint Viewpoint { jump FALSE }
        DEF EProximity ProximitySensor { size 2 5 5 }
        Transform {
          translation 0 -1 0
          children Shape {
            appearance Appearance {
              material Material { }
            }
            geometry Box { size 2 0.2 5 }
          }
        }
      ]
    }
  ]
}

DEF ElevatorPI PositionInterpolator {
  key [ 0, 1 ]
  keyValue [ 0 0 0, 0 8 0 ] # a floor is 4 meters high
}

DEF TS TimeSensor { cycleInterval 10 } # 10 second travel time

ROUTE EProximity.enterTime TO TS.startTime
ROUTE TS.isActive TO EViewpoint.set_bind
ROUTE TS.fraction_changed TO ElevatorPI.set_fraction
ROUTE ElevatorPI.value_changed TO ETransform.set_translation