#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 } }