Creating new node types
robot.wrl

	

#VRML V2.0 utf8
#
#  Robot generator
#  robot.wrl
#	by David R. Nadeau
#
#  This file illustrates the use of PROTO to create new node types.
#  For this example, we create a new "Robot" node type that has three
#  fields, one each for setting the robot's metal color (it's body),
#  its eye color, and it's rod color (gadgets on the body).  Those
#  three fields are used within the body of the PROTO where the robot's
#  form is constructed.  Each time a PROTO field (metal, eye, and rod
#  colors) is used within the PROTO body, use the "IS" syntax to say:
#
#	"this field within the PROTO body IS equal to the argument in
#	the PROTO interface"
#

WorldInfo {
    title "Robot Generator"
    info [ "Copyright (c) 1998, David R. Nadeau" ]
}

Viewpoint {
    position 0.0 3.6 6.8
    orientation 1.0 0.0 0.0 -0.34
    description "Entry view"
}

NavigationInfo {
    type [ "EXAMINE", "ANY" ]
    headlight TRUE
}

Background {
    skyColor [
        0.0 0.0 0.0,
        0.0 0.0 0.0,
        0.4 0.0 0.0,
        0.6 0.0 0.0,
    ]
    skyAngle [
        1.77
        1.87,
        1.97,
    ]
}


#
#  Build a Robot with field to set the robot's colors.
#  Use those colors within the Robot node's body definition using
#  the "IS" syntax.
#
PROTO Robot [
    field SFColor metalColor 0.6 0.6 0.8
    field SFColor eyeColor   0.6 0.0 0.0
    field SFColor rodColor   1.0 1.0 0.0
] {
    Group {
        children [
        # Body
                # Torso sphere
                Shape {
                    appearance DEF RobotColor Appearance {
                        material Material {
                            diffuseColor IS metalColor
                        }
                    }
                    geometry Sphere {
                        radius 0.5
                    }
                }

                # Support rods
                DEF Rod Transform {
                    translation 0.4 0.6 0.0
                    rotation 0.0 0.0 1.0 -0.785
                    children [
                        Shape {
                            appearance DEF RobotGlow Appearance {
                                material Material {
                                    diffuseColor 0.0 0.0 0.0
                                    emissiveColor IS rodColor
                                }
                            }
                            geometry Cylinder {
                                height 0.65
                                radius 0.04
                            }
                        }
                    ]
                }
                Transform {
                    rotation 0.0 1.0 0.0 1.57
                    children [ USE Rod ]
                }
                Transform {
                    rotation 0.0 1.0 0.0 3.14
                    children [ USE Rod ]
                }
                Transform {
                    rotation 0.0 1.0 0.0 -1.57
                    children [ USE Rod ]
                }

                # Shoulders
                Transform {
                    translation 0.0 0.85 0.0
                    children [
                        Shape {
                            appearance USE RobotColor
                            geometry Cylinder {
                                height 0.1
                                radius 0.8
                            }
                        }
                    ]
                }

                # Neck
                Transform {
                    translation 0.0 0.95 0.0
                    children [
                        Shape {
                            appearance USE RobotColor
                            geometry Cylinder {
                                height 0.1
                                radius 0.2
                            }
                        }
                    ]
                }


        # Head
            Billboard {
                axisOfRotation 0.0 1.0 0.0
                children [
                    Transform {
                        translation 0.0 1.4 0.0
                        children [
                            # Head
                            Shape {
                                appearance USE RobotColor
                                geometry Sphere {
                                    radius 0.5
                                }
                            }
    
                            # Eyebrow
                            Transform {
                                translation 0.0 0.25 0.35
                                children [
                                    Shape {
                                        appearance Appearance {
                                            material Material {
                                                diffuseColor 0.2 0.2 0.2
                                            }
                                        }
                                        geometry Box {
                                            size 0.6 0.05 0.2
                                        }
                                    }
                                ]
                            }
    
                            # Right Eye
                            Transform {
                                translation 0.1 0.15 0.38
                                children [
                                    DEF Eye Shape {
                                        appearance Appearance {
                                            material Material {
                                                diffuseColor 0.0 0.0 0.0
                                                emissiveColor IS eyeColor
                                            }
                                        }
                                        geometry Sphere {
                                            radius 0.09
                                        }
                                    }
                                ]
                            }
    
                            # Left Eye
                            Transform {
                                translation -0.1 0.15 0.38
                                children [ USE Eye ]
                            }
    
                            # Right Antenae
                            Transform {
                                translation 0.85 0.1 0.0
                                children [
                                    Transform {
                                        translation -0.2 0.0 0.0
                                        rotation 0.0 0.0 1.0 1.57
                                        children [
                                            DEF AntenaeBar Shape {
                                                appearance USE RobotColor
                                                geometry Cylinder {
                                                    height 0.4
                                                    radius 0.04
                                                }
                                            }
                                        ]
                                    }
                                    Shape {
                                        appearance USE RobotColor
                                        geometry Sphere {
                                            radius 0.09
                                        }
                                    }
                                    Transform {
                                        translation 0.0 0.58 0.0
                                        children [
                                            Shape {
                                                appearance USE RobotGlow
                                                geometry Cone {
                                                    height 1.0
                                                    bottomRadius 0.02
                                                }
                                            }
                                        ]
                                    }
                                ]
                            }
    
                            # Left Antenae
                            Transform {
                                translation -0.85 0.1 0.0
                                children [
                                    Transform {
                                        translation 0.2 0.0 0.0
                                        rotation 0.0 0.0 1.0 -1.57
                                        children [ USE AntenaeBar ]
                                    }
                                    Transform {
                                        rotation 0.0 0.0 1.0 0.785
                                        children [
                                            Shape {
                                                appearance USE RobotColor
                                                geometry Box {
                                                    size 0.2 0.2 0.2
                                                }
                                            }
                                            Transform {
                                                translation 0.0 0.58 0.0
                                                children [
                                                    Shape {
                                                        appearance USE RobotGlow
                                                        geometry Box {
                                                            size 0.02 1.0 0.02
                                                        }
                                                    }
                                                ]
                                            }
                                            Transform {
                                                translation 0.0 0.95 0.0
                                                children [
                                                    Shape {
                                                        appearance USE RobotGlow
                                                        geometry Box {
                                                            size 0.2 0.02 0.02
                                                        }
                                                    }
                                                ]
                                            }
                                            Transform {
                                                translation 0.0 0.85 0.0
                                                children [
                                                    Shape {
                                                        appearance USE RobotGlow
                                                        geometry Box {
                                                            size 0.4 0.02 0.02
                                                        }
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
}



#
#  Build an army of robots
#
Robot {
	metalColor 0.6 0.6 0.8
	eyeColor   1.0 0.0 0.0
	rodColor   1.0 1.0 0.0
}
Transform {
	translation -2.0 0.0 0.0
	children [
		Robot {
			metalColor 0.6 0.5 0.3
			eyeColor   0.0 1.0 0.0
			rodColor   1.0 0.5 0.0
		}
	]
}
Transform {
	translation 2.0 0.0 0.0
	children [
		Robot {
			metalColor 0.6 0.3 0.8
			eyeColor   0.0 0.8 1.0
			rodColor   0.0 0.8 1.0
		}
	]
}
Transform {
	translation 4.5 0.0 -3.0
	children [
		Robot {
			metalColor 0.0 0.4 0.9
			eyeColor   0.0 0.0 0.0
			rodColor   1.0 0.0 0.5
		}
	]
}
Transform {
	translation 1.5 0.0 -3.0
	children [
		Robot {
			metalColor 0.6 0.6 0.5
			eyeColor   0.0 1.0 0.0
			rodColor   1.0 1.0 0.0
		}
	]
}
Transform {
	translation -1.5 0.0 -3.0
	children [
		Robot {
			metalColor 1.0 0.5 0.5
			eyeColor   1.0 1.0 0.0
			rodColor   1.0 0.0 1.0
		}
	]
}
Transform {
	translation -4.5 0.0 -3.0
	children [
		Robot {
			metalColor 0.0 0.5 1.0
			eyeColor   1.0 0.0 0.0
			rodColor   0.5 0.0 1.0
		}
	]
}