Virtual Worlds on the Internet

Another look at the VU Campus

by

F.E. Dozzi
Vrije Universiteit Amsterdam
August 2000


Contents

Introduction

This document was written for a Master Thesis project at the Vrije Universiteit (VU)  in Amsterdam. The goal of this project was to examine 3-dimensional virtual worlds on the Internet (particulary worlds that are created in the Virtual Reality Modeling Language (VRML)). I did this by doing an inventarisation on several virtual worlds on the Internet. Other 3D technologies like Shout3D [22], Pulse3D [23] and Blendo [24] are not discussed in this thesis.
In order to find out what it takes to build a virtual world and what problems might arise in the process, I created a 3d virtual world that is supposed to resemble a part of the real world, the Campus of the Vrije Universiteit. A report about my findings concerning this virtual world creation is also included in the thesis.

This thesis is part of the RIF-project [1], which is a research project on Retrieval of Information in Virtual Worlds Using Feature Detectors. This project is a co-operation between the VU and the CWI (Centre for Mathematics and Computer Science). Members of the RIF-team are Anton Eliëns (projectleader, VU/CWI), Alex van Ballegooij (researcher,CWI) and Roland Blom (student,VU/CWI). Some of the tools I have used for the creation of the virtual world of the VU Campus were made by Alex and Roland.

My thanks go out to my parents and brother for supporting me in every possible way to help me finish this project. I would also like to thank my supervisors Anton Eliëns, Zhisheng Huang (VU) and Alex van Ballegooij for their advice and support during the time I worked on my thesis. I also thank all other people who have commented on my work in progress and gave me new ideas and tips about the virtual world.

Structure of the document

After an introduction to VRML I will give a description of the most interesting virtual worlds on the Internet. In the second part of the document the design and creation of the VU Campus virtual community will be looked in to. The various tools I have used will also be discussed. Finally I will give an evaluation of both parts of this thesis.
 

Virtual Reality Modeling Language (VRML)

The Virtual Reality Modeling Language is a 3D interchange format. It can be used to create 3D content in the same way as HTML (HyperText Markup Language) can be used to create 2D content. VRML is a interpreted language and thus can be used on every platform where a VRML viewer is available. This makes it very much suited for the Internet. VRML files are ASCII text files in which 3D semantics like hierarchical transformations, light sources, viewpoints, geometry, animation, material properties and texture mapping can be defined.

VRML versions

The first version of the VRML specification, VRML 1.0, was published in 1994. VRML 1.0 could describe static 3D scenes and objects but lacked several of the key features like animation, interaction and behavior, that its successor VRML 2.0 did include in its specification. Another difference is the use of a hierarchical scenegraph structure in VRML 2.0 instead of the linear structure that was used in VRML 1.0. VRML 2.0 was released in 1996. Six months later, in april 1997, a revised VRML 2.0 specification that contained numerous fixes and some technical changes was published. This revised version is known as VRML97 (ISO/IEC 14772-1:1997) [4] and is backwards compatible with VRML 2.0 (besides some changes to the Javascript and Java interfaces).
VRML 1.0 and VRML 2.0 will not be further discussed in this document. Whenever VRML is mentioned in this document, VRML97 is meant.

VRML offers the following major features [2][3][6]:

Scene Graph Structure

VRML files are build up from entities that are called nodes. There are 54 different node types defined in VRML. These nodes range from geometry primitives, appearance attributes, sound and several types of grouping nodes. Data of the nodes are stored in fields of which 20 different types are defined in VRML. Grouping nodes can contain besides fields also other (children) nodes.

The VRML file structure is a directed acyclic graph. This is a tree where all leaf entities are children nodes and all intermediate entities are group nodes. This scene graph structure makes it simple to create complex scenes out of more simple subparts.

VRML uses a coordinate system with three axes (x, y and z axis). These axes are related in the way as shown in the following figure. Linear distances are measured in metres and angles in radians. Colors are specified in RGB (red-green-blue) values in the interval [0..1]. Time units are specified in seconds. Every VRML 97 or VRML 2.0 file must begin with this line: #VRML V2.0 utf8



coordinate system in VRML

The 54 different VRML nodes can be divided in three groups, Grouping nodes, Children nodes, Field nodes. The Grouping nodes are a subset of the Children nodes. Field nodes are nodes that can only be used to describe the contents of a field. The standard VRML nodes can be extended from within a VRML file by using the Prototype mechanism [see Prototyping]. The following tables will show the nodes that are available in VRML.

Grouping Nodes

  • Anchor 
  • Billboard
  • Collision
  • Group
  • Transform
  • Children Nodes

  • Background
  • OrientationInterpolator
  • SpotLight
  • ColorInterpolator
  • PlaneSensor
  • SphereSensor
  • CoordinateInterpolator
  • PointLight
  • Switch
  • CylinderSensor
  • PositionInterpolator
  • TimeSensor
  • DirectionalLight
  • ProximitySensor
  • TouchSensor
  • Fog
  • ScalarInterpolator
  • Viewpoint
  • Inline
  • Script
  • VisibilitySensor
  • LOD
  • Shape
  • WorldInfo
  • NavigationInfo
  • Sound
  • PROTO'd child nodes
  • NormalInterpolator
  • Field Nodes

  • Appearance
  • ElevationGrid
  • MovieTexture
  • AudioClip
  • Extrusion
  • Normal
  • Box
  • FontStyle
  • PixelTexture
  • Color
  • ImageTexture
  • PointSet
  • Cone
  • IndexedFaceSet
  • Text
  • Coordinate
  • IndexedLineSet
  • TextureCoordinate
  • Cylinder
  • Material
  • TextureTransform
  • Every node can (and usually does) contain fields. These fields are the parameters of a node that distinguish it from other nodes of the same type. These parameters might be, for example, the size of a box defined by a Box node or the intensity of a DirectionalLight node. Every parameter has a default value that is used if no value for the parameter is specified in the VRML file.
    Two kinds of fields are present in VRML:

    Data entered at a field needs to comply to the appropriate field type. The following field types exist in VRML:

    Field Types

  • SFBool
  • SFColor & MFColor
  • SFFloat & MFFloat
  • SFImage
  • SFInt32 & MFInt32
  • SFNode & MFNode
  • SFRotation & MFRotation
  • SFString & MFString
  • SFTime & MFTime
  • SFVec2f & MFVec2f
  • SFVec3f & MFVec3f
  • The field types can be divided in two general classes, the single-valued fields (SF) and the multivalued fields (MF). The only difference is that single-valued fields contain a single value and multivalued fields can contain multiple values. All fields have strong type-checking, also between SF and MF fields.

    When creating VRML scenes, it becomes usually necessary to be able to reference a previously used node (in the same file). Node referencing can be achieved
    by using DEF and USE keywords. The DEF keyword defines a name to a node. The USE keyword can be used in every place where an instance of a previously DEF'ed node is wanted. There are several reasons for this reference mechanism. It can be used to make connections between nodes [see Event Architecture] and to lower the number of resources (texture files, sound files etc.) that need to be loaded, which results in a better performance. It also happens often that nodes are repeated in a VRML scene (for example, a scene of a forest of trees). Using DEF and USE prevents the author of a scene to retype the exact same code for every single object. Prototyping can also be used to prevent this.

    Event Architecture

    Nodes can communicate with each other by means of an event or message-passing mechanism. Events can be generated and received by instances of node types in which the names and types of these events are defined. A node with an eventIn definition can receive an eventOut of another node. This eventOut contains data which can be used to change something within the receiving node. In order to make a connection from an eventOut to an eventIn a ROUTE statement must be used. A ROUTE statement can only make a connection between an eventIn and eventOut of exactly the same type. For example, routes from an SFFloat to an MFFloat or from an SFString to an MFString are not allowed.

    Sensors

    Sensors are special nodes that are able to generate events. The TimeSensor node generates events as time passes. The geometric events (ProximitySensor, TouchSensor, VisibilitySensor, CylinderSensor, PlaneSensor, SphereSensor and Collision) are triggered by user actions such as a mouse click or moving close to an object. Dependencies may exist between sensors. For example, a TouchSensor may result in a ProximitySensor being turned on. As an example of sensors in VRML, the ProximitySensor and TimeSensor are both used below:
    #VRML V2.0 utf8
    
    Viewpoint {
      position 0 0 15
    }
    DEF PROXSENSOR ProximitySensor {
      size 10 10 10
    }
    DEF TIMER TimeSensor {
      cycleInterval 5
    }
    Shape {
      appearance Appearance {
        material DEF BOX_COLOR Material {
          diffuseColor 1 1 1
          transparency 0
        }
      }
      geometry Box {
      }
    }
    Shape {
      appearance Appearance {
        material Material {
          diffuseColor 1 0 0
        }
      }
      geometry Sphere {
        radius 0.25
      }
    }
    ROUTE PROXSENSOR.enterTime TO TIMER.startTime
    ROUTE TIMER.fraction_changed TO BOX_COLOR.transparency
    ROUTE PROXSENSOR.exitTime TO TIMER.stopTime
    This code will show a VRML scene of a blue box with a red sphere inside it. When the user approaches the box (to be precise, enters the ProximitySensor that is located around the box), it will become totally transparent in 5 seconds. The sphere will become more and more visible during this time. When the user leaves the ProximitySensor the TimeSensor is halted so the box will stop becoming more transparent. If the user approaches the box again, the box will restart to shift from solid to transparent form.


    screenshot of sensor example

    Scripts & Interpolators

    The use of events is limited because of the strong type checking that is performed on the data going from eventOut to eventIn. This is the reason that scripting is supported by VRML. With scripting events can be processed after being send by an eventOut and before being received by an eventIn. To do this an eventOut is routed to a Script node which performs one or more operations on the data before routing it to an eventIn. The scripting language that must be used to alter the data is either Java or Javascript. Most VRML browsers don't support Java. Javascript is usually supported, but some browsers only support a subset of Javascript named VRMLScript. This might give problems like script nodes that work in one browser but fail to work in another.

    An Interpolator node is a node that is needed for stepwise keyframe animation. It contains a list of keys and a corresponding list of keyValues. An interpolator is often used together with a Timesensor node of which time values will be routed to the interpolator. The interpolator will use a time value as a key and the matching keyValue will be send to an eventOut. Key and keyValue pairs that are not listed in the interpolator are automatically generated by the interpolator. When combining an Interpolator with a Timesensor the keys have to be in the interval [0, 1], because the Timesensor uses values within this interval. When an Interpolator is getting its eventIns from a Script Node there is no value restriction. Six different types of interpolator nodes exist, each with a different type of value to be interpolated: ColorInterpolator, CoordinateInterpolator, NormalInterpolator, OrientationInterpolator, PositionInterpolator and ScalarInterpolator.

    The following code is an example of a ColorInterpolator node and a Scipt node. The resulting VRML scene shows a sphere that changes colors continuously. It cycles through the colors that are listed in the ColorInterpolator. Each time the sphere is clicked with the mouse the Script node will receive an eventIn after which it will construct a string which is routed to the Text node:

    #VRML V2.0 utf8

    DEF COUNTER Script {
      eventIn SFTime touchTime
      field SFInt32 touchCount 0
      eventOut MFString outputString
      url "javascript:
      function initialize() {
        outputString = new MFString('Click sphere','to increase count');
      }
      function touchTime(value, time) {
        touchCount++;
        outputString = 'Count: ' + touchCount.toString();
      }
      "
    }

    Shape {
      appearance  Appearance {
        material  Material {
          diffuseColor  0 0 1
        }
      }
      geometry DEF TEXT Text {
        fontStyle FontStyle {
          justify "MIDDLE"
          size  0.5
        }
      }
    }

    DEF TIMER TimeSensor {
      cycleInterval 10
      loop TRUE
    }

    Transform {
      translation 0 -1 0
      children [
        DEF SENSOR TouchSensor {
        }
        Shape {
          appearance Appearance {
            material DEF SPHERECOL Material {
              diffuseColor 0 1 0
            }
          }
          geometry Sphere {
            radius 0.2
          }
        }
        DEF CI ColorInterpolator {
          key [0, 0.33, 0.66, 1]
          keyValue [ 0 1 0,
            0 0 1,
            1 0 0,
            0 1 0 ]
        }
      ]
    }

    ROUTE SENSOR.touchTime TO COUNTER.touchTime
    ROUTE COUNTER.outputString TO TEXT.string

    ROUTE TIMER.fraction_changed TO CI.set_fraction
    ROUTE CI.value_changed TO SPHERECOL.set_diffuseColor


    screenshot of script and interpolator example

    Prototyping

    The concept of prototyping is allowed in VRML as a method to extend the standard set of node types. With prototyping geometry, properties, behaviors or a combination of these can be encapsulated and parameterized. For example, if you want to create a couple of boxes that have the same geometry but different colors, you can use a prototype for a box with a variable color.
    PROTO ColorBox [
      field SFColor boxColor 1 1 1
    ]
    {
      Shape {
        appearance Appearance {
          material Material {
            diffuseColor IS boxColor
          }
        }
        geometry Box {
        }
      }
    }
    The instantiation ColorBox {} will produce a white box (white being the default color in this PROTO), while ColorBox { boxColor 0 0 1 } will result in a blue box.
    A prototype consists of a prototype declaration and a prototype definition. The prototype declaration contains: - a list of public eventIns and eventOuts that can send and receive events. - a list of public exposedFields and fields and their default values.
    The prototype definition contains one or more nodes and optionally routes and other prototypes that are used inside the the prototype being defined.
    To create a prototype in a VRML file PROTO can be used. Another option is to define prototypes in external files. These prototypes can be referenced by EXTERNPROTO which contains a url that points to the location of the external prototype.

    Distributed Scenes

    Two mechanisms are provided by VRML that allow a VRML scene to be scattered all over the Internet. With the Inline node a VRML file from anywhere on the World Wide Web can be included in a VRML file. The EXTERNPROTO node allows the inclusion of node definitions from an arbitrary place on the WWW. Of course 'anywhere' can also be on your own computer, so this gives the opportunity to divide a VRML scene in different files, if you might prefer.

    The use of an Inline node is straightforward as can be seen in the following example.

    Inline {
      url "http://www.cs.vu.nl/justaname.wrl"
      bboxCenter 0 0 0
      bboxSize 25 25 25
    }
    The above code will read and display every node in justaname.wrl. bboxCenter and bboxSize can be set to define a bounding box around all nodes in that file. This can be done for optimization. Without a bboxSize (default is -1 -1 -1) the VRML browser needs to calculate it on its own, if needed.

    The EXTERNPROTO is not very different from the Inline node. Suppose a file with url http://www.cs.vu.nl/justaname2.wrl lists the ColorBox PROTO discussed earlier and some other prototypes. When the following piece of code is processed, it will load the ColorBox PROTO.

    EXTERNPROTO ColorBox [ field SFColor boxColor ]
      url "http://www.cs.vu.nl/justaname2.wrl#ColorBox"
    }

    Navigation in a VRML scene

    In order to have a useful VRML scene it is often necessary for the user to be able to move through the scene. VRML distinguishes 4 different standard modes of navigation (Walk, Fly, Examine and None). These modes are usually supported by all VRML browsers. The Blaxxun Contact browser (which needs to be used for the VU Campus world) offers three other modes (Slide, Pan and Rotate) as well:
    1. Walk

    2. The Walk mode is one of the most natural ways to navigate through a VRML scene. In this mode the user will experience a sense of gravity which means that the user can't move into the sky, but is able to walk up and down on elevations. A staircase can be ascended or descended because height differences of no more than 0.5 metres will be crossed. The avatar will bump into any other objects.
    3. Fly

    4. Navigation by flying is a movement mode that is unaffected by gravitation. Movement can be done in any direction, until an object blocks the way.
    5. Examine

    6. Examine mode is an extended Rotate mode. Examine will not only rotate objects around the y-axis, but is also capable of rotating them around the other axes. It offers a good way to examine objects from all sides because it is a lot easier than having to walk around an object and keeping it in your line of sight. Be aware however that this navigation type could easily disorientate the user, because it is also possible to pass through objects and thus wind up inside one.
    7. None

    8. This navigation mode is actually no navigation mode at all. It tells the browser to make the other navigation modes unavailable. This is very useful if the author of a scene wants complete control over where the user is and can go to. For this purpose a viewpoint tour or an own system of movement controls inside the scene (in the form of buttons in VRML, for example) can be created.
    1. Slide

    2. Sliding is a type of navigation where the user will always face the same direction. Left and right will, instead of  turning the user left or right as in Walk mode, make the user move to the left or right. Forward and back will operate as expected.
    3. Pan

    4. Forward and back will make the user look up and down instead of moving forwards and backwards. This is a good mode for looking up and down a large object just in front of the user.
    5. Rotate

    6. Rotate mode will rotate around the point where the mouse pointer is at, around the y-axis using the left and right controls. Forward and back will operate normally.
    VRML viewers do have two other options that are related to navigation:

    Virtual worlds on the Internet

    Introduction

    Virtual worlds are 3-dimensional representations of real or imaginary places and objects, which the user can examine from all sides and angles. The user is depicted inside a virtual world by an 3D representation, an avatar. The virtual world can be viewed through the eyes of the avatar or from a third person point of view, where the user can see it's own avatar while navigating in the virtual world.
    Virtual worlds can roughly be divided in two categories, the multi-user worlds or communities and the single-user worlds. Single-user worlds are worlds where the contents of these worlds are transferred to the user's own computer and only the user can wander around in this world. These kind of worlds are mostly being used for the visualization of objects, ranging from a car to a complete city. At this moment, especially the visualization of 3D objects for product demonstrations is quite popular.
    A multi-user world differs from a single-user world in a very important way. A multi-user world can be accessed by multiple users at the same time. The actions that the users make need to be visible to the other users. For example when one user enters a room the people in that room must see him come in. This is done by shared events. The events that occur in a multi-user world are distributed to the computers of all other users. This distribution is done by a server which sends all shared events to all users' local copy of the virtual world.

    In this chapter a description will be given of several of these multi-user virtual worlds. The focus will be on virtual worlds that show their 3D content in VRML.

    Requirements

    Software

    To be able to view a VRML world, a VRML browser is needed. Most available browsers today are plugins for Internet browsers like Netscape Navigator. Regrettably those plugins are (almost) only available for Windows 95/98/NT/2000. For a multi-user world a special multi-user browser is needed that is capable to handle shared events and the (Java-based) chatboxes.

    Virtual multi-user worlds need a server that distributes the changes in the virtual worlds to all users. One of the major servers at this moment is Blaxxun Community Server [8]. Other Servers are Helios [9], DeepMatrix [10], VNET [11] and Active Worlds Server [12].
    For a list of existing VRML browsers and servers see [Appendix B].

    Hardware

    The large virtual worlds need a fast computer to run smoothly. Even more important is a good graphics card with enough memory to be able to display big textures without difficulties. An average personal computer with a 3D-accelerator graphics card is a good system to walk around in virtual worlds without problems.
     

    Characteristics of a multi user virtual world

    Good multi user virtual worlds need to comply to at least some (and preferably all) of the following characteristics:

    Interaction

    Inside a virtual world interaction should be possible because it makes a world more lively. For example, users could be able to open doors or operate vehicles by walking into objects, clicking objects or making specific mouse movements.
    Animated objects may also enhance a virtual world very much. For example, a working fountain at the center of  a square and some driving cars on an otherwise empty street may greatly improve the outlook of a virtual scene. Another nice addition to a scene might be the use of sound effects. When the user approaches the fountain he could hear running water and the cars can make engine sounds when the user is in their vicinity. Sound can however get annoying real quick, so the maintainer of a virtual community should try to avoid overkill.

    Support for multiple users

    More than one user at the same time must be able to enter the world. Users should be aware of those other users by being able to 'see' them in some way. A simple listbox with the names of the users would do that trick, but since we are talking about 3D virtual worlds, this is not enough. Avatars should not only be visible but also be animated so users can see where other users are and where they are going. This adds significantly to the multi user experience.
    Another multi user feature is the ability for users to communicate with each other. Although it is technically possible to let users actually talk to each other, the communication methods are limited to text and avatar gesturing. The text communication might be done by typing in a chat-window or by sending and receiving mail in their virtual mailbox. Avatar gesturing is another, very interesting, form of communication. Some virtual communities offer about a dozen different gestures which can be used to show emotions to others. A user can make his avatar wave, smile, look happy or angry and so on.

    Immersion

    The ultimate form of virtual reality is completely immersive VR. This type of VR is supposed to give the user an experience where he is completely inside a 3D
    virtual world and doesn't have to take any reality into account. In the case of virtual worlds generated in VRML it is obvious that this is difficult to achieve, because a VRML world is usually viewed on a 2D computerscreen and manipulated by mouse and keyboard (although the specification of VRML doesn't say anything about display types and could very well be viewed on more immersive display systems). However, virtual worlds (and virtual communities in particular) will give a more immersive feeling to the user when additional features are embedded inside the virtual world. The typical additional features of a virtual community
    are text, site navigation buttons, hyperlinks (to other VRML scenes), chat-windows and advertisement banners. Because large parts of text don't read very well in VRML, it is often displayed in HTML format in a different frame of the browser (assuming an Internet browser with VRML plugin is used to access the community).
    Some of the other features might be integrated inside the virtual world. The site navigation buttons and links to other VRML scenes might be represented as Anchor'ed objects and the advertisements could become Billboards scattered around the VRML world. Even the chat-window (usually a Java-applet in another browser frame) can be embedded in VRML in the form of a HUD (heads up display).
    The more parts of the world are taken out of the HTML-frames surrounding the VRML-frame and are included inside the virtual world, the more immersive this world becomes. The main advantage of a world with a high immersion level is that the user will experience the feeling of being immersed inside that world.

    Virtual Worlds

    In this chapter a description will be given of several virtual communities and their servers. A table of properties for these virtual communities is listed in [Appendix A]. For a list of available servers and browsers see [Appendix B].

    Blaxxun Community Server

    The Blaxxun Community Server [8] offers a lot of features for virtual communities. The most interesting features that communities based on the Blaxxun Community Server have are listed here: The following worlds are based on the Blaxxun Community Server: Since all of the above communities are running on the same type of server, the immersion of these communities is fairly similar. A rather small part of the
    browser window is reserved for a VRML scene, because the communities have a lot of surrounding frames in which site navigation hyperlinks, advertisements and
    the chat-window are displayed. In the VRML scenes links to (some of the) other scenes are available. This adds a little immersion, but in total the amount of
    immersion in these communities powered by Blaxxun is rather low.

    DeepMatrix

    DeepMatrix [10] by Geometrek is an open source system for multi-user VRML worlds. It consists of a server where the VRML files are hosted and an Java-applet in which a normal VRML browser is running. With DeepMatrix it is possible to distribute shared events to several users. The available virtual worlds are rather small and don't offer much interaction besides the chatbox. It does supply a small amount of avatars to choose from.
    Deepmatrix communities have two frames in the browser window, the actual VRML scene frame and the frame for the chat-window. Empty space is surrounding these frames, so the VRML frame could become a lot larger than it is now. Links to other worlds are offered inside some scenes.


    A Deepmatrix world

    VNET

    VNET [11] is an open source multi-user system which claims to just need a normal browser with VRML plugin for access. However it doesn't seem to work with Viscape Universal. VNET is a multi-user system which offers only basic functionality like a chatbox and a small avatar library. VNET has no immersion whatsoever, which is not surprising since there is nothing (besides the Java chat-window) to embed in the scenes. Just as with Deepmatrix the VRML frame could
    get a larger size than it has now.


    VNET's Town Square world


    Helios

    Helios is a multi-user server, made by ParallelGraphics [9], which hosts about 20 virtual worlds. A special browser client, Islands, is needed to be able to connect to this server. The browser has a HTML-page with avatars and objects on it, which can be dragged and dropped inside the 3D world. The objects that are placed into the world this way, can be resized and moved throughout the world. A disadvantage of the scenes that are available on this server, is that they seem to consist of a couple of big textures displayed on few objects, which decreases the reality level of the scenes. Immersion is non-existent, even links to other scenes are missing. The frames containing the scenes list, the chatbox and the objects can be hidden to obtain a larger VRML frame.


    Red Square world on Helios server

    Active Worlds

    To view Active Worlds, you need the special Active Worlds [12] browser. These worlds are not created in VRML, but in a different format called RenderWare (*.rwx files). Every object in a world has its own file, which results in a lot of files in case of a big world. It is not possible to make your own Active Worlds unless you buy the development software. Membership of Active Worlds costs $19.95 a year, contrary to the other discussed communities which are totally free of charge. Active Worlds has some avatar gestures built in, so with one click of the mouse it is possible to let your avatar for example smile, jump or wave. Another feature is to build your own house or city from lots of ready-made objects, textures and sounds online. Active Worlds uses a limited Level of Detail (LOD), which means that only objects that are within a defined distance to your avatar are being drawn in the world. With this LOD it could happen that when walking towards a distant horizon suddenly all kinds of objects pop up in front of you.
    The ActiveWorlds browser is divided in a couple of frames. The most important frame is the one where the actual virtual world is shown. The other frames are the chat-window, a frame with help information about the way ActiveWorlds works and a frame that supplies information about other virtual worlds, other users inside the world and friends that are also in the community at that moment. All these other frames lead to very little space being available for the 3D world itself. It is possible to turn these other frames off, but since they carry interesting features this might result in constantly turning the frames on and off. The immersion of
    Activeworlds could be high if the worlds would integrate (some of) the information of these frames inside them, but this is usually not the case.


    Active Worlds


    Designing a virtual community

    Creating a virtual community is next to impossible without some good tools that may assist the author in creating the VRML scenes. Often 3D designing programs like 3D Studio Max are used for this purpose. With these kind of programs it is possible to create rather complex 3D models which in turn can be converted to VRML. The VRML files that are made this way are usually very large so they should be optimized to get an acceptable renderspeed. Creating VRML using this method implies that the author needs to have good knowledge of these design programs, in other words, he should be some sort of graphics expert.
    I have used a different approach. The programs I have mainly used to create VRML scenes are made by members of the RIF-team. The idea behind this was to find out whether people who are no graphics experts, could use these tools to create reasonably complex VRML scenes in a more simple way than possible with other tools. In order to make this whole process a little more interesting, we decided that I would create a virtual community of part of the Campus of the Vrije Universiteit, a place where I have spend a lot of time during the past years.
    Because a virtual community needs a server to make its features available to users (clients) that want to access the community, I have used the Blaxxun Community Server. This server is at the moment the only available server with many features. A user that wants to visit a community based on this server needs to have the Blaxxun Contact VRML browser installed as a plugin in the webbrowser he uses. In the next paragraph there will be an explanation of the things that have to be done to install the server on a computer and to publish VRML scenes on it.

    Installing the Blaxxun Community Server

    Before installing the Blaxxun Community Server, a webserver has to be installed in order to make it possible for people to access the community through the Internet. I have chosen to use the Apache webserver [17] because it is one of the most used webservers on the Internet. Furthermore it can be used free of charge. For the examples in this chapter I have used the default directories of both the Apache webserver and the Blaxxun Community Server, which are
    C:/Program Files/Apache Group/Apache/ and C:/blaxxun/CommServ/ respectively. The hostname in the examples is bruin011.cs.vu.nl.

    Apache Webserver

    Installing the Apache HTTP-server is quite simple. After selecting typical install and supplying the installation directory the program installs. The next thing to do is configuring the webserver, which is a little more difficult. In the file httpd.conf several options have to be set.

    ServerAdmin you@your.address

    DocumentRoot "C:/Program Files/Apache Group/Apache/htdocs"

    <Directory "C:/Program Files/Apache Group/Apache/htdocs">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    The above text should be replaced by a text that looks similar to the text below (with the correct emailadress, hostname and directories). Note that these texts do not appear entirely the same in httpd.conf, because all options are explained in that file.

    ServerAdmin fedozzi@cs.vu.nl

    ServerName bruin011.cs.vu.nl

    DocumentRoot "C:/blaxxun/CommServ/commserv/community"
    <Directory "C:/blaxxun/CommServ/commserv/community">
        Options Indexes FollowSymLinks MultiViews ExecCGI
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    Alias /csadmin c:/blaxxun/CommServ/csadmin
    ScriptAlias /csadmbin c:/blaxxun/CommServ/csadmbin
    Alias /commserv c:/blaxxun/CommServ/commserv
    ScriptAlias /csbin c:/blaxxun/CommServ/csbin

    <Directory "C:/blaxxun/CommServ/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>

    <Directory "C:/blaxxun/CommServ/csadmin">
    Options Indexes FollowSymLinks MultiViews ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from bruin011.cs.vu.nl
    </Directory>
     

    The last step in installing Apache is to start it. This can be done in the Services menu that can be found on the Control Panel of Windows. Apache can be started manually each time, but it is best to select automatic install which will start Apache whenever the computer is booting.

    Blaxxun Community Server

    Blaxxun Instant Community 1.0 is the version of the Community Server I have used. While installing some information has to be provided. This information is the installation directory, the (full) hostname of the computer, the port used by the HTTP-server (default: 80), the base port to be used by the Community Server (default: 2000), the SMTP mail server and the emailadresses of the maintainers of the community (for problem reports). Usually the default ports can be used.
    After installing the Community Server services have to be started. This is also done in the Services menu of the Control Panel. The Blaxxun Community Server has 7 different services. The first three need to be started for the Community Server to run; the other four are optional:
      More information about the services can be found at Blaxxun Interactive's server helppages [18].

    After all necessary services are started the community can be accessed by entering the hostname as an URL (Uniform Resource Locator) in a webbrowser. The administrative tools of the community can be accessed at http://bruin011.cs.vu.nl/csadmin.
     

    Publishing a virtual world

    Publishing a virtual world on the community can be done only partly with the administative tools. After clicking 'Design', 'Place Design' and the 'Create Place', some information has to be supplied about the world to be published. This includes a unique identifier, the name of the world, a short description and screenshots of the world that will be shown in 2D-mode. The files of the scene (VRML files and texture files) to be published have to be copied manually into the c:/blaxxun/Commserv/commserv/community/places/<worldname>/vrml directory and the screenshots in c:/blaxxun/Commserv/commserv/community/places/<worldname>/images.
    In order to be able to access scenes by clicking on them in the chat-windows, the file idserver.cfg in directory c:/blaxxun/Commserv/commserv/etc/ needs some editing. For example, to add the VU Campus world, the following line is added to that file:

    SHOWSCENE http://bruin011.cs.vu.nl/commserv/communityplace?plc=VUCampus&ID=000000000000000b&ac=3D&IE=x.bxx Vu Campus

    After doing all of the above, the virtual world should now be accessable for everyone on the Internet.
     

    VRML Tools

    Preprocessor

    Alex van Ballegooij (CWI) has written a VRML preprocessor in Perl. It works almost the same as the C preprocessor. When programming in VRML it is not possible to use the C preprocessor because it can't cope with VRML-comments (which start with an '#'). The VRML preprocessor can handle the VRML-comments, because the identifiers of the preprocessor begin with '#@', so the difference between an identifier and a comment can be noted. With the preprocessor it is possible to include (#@include) files in another file (a prototype of a tree could for example be included in a VRML-file describing a forest). Some other options are '#@search' to search for include-files in other directories and the '#@define' command to define identifiers that can be used together with '#@ifdef' and '#@endif' to prevent including the same file more than once. More information about the VRML preprocessor can be found at Alex' VRML preprocessor webpage [19].

    bmp2map

    The bmp2map program was also written by Alex van Ballegooij. Bmp2map is a program that creates map-files of Windows Bitmaps (.bmp). The program accepts 24-bit bitmaps as input and optionally a colormap which describes what colors will be mapped on what characters. Without a colormap the program will assign the '.' character to black and the next available character to the next color in the bitmap, but it might sometimes be useful to assign them yourselves. The output of bmp2map will be a generated map-file which can be used for the configuration files of vrmlgen. The next pictures show what map-file bmp2map will generate for the bmp-file (size 20x15 pixels).
     
     

    input bmp-file

    output of bmp2map

    The following colormap file will generate a map-file where all 'a' characters are substituted by 'r' characters. Note that the colormap is in BGR (blue-green-red) format instead of RGB.

    . 0.000000 0.000000 0.000000
    r 0.000000 0.972549 0.972549
     

    Vrmlgen

    Vrmlgen [20] is a program created by Roland Blom. Vrmlgen offers a quick and relatively simple way to create simple objects in VRML. The original idea behind the program was to build objects like Lego [25]. Lego consists of building blocks that can be placed next to and on top of each other. Vrmlgen uses the same concept. Every 3D object that is created with it, is constructed using (a lot of) basic blocks. If possible the program will combine basic blocks into an IndexedFaceSet. This way the number of IndexedFaceSets will be kept to a minimum. The program needs a configuration file with options and maps of an object (or objects) as input.
    The most important options of vrmlgen are described in the following text.

    In a map-file every character represents a building block. The attributes of the building blocks will depend on the various options that can be specified in the configuration file. In principal every printable ASCII-character can be used, but some characters have a special purpose. For every '.' in the map vrmlgen will not generate anything, because the '.' means there is an empty place on the map. An option can be turned on that will instruct vrmlgen to generate viewpoints where a '<', '>', '^' or a 'v' is on the map. The '<' will become a viewpoint with orientation to the left and so on.

    The first thing that has to be determined is the unitsize you want to use for a basic building block. A block must be of the form x * y * z (where x = z and y = 1.5x). So a unitsize of 0.5 will result in a block that measures 0.5 by 0.75 by 0.5.

    After the tag [colors] every character in the map file can be assigned a color. The default color is yellow. The color should be given in RGB format, just like in VRML. The following example will let vrmlgen generate a gray block for every 'a' in the map, a blue block for every 'b' and a green(ish) block for every 'c':

    [colors] {
      a 0.72 0.72 0.72 0
      b 0.00 0.00 1.00 0
      c 0.06 0.55 0.06 0
    }

    Vrmlgen offers the ability to map textures on objects. At most 6 different textures can be added to an object. On the top, bottom, left, right, front and back faces of an object textures can be mapped by specifying the filename (and pathname) of the image file and on how much horizontal and vertical building blocks one instance of the texture image should be mapped. For example, suppose the top face of an object is build up out of 20 (horizontal) by 15 (vertical) blocks and in the vrmlgen configuration is specified:

    [toptextures] {
      c 5 5 0 "grass.png"
    }

    This will result in a top face where the texture image is mapped to 12 times (four rows of three images). For the other faces the according tags ([fronttextures], [bottomtextures], [righttextures], [fronttextures] and [backtextures]) can be used. In case the four sidetextures all should be the same, the tag [sidetextures] can be applied.

    The largest part of the configuration file consists of the maps of the object(s) that vrmlgen will generate. The size and amount of the maps that follow must be specified first. A map can be used repeatedly by using the repeat statement. repeat 2 means that the previous map will is repeated twice.

    [maps]
      dx 20
      dz 15
      nrmaps 10

    /* maps 1 to 3 listed here */
    repeat 6
    /* map 10 listed here */

    An extra feature of vrmlgen is that objects, that already were created as prototypes, can be inserted in the world by adding a character in the map-file for each instance of that object you want in a world and add some lines to the corresponding vrmlgen configuration file. Vrmlgen will place these objects in the appropriate locations in the world. For example, you may want to include a tree on several places in the map. By including the following lines to the configuration file and adding the 't' character to the right places of the map file this can be done. Anything in between the [literal] and [/literal] tags behind the [litincludes] tag will exactly be added to the generated VRML file. The first number (1 or 0) after the t in the [specialnodes] tag indicates whether the t does or does not also represent a block on the map. The second number (1 or 0) indicates whether an offset is or is not specified after the map the t occurs in. If so, this offset will replace the variables in the translation field. The third number specifies the number of extra parameters that are specified after the map. In the (simple) example of the shed the tree will have an extra translation to position the bottom of the tree on the grass.

    [litincludes]
    [literal]
    # VRML code for the Tree PROTO is added here
    [/literal]

    [specialnodes] {
      t 0 1 0
      [literal]
        Tree {
          translation   %.2f %.2f %.2f
          woodtexture   ImageTexture {url "treewood.jpg"}
          leavetexture  ImageTexture {url "treeleaves.jpg"}
        }
      [/literal]
    }

    The bmp-files and configuration file that are needed for the example of a shed can be seen in [appendix C]. The resulting VRML scene is shown in the following picture.


    VRML scene of a shed, generated by vrmlgen

    Vrmlpad

    For creating VRML scenes by hand, which is not recommendable for anything but the simplest scenes, Vrmlpad is an excellent program. This VRML editor is created by ParallelGraphics [9]. Vrmlpad offers besides syntax highlighting (which is also possible with standard editors like vim and Emacs) also syntax checking and auto completion of partly typed keywords. A VRML file is in Vrmlpad also displayed as a tree which makes it easy to distinguish between grouping and children nodes.

    Spazz3D

    Spazz3D [21] is a program that is very useful for creating simple 3D objects. With simple 3D objects I mean objects that are a combination of basic VRML shapes (box, cylinder, cone and sphere). For example a tree (cone & sphere) and a chair (several boxes) can be quickly created with Spazz3D. It is also possible to create some simple extrusion shapes, however this is a lot harder to do. Spazz3D saves the created object in its own file format but has an option to import & export VRML files.

    Designing worlds

    Creating maps of the world

    When building a world with vrmlgen it is necessary to create maps of the objects that should appear in that world. It is very important to keep the scale of all the maps equal when you're using different maps for different objects, because otherwise you have to rescale the objects afterwards in the VRML file which can be a very tedious thing to do. Something else to keep in mind is to limit the number of different characters in your map-files. The more characters you use the more difficult it gets to keep track of what character relates to what color or texture.

    Texture mapping objects

    To make a scene look more like reality, textures should be mapped on the objects in the scenes. In VRML each face (side) of an object can be assigned a different texture. Doing this by hand is a very tedious job to do, because every texture will need a TextureCoordinate node (with sometimes large amounts of values) to map it to a face in the correct way. Vrmlgen calculates these values automatically.

    The filesize of a VRML file is usually the smallest part of a large VRML scene. The texture files on the other hand are often quite large. The larger the files are, the longer of course the loading time of a VRML scene will become. Another disadvantage is the fact that the world will render a lot slower while the user is moving around the scene. So it is recommended to try to keep the filesizes of the textures as small as possible. However, (smaller) images that are used as textures on larger faces will blow up the pixels. The choice has to be made here between a fast(er) or a nice(r) scene. There are two techniques that will help in combining these two choices:

    Limiting a virtual world

    Every virtual world has a certain size. If a user goes beyond the size of a world there is a big void. In VRML only the Background Node continues endlessly. A creator of a virtual world probably wants the users to stay within the boundaries of the world. Therefore it might be a good idea to limit the virtual world by placing 'walls' at the edges of the world. To keep the world looking like reality it will be necessary to add textures to these walls. These textures could for instance be pictures of trees or buildings, at least objects that are large enough to block the vision of a person in real life. In order to prevent users of the virtual world to bump into the surrounding walls and thus see clearly it's just a wall with a texture (and probably a very blocky one) on it, you could put up other walls a couple of metres in front of the textured walls. These other walls can be made transparent so users will be blocked by these walls before they even reach the outer walls. It is also possible to put the world inside a big box in such a way that the sides of the box are in the right position. A user inside a box will always be able to look through the sides, because they will be transparently rendered.

    Limiting a virtual world as described above is not foolproof. As long as a user stays in Walk mode he will indeed stay caught inside the world. However if a user turns on the Examine mode, collision detection is no longer applied which will result in the user's avatar being able to move through objects which in turn can lead to the avatar ending up outside the world limits or even worse inside an object. The Rotate navigation mode creates the same problem although collision detection is still applied for most objects except the object that the user is rotating around, so if the user for example rotates around the 'floor' of the world he might get stuck beneath the world. If the virtual world is not only limited by 'walls' but also by a 'ceiling' the Fly mode poses no problem at all. The nature of the virtual world that is being build is important in determining whether it is necessary to limit the world. When you are building part of the real world as a virtual one, boundaries are a good addition to your world. If the world however is a imaginary place there are no arguments against positioning it floating in a large empty sky.

    CASE: Virtual VU Campus

    This paragraph will give a description of the way I created the virtual world of the VU Campus, the decisions I had to make and the problems I had to overcome.

    General

    In order to automate several of the standard actions that are needed to produce a VRML scene, I have used a Makefile which makes it quite simple to make small adjustments to an inputfile needed for vrmlgen and quickly generate the resulting updated VRML file. The structure of the directories and files that I have created in the process is as follows:

    The main directory stores the files Makefile, vu.prewrl and vrmlgenoptions.lego and the following subdirectories:

    The Makefile checks dependencies between files, so if a certain bitmap file is edited, only the files that depend on it will be regenerated. In the vrmlgenoptions.lego file a couple of standard options for the configuration files are listed. This file is included by these configuration files.
    The vu.prewrl is the base file. All objects that will appear in the world are listed here in VRML pseudo code that will have to be processed by the preprocessor before it becomes a valid VRML file. The location, rotation and scale of all parts of the VRML world are also determined in this file.

    Science building

    The science building (Betagebouw) was the first part of the VU Campus I began to model in VRML. The Gebouwendienst (Building Service) of the VU was kind enough to give me access to 2D maps of all floors of every building on the VU Campus. I made copies of the ones I needed and scanned in all first floor maps. These maps (now in Windows Bitmap format) served as the starting point for the modelling of the buildings.
    I figured out that the height of one floor is (roughly) about 3.25 meters, including concrete. I decided to make the basic building block size for vrmlgen 0.55 x 1.65 x 0.55 so one floor of the building needs two maps, where the second may be a repetition of the first. I adjusted the size of the bitmap images to every pixel stand for a size of 0.55 by 0.55 meters.
    Starting out with the image of the first floor of the science building I began to edit it to create the second floor image, and used that image to create the third floor image and so on. During this process I didn't care about any coloring or texturing of the objects, only about the size and structure of them. I did regularly run the images through the Makefile and underlying tools to see how they turned out in VRML. Finally the result of all this was a plain VRML representation of the science building.

    When several bitmap images with a lot of different colors are used in one configuration file it might become difficult to keep using colors that can be easily distinguished from each other by the human eye. This can be solved by using the same color more than once in different images and mapping different characters to it with the colormaps of bmp2map. Doing this will keep the editing of the images relatively simple and keep it possible to map lots of colors and textures to the 3D objects.

    The next step was to 'paint' the building with the appropriate colors and textures. It is always useful to even color the parts that have textures, so it will have that color when for some reason the texture image doesn't load. It's quite simple with vrmlgen to assign colors and textures to the objects and scale the textures in the right way.

    When texture mapping 3D objects it is of course necessary to have the texture images that are needed available. A lot of more or less standard textures like bricks, grass and water can quite easily be found on the Internet. The more specific textures like the windows of the top floor of the science building I had to photograph myself. I could borrow a digital photo camera through one of my supervisors, Zhizheng Huang, that I used to take many photos of the VU Campus. The problem with taking photos to be used as textures is that you have to try to stand directly straight in front of the object in order to get good quality photographs. Otherwise the photos might get a distorted effect in them. For example, the top floors on some of the texture mapped buildings seem to topple forwards, because the textures were photographed under a sometimes rather large angle from the ground. Editing with Paint Shop Pro can help a little to decrease the effects of these distortions, but it will remain visible for the trained eye.


    Science building of VU Campus

    Main building

    The modeling of the main building of the VU campus was similar to the science building. I have used the same building block size for it, so the resolution of the bitmap images is the same as those of the science building. The building is generated out of six different maps.
    Texture mapping the main building gave some problems. First the height of the building (15 floors) obstructed me from taking good photos of it. I have edited these with Paint Shop Pro to improve the quality of the textures for the higher floors a bit. The second problem was an even bigger one; the front of the main building was and still is being renovated with the use of several large cranes that blocked the view almost entirely. I solved this by using textures of other parts of the buildings at the Vu Campus that looked most similar and used these. The front of this building in VRML now looks fairly accurately like what it looked like before the renovation started.


    Main building of VU Campus

    Provisorium

    The Provisorium is a small building that is located next to the main building. Using the same building block size again made it quite easy to add this building to the world at a later stage. Generating the Provisorium was simple because it is small, only two stories high and looks very rectangular. Only two textures (window and roof) needed to be mapped to the model to finish it.


    Provisorium at VU Campus

    VU Square

    The VU square was quite straightforward to model. It consists of two map layers, one is a large rectangle with only three different textures (water, grass and bricks) mapped onto it, the other is used to pinpoint the locations of the objects that are included on top of the square.


    Part of the square at VU Campus

    Trees & Lampposts

    The tree, lamp and small lamp prototypes were created with use of Spazz3D. I made the objects (without textures) with it and exported to VRML. The resulting code is not prototyped, so I edited it by hand, added textures and prototyped the code. The last step was to include the 3D objects in the world by editing the map-file and configuration file of vrmlgen (plein.map & plein.prelego).
     

    Flying Disk Animations

    The virtual world has two animated tours that can be started by pressing the buttons right next to the starting points. Users are able to take a Flying Disc tour around the square or another Flying Disc tour which takes the user up into the air to a more birdseye view of the Campus. I have created the code of these tour by hand. In order to easily find out what the coordinates were of the locations the tours visit, I used a piece of code that I found at Bob Crispen's VRML Site [xx]. This code displays a Heads Up Display (HUD) just in front of the avatar and shows what the coordinates of the present position of the avatar are. The only thing I had to do was to move around the world and write down the coordinates of appropriate locations for the tours to pass. In the case of the tour that stays on the ground, it was also necessary to make the disc (and avatar) change orientation at every direction change in order to make the avatar always face the direction in which the flying disc is going. This is done by using besides a PositionInterpolator also a RotationInterpolator. The orientation of the avatar should be changed quickly, which can be done by adding behind each RotationInterpolator key and keyValue pair another key/keyValue pair with only one fraction of a second difference. This makes the flying disc (and bound avatar, if any) rotate in that fraction of a second, while it would otherwise take the entire time until the next position for it to rotate. Because I wanted to be able at all times to let the avatar step off the disc and end the tour, I used a ProximitySensor that binds the viewpoint of an avatar that is (partly) inside it. This will make the avatar follow the disc while keeping the option open for the user to step of the disc. The tour through the sky was a little simpler because I bind the viewpoint of the avatar directly to the flying disc when the button is pressed. This makes the avatar change orientation (although not always the preferred orientation) and prevents the avatar from being able to fall off the disc and thus end up on top of a building, which I see as unwanted behavior. The drawback to binding the avatar like this is that the tour has to be followed from begin to end.


    Flying Disc starting point

    Limiting the virtual world

    The boundaries of the virtual world are four large walls that are made up out of two parts each. The lower parts of the walls are texture mapped with an image of trees. The upper parts are texture mapped with a gradient skycolored image. Invisible walls are placed a couple of meters in front of these walls to prevent the user from walking into them. Another invisible wall is located in the sky. All walls together with the 'floor' of the VU Campus limit the virtual world. Users are supposed to remain inside, although it would be possible to turn of collision detection and move through one of the walls.


    Bird's eye view on the VU Campus world

    Evaluation

    On the Internet several multi-user 3D virtual worlds that are created with VRML can be found. Most of these communities try to attract people by offers a variety of features. However, there is not very much attention being paid to enhance the 3D feeling that users have while they visit a virtual community. By taking immersion into account, this feeling can certainly be improved. At this moment the level of immersion found in the virtual communities in not very high.

    Creating a virtual world with vrmlgen is a task that doesn't require a lot of 3D design knowledge, because the program works only with 2D maps. On the other hand, it is necessary to have some knowledge about computers, because vrmlgen has to be operated from the command prompt and works with configurationfiles that have to be edited. A nice graphical user interface would help to lower the level of computer knowledge that is needed to work with vrmlgen.
    Vrmlgen is very much suited for modeling rectangular 3D objects. Other  (non-rectangular) objects will have to be created with other programs, but can be integrated quite simply within the generating process of vrmlgen. The ability to map textures on the 3D objects is another useful feature of the program.

    In the future the VU Campus virtual world will serve as a basic 3D environment that can be improved and extended by students that take part in a VRML course on the Vrije Universiteit. Particularly in the areas of interactivity and immersion the current world might be enhanced.

    References

    [1] RIF-Project - http://www.cs.vu.nl/~eliens/projects/rif

    [2] Carey R., Bell G., The annotated VRML 2.0 reference manual (1997) ISBN: 0-201-41974-2
        (website: http://www.best.com/~rikk/Book/)
    [3] Hartman J., Wernecke J., The VRML 2.0 Handbook - Building Moving Worlds on the Web (1996) ISBN: 0-201-47944-3

    [4] VRML97 Specification (ISO/IEC 14772-1:1997) - http://www.web3d.org/Specifications/VRML97/
    [5] Vu Campus World (will be closed somewhere in september 2000) - http://bruin011.cs.vu.nl
    [6] Floppy's VRML Guide - http://www.vapourtech.com/vrml
    [7] Bob Crispen's VRML Site - http://home.hiwaay.net/~crispen/vrmlworks/

    [8] Blaxxun (Contact, Community Server) - http://www.blaxxun.com
    [9] Parallel Graphics (Helios, Islands, Cortona VRML Browser, Vrmlpad) - http://www.parallelgraphics.com
    [10] Geometrek (Deepmatrix) - http://www.geometrek.com
    [11] VNET - http://ariadne.iz.net/~jeffs/vnet/
    [12] Active Worlds - http://www.activeworlds.com
    [13] Cybertown  - http://www.cybertown.com
    [14] Soccercity  - http://www.soccercity.de
    [15] Learnetix  - http://www.learnetix.de
    [16] Canal + 2nd World - http://virtuel.cplus.fr

    [17] Apache Software Foundation - http://www.apache.org
    [18] Blaxxun Instant Community Help - http://www.blaxxun.com/products/server/docs/41/ntv4.1/overview.html
    [19] VRML preprocessor webpage - http://www.cwi.nl/blaxxun/software/preprocessor/preprocessor.html
    [20] Vrmlgen webpage - http://www.cwi.nl/reblom/vrmlgen.html
    [21] Spazz3D - http://www.spazz3d.com

    [22] Shout3D - http://www.shout3d.com
    [23] Pulse3D - http://www.pulse3d.com
    [24] Blendo - http://www.web3d.org/TaskGroups/x3d/sony/Blendo.html
    [25] Lego - http://www.lego.com

    Appendices


    Appendix A

    Virtual Worlds - Table of Properties

    World Language Server Membership Intended public Extras
    Canal + Second World French Blaxxun yes Artists / Art fans Several 'real world' places, like the Louvre Museum
    Cybertown English Blaxxun yes Everyone Virtual jobs, (multi-user) games, special interest clubs
    Learnetix German Blaxxun yes Schoolchildren puzzles and quizzes 
    Soccercity German Blaxxun yes Soccer fans Some info about soccer
    DeepMatrix English Deepmatrix no Everyone none
    VNET English VNET no Everyone none
    Helios English/Russian Helios yes Everyone Drag & drop objects into worlds
    Active Worlds English Active Worlds yes, costs $19,95 / year Everyone In-world help in several languages

     

    Appendix B

    Virtual Worlds browsers

    Browser Platforms File Type Browser Type Worlds
    Blaxxun Contact 4.3 Windows VRML Plugin Single & Multi User
    Cortona VRML Client Windows, Mac VRML Plugin Single User
    Viscape Universal Windows VRML or SVR Plugin Single User
    ActiveWorlds Browser Windows RWX Stand Alone Multi User
    Islands Multi-User Client Windows VRML Stand Alone Single & Multi User
    GLView 4.3 Windows VRML Stand Alone Single User

    Virtual Worlds servers

    Server Platforms Needed Browser
    Blaxxun Community Server Windows NT/2000, Linux, Solaris Blaxxun Contact
    Helios Server Windows, Solaris Islands Multi User Client
    DeepMatrix Windows, Linux, Solaris Standard VRML-plugin
    VNET Windows 95/98, Mac Standard VRML-plugin
    ActiveWorlds Server Windows, Linux, Solaris Active Worlds Browser

     

    Appendix C: vrmlgen example of a shed

    bmp-files:


    map 1

    map 2

    map 3 - 9

    map 10

     

    configuration file:

    legocfgversion 1

    [options]
    unitsize             0.25
    usedefaultlights     1
    usedefaultviewpoints 1
    showgroundplane      0
    uselegoshape         0
    showknobs            0
    combinefaces         1
    legofaceincfile      ""
    legoshapeincfile     ""
    legoknobsincfile     ""

    [litincludes]
    [literal]
    PROTO Tree [
      exposedField SFVec3f translation      0 0 0
      exposedField SFInt32 size             1
      exposedField SFNode  woodtexture      NULL
      exposedField SFNode  leavetexture     NULL
    ]
    {
      Transform {
        translation IS translation
        children [
          Transform {
            translation 0 1.8 0
            children [
              Shape {
                appearance Appearance {
                  material Material {diffuseColor 0 .6 0}
                  texture IS leavetexture
                }
                geometry Sphere {
                  radius 1
                }
              }
            ]
          }
          Shape {
            appearance Appearance {
              material Material {diffuseColor .6 .3 0}
              texture IS woodtexture
            }
            geometry Cylinder {
              radius .2
              height 2
              top    FALSE
              bottom FALSE
            }
          }
        ]
      }
    }
    [/literal]

    [colors] {
    /*  a 1.00 0.33 0.06 0 */
      a 0.72 0.72 0.72 0
      b 0.00 0.00 1.00 0
      c 0.06 0.55 0.06 0
    }

    [toptextures] {
      b 10 6 0 "roof.png"
      c 5 5 0 "grass.png"
    }

    [sidetextures] {
      a 4 4 0 "brick.png"
    }

    [specialnodes] {
    t 0 1 0
    [literal]
    Tree {
      translation    %.2f %.2f %.2f
      woodtexture   ImageTexture {url "treewood.jpg"}
      leavetexture  ImageTexture {url "treeleaves.jpg"}
    }
    [/literal]
    }

    [maps]
    dx 20
    dz 15
    nrmaps 10

    /* 1st map */
    /*
    dx 20
    dz 15
    */
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    cccccccccccccccccccc
    /*
     .  0.000000 0.000000 0.000000
     a  0.000000 0.000000 0.972549
     t  0.000000 0.972549 0.000000
     b  0.000000 0.972549 0.972549
     c  0.972549 0.000000 0.000000
    */

    /* 2nd map*/
    /*
    dx 20
    dz 15
    */
    ....................
    .aaaaaaaaaaaaa......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a....t.
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .aaaaa....aaaa......
    ....................
    /*
     .  0.000000 0.000000 0.000000
     a  0.000000 0.000000 0.972549
     t  0.000000 0.972549 0.000000
     b  0.000000 0.972549 0.972549
     c  0.972549 0.000000 0.000000
    */
    /* offset for tree */

    0 1.4 0
     

    /* 3th map */
    /*
    dx 20
    dz 15
    */
    ....................
    .aaaaaaaaaaaaa......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .a...........a......
    .aaaaa....aaaa......
    ....................
    /*
     .  0.000000 0.000000 0.000000
     a  0.000000 0.000000 0.972549
     t  0.000000 0.972549 0.000000
     b  0.000000 0.972549 0.972549
     c  0.972549 0.000000 0.000000
    */

    /* 4th map to 9th map */
    repeat 6

    /* 10th map */
    /*
    dx 20
    dz 15
    */
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    bbbbbbbbbbbbbbb.....
    /*
     .  0.000000 0.000000 0.000000
     a  0.000000 0.000000 0.972549
     t  0.000000 0.972549 0.000000
     b  0.000000 0.972549 0.972549
     c  0.972549 0.000000 0.000000
    */