Once you build more complex objects you want to reuse smaller elements in different ways. So, learning how to define =>PROTO node is important before you really start to produce a lot of VRML code. PROTOs define a new node name with custom fields you can specify. In other words, PROTOs allow you to extend the language by adding your own nodes. In this respect, PROTOs are much more powerful than simple DEFs/USEs that only allow to apply transformations to reused objects.
The structure of a simple PROTO is the following:
PROTO prototypename [ field fieldtypename name defaultValue field fieldtypename name defaultValue ... ] {node}Let's look shortly at the definition of fields. Here is an example taken from below:
field SFColor legColor .8 .4 .7field is just a keyword you must use. SFColor is a valid VRML ``field type name'' (see section 8.4 on page . legColor is the name that the field will have and ``.8 .4 .7'' are it's default values. If this is unclear, go through the next two examples and see how they are used.
VRML: | ../examples/inter/inter-proto-1.wrl |
Source: | ../examples/inter/inter-proto-1.text |
Here is an example of three stools. It is taken from the =>VRML II Specification.
It defines a ``TwoColorStool'' node with two public fields named ``legColor'' and ``seatColor'' that one can modify when making instances. Note that there are default colors (pink legs and a yellow seat)
#VRML V2.0 utf8 PROTO TwoColorStool [ field SFColor legColor .8 .4 .7 field SFColor seatColor .6 .6 .1 ] { Transform { children [ Transform { # stool seat translation 0 0.6 0 children Shape { appearance Appearance { material Material { diffuseColor IS seatColor } } geometry Box { size 1.2 0.2 1.2 } } } Transform { # first stool leg translation -.5 0 -.5 children DEF Leg Shape { appearance Appearance { material Material { diffuseColor IS legColor } } geometry Cylinder { height 1 radius .1 } } } Transform { # another stool leg translation .5 0 -.5 children USE Leg } Transform { # another stool leg translation -.5 0 .5 children USE Leg } Transform { # another stool leg translation .5 0 .5 children USE Leg } ] # End of root Transform's children } # End of root Transform } # End of prototype # The prototype is now defined. Although it contains a number of nodes, # only the legColor and seatColor fields are public. # Instead of using the default legColor and seatColor, # this instance of the stool has red legs and a green seat: TwoColorStool { legColor 1 0 0 seatColor 0 1 0 } # The chair to the right has yellow legs and a bright blue seat: Transform { translation 2 0 0 children [ TwoColorStool { legColor 1 1 0 seatColor 0 1 1 } ] } # The chair to the left uses the default colors Transform { translation -2 0 0 children [ TwoColorStool { } ] } NavigationInfo { type "EXAMINE"} # Use the Examine viewer
You can look at an another (locally produced) example that uses embedded protos: Patrick Jermann's MOO Ants.
VRML: | ../examples/inter/inter-proto-ant.wrl |
Source: | ../examples/inter/inter-proto-ant.text |
This example uses PROTOS within PROTOS, a facility which can add additional modularity to your VRML worlds.