Creating new node types
bounce3.wrl

	

#VRML V2.0 utf8
#
#  bounce3.wrl
#  Bouncing beachball (with PROTO and JavaScript)
#    by David R. Nadeau
#
#  This world illustrates the use of a PROTO to encapsulate a Script
#  node, timer, shape, and routes to create a vertically bouncing
#  beach ball.
#
#  The bounce path is based upon the projectile motion equation of
#  physics, constrained to create a cyclic bouncing path with a
#  user-selected maximum bounce height.  Also, there is no friction,
#  drag, or damping.  For an explanation of the script, see 'bounce1.wrl'.
#

WorldInfo {
        title "Bouncing beachball (PROTO)"
        info [ "Copyright (c) 1997, David R. Nadeau" ]
}

Viewpoint {
    position 0.0 0.6 8.0
    orientation 1.0 0.0 0.0 0.1
}

NavigationInfo {
    type [ "WALK", "ANY" ]
    headlight FALSE
    speed 2.0
}

DirectionalLight {
    ambientIntensity 0.5
    direction 0.0 -1.0 -0.5
}

#
#  Sky
#
Background {
    skyColor [
        0.0 0.0 1.0,
        0.0 0.5 1.0,
        0.7 0.7 1.0,
    ]
    skyAngle [
        1.371,
        1.571,
    ]
}


#
#  Beach
#
Shape {
    appearance Appearance {
        material Material { }
        texture ImageTexture { url "sand.jpg" }
        textureTransform TextureTransform { scale 10.0 10.0 }
    }
    geometry IndexedFaceSet {
        coord Coordinate {
            point [
                -50.0 -1.0  50.0,
                 50.0 -1.0  50.0,
                 50.0 -1.0 -50.0,
                -50.0 -1.0 -50.0,
            ]
        }
        coordIndex [ 0, 1, 2, 3 ]
        solid FALSE
    }
}


#
#  Palm trees
#
Transform {
    translation -3.0 -1.0 -10.0
    children [
        DEF Palm Group {
            children [
            # Palm tree - in a billboard so it is never edge-on
                Billboard {
                    children [
                        Shape {
                            appearance Appearance {
                                material NULL  # emissive texturing
                                texture ImageTexture { url "palm.png" }
                            }
                            geometry IndexedFaceSet {
                                coord Coordinate {
                                    point [
                                        -2.5  0.0 0.0,
                                         2.5  0.0 0.0,
                                         2.5 11.25 0.0,
                                        -2.5 11.25 0.0,
                                    ]
                                }
                                coordIndex [ 0, 1, 2, 3 ]
                                texCoord TextureCoordinate {
                                        point [
                                                0.0 0.0,
                                                1.0 0.0,
                                                1.0 1.0,
                                                0.0 1.0,
                                        ]
                                }
                                texCoordIndex [ 0, 1, 2, 3 ]
                                solid FALSE
                            }
                        }
                    ]
                }
            # Fake tree shadow - a black semi-transparent rectangle with
            # a texture map to give it the right shape
                Shape {
                    appearance Appearance {
                        material Material {
                                diffuseColor 0.0 0.0 0.0
                                transparency 0.5
                        }
                        texture ImageTexture { url "palmsh.png" }
                    }
                    geometry IndexedFaceSet {
                        coord Coordinate {
                            point [
                                -2.5  0.05  2.5,
                                 2.5  0.05  2.5,
                                 2.5  0.05 -2.5,
                                -2.5  0.05 -2.5,
                            ]
                        }
                        coordIndex [ 0, 1, 2, 3 ]
                        texCoord TextureCoordinate {
                                point [
                                        0.0 0.0,
                                        1.0 0.0,
                                        1.0 1.0,
                                        0.0 1.0,
                                ]
                        }
                        texCoordIndex [ 0, 1, 2, 3 ]
                        solid FALSE
                    }
                }
            ]
        }
    ]
}
Transform { translation -5.0 -1.0  -6.0 scale 0.6 0.6 0.6 children USE Palm }
Transform { translation  5.0 -1.0  -9.0 children USE Palm }
Transform { translation 10.0 -1.0 -15.0 children USE Palm }


#
#  Bouncing ball prototype
#
PROTO BouncingBall [
    field SFFloat bounceHeight  1.0
    field SFTime  bounceTime 1.0
] {
    DEF Ball Transform {
        # animated translation
        children [
            Shape {
                appearance Appearance {
                    material Material {
                        ambientIntensity 0.5
                        diffuseColor 1.0 1.0 1.0
                        specularColor 0.7 0.7 0.7
                        shininess 0.4
                    }
                    texture ImageTexture { url "beach.jpg" }
                    textureTransform TextureTransform { scale 2.0 1.0 }
                }
                geometry Sphere { }
            }
        ]
    }
    DEF Clock TimeSensor {
        cycleInterval IS bounceTime
        startTime 1.0
        stopTime 0.0
        loop TRUE
    }
    DEF Bouncer Script {
        field    SFFloat bounceHeight IS bounceHeight
        eventIn  SFFloat set_fraction
        eventOut SFVec3f value_changed

        # change 'vrmlscript' to 'javascript' for newer browsers
        url "vrmlscript:
            function set_fraction( frac, tm ) {
                y = 4.0 * bounceHeight * frac * (1.0 - frac);
                value_changed[0] = 0.0;
                value_changed[1] = y;
                value_changed[2] = 0.0;
            }"
    }
    ROUTE Clock.fraction_changed      TO Bouncer.set_fraction
    ROUTE Bouncer.value_changed       TO Ball.set_translation
}



#
#  Bouncing beachballs
#
BouncingBall { bounceTime 2.0 bounceHeight 3.0 }
Transform {
    translation  2.0 0.0 -2.0
    children BouncingBall { bounceTime 2.2 bounceHeight 2.5 }
}
Transform {
    translation -2.0 0.0 -2.0
    children BouncingBall { bounceTime 2.4 bounceHeight 3.5 }
}