home *** CD-ROM | disk | FTP | other *** search
- // ActiveVRML 1.0 ASCII
- // CyberBall Sample Script
-
- // First we create the arena, starting with the four corners
- corner = first (import ("cyl.wrl"));
- cornercolor = colorRgb (0.5, 0.5, 0.5);
- post = diffuseColor (cornercolor,
- transformGeometry (scale (0.5, 0.5, 0.5), corner));
- corners = transformGeometry (translate (-15,0.20,-20), post) union
- transformGeometry (translate (-15, 0.20, 0), post) union
- transformGeometry (translate (-15, 0.20, 20), post) union
- transformGeometry (translate (15, 0.20, -20), post) union
- transformGeometry (translate (15, 0.20, 0), post) union
- transformGeometry (translate (15, 0.20, 20), post);
-
- // Now the goals
- goal1 = diffuseColor (colorRgb (0.5, 0.5, 1.0),
- transformGeometry (scale (0.3, 0.5, 0.3), corner));
- goal2 = diffuseColor (colorRgb (1.0, 0.5, 0.5),
- transformGeometry (scale (0.3, 0.5, 0.3), corner));
- goals = transformGeometry (translate (-3, 0.20, -20), goal1) union
- transformGeometry (translate (3.0, 0.20, -20.0), goal1) union
- transformGeometry (translate (-3.0, 0.20, 20.0), goal2) union
- transformGeometry (translate (3.0, 0.20, 20.0), goal2);
-
- // Set up some side rails and end rails
- rail = first (import ("stick.wrl"));
- railcolor = colorRgb (0.5, 3.0, 0.5);
- siderail = diffuseColor (railcolor, transformGeometry (
- rotate (yVector3, 1.57079) o scale (1.0, 0.3, 0.2), rail));
- sides = transformGeometry (translate(-15, 0, -10), siderail) union
- transformGeometry (translate (15, 0, -10), siderail) union
- transformGeometry (translate (-15, 0, 10), siderail) union
- transformGeometry (translate (15, 0, 10), siderail);
- endrail = diffuseColor (railcolor,
- transformGeometry (scale (0.6, 0.3, 0.2), rail));
- ends = transformGeometry (translate (-9.0, 0, -20), endrail) union
- transformGeometry (translate (9.0, 0, -20.0), endrail) union
- transformGeometry (translate (-9.0, 0, 20.0), endrail) union
- transformGeometry (translate (9.0, 0, 20.0), endrail);
- rails = sides union ends;
-
- // Create some lights
- lights = lightColor (colorRgb (0.5, 0.5, 0.5),
- transformGeometry (rotate (xVector3, -0.1), directionalLight)
- union
- transformGeometry (rotate (xVector3, 3.24), directionalLight));
-
- // Put it all together and define a background
- arena = corners union goals union rails union lights;
- backgnd = first (import ("backgnd.gif"));
-
- // Build a puck
- puck, pmin, pmax = import ("puck.wrl");
- puckradius = xComponent (smax) * 0.05;
- correctedpuck = transformGeometry (scale(0.05, 0.05, 0.05), puck);
- coloredpuck = diffuseColor (red, correctedpuck);
-
- // Build a player
- socket, smin, smax = import ("socket.wrl");
- playerradius = xComponent (smax) * 0.1;
- correctedsocket = transformGeometry (rotate (xVector3, 1.57079) o
- scale(0.1, 0.1, 0.1), socket);
- coloredsocket = diffuseColor (blue, correctedsocket);
- ball = first (import ("ball.wrl"));
- correctedball = transformGeometry (translate (0, 0.6, 0) o
- scale (1.3, 1.3, 1.3), ball);
- spinningball = transformGeometry (rotate (yVector3, time * 3),
- correctedball);
- coloredball = diffuseColor (red, spinningball);
- player = coloredsocket union coloredball;
-
- // Load some sounds
- winner = first (import ("winner.wav"));
- loser = first (import ("loser.wav"));
- wallhit = first (import ("wallhit.wav"));
- puckhit = first (import ("puckhit.wav"));
-
- // Helper function to restrict value to a specified range
- clamp (val, min, max) = if (val < min) then min
- else if (val > max) then max
- else val;
-
- // User input events
- keyleft = keyState (vkLeft);
- keyright = keyState (vkRight);
- keyforward = keyState (vkUp);
- keyback = keyState (vkDown);
-
- // Handle player motion
- playermover (pos0 : vector3, vel0 : vector3) =
- let
- rebound (pos : vector3, vel : vector3, snd) =
- let
- // Dampen function slows player down over time
- dampen (oldvel : vector3) =
- vector3Xyz (xComponent (oldvel) * 0.5 / time,
- 0, zComponent (oldvel) * 0.5 / time);
-
- // Calculate force(s) appied by user control
- accelstrength = 5;
- forwardaccel =
- if keyforward then
- vector3Xyz (0, 0, -accelstrength)
- else if keyback
- then vector3Xyz (0, 0, accelstrength)
- else zeroVector3;
- sideaccel =
- if keyleft
- then vector3Xyz (-accelstrength, 0, 0)
- else if keyright
- then vector3Xyz (accelstrength, 0, 0)
- else zeroVector3;
- pushvel = integral (forwardaccel + sideaccel);
-
- // Calculate new unclamped velocity
- newvel = dampen (vel) + pushvel;
- magnitude = length (newvel);
-
- // Clamp velocity
- newmagnitude = clamp (magnitude, -4, 4);
- velocity = normal (newvel) * newmagnitude;
-
- // Calculate new position
- newpos = pos + integral (velocity);
- xpos = (xComponent (newpos));
- zpos = (zComponent (newpos));
-
- // Handle side wall collisions
- sideextent = 15 - playerradius;
- sidecollide = predicate ((xpos < -sideextent) or
- (xpos > sideextent));
- sidenewvel = vector3Xyz (xComponent (velocity) * -1,
- yComponent (velocity), zComponent (velocity));
- sidenewpos = vector3Xyz (clamp (xComponent (newpos),
- -sideextent, sideextent), 0, zComponent (newpos));
-
- // Handle end wall collisions
- endextent = 20 - playerradius;
- endcollide = predicate ((zpos < -endextent) or
- (zpos > endextent));
- endnewvel = vector3Xyz (xComponent(velocity),
- yComponent(velocity), zComponent(velocity) * -1);
- endnewpos = vector3Xyz (xComponent (newpos), 0,
- clamp (zComponent(newpos), -endextent, endextent));
-
- in
- (newpos, velocity, snd) until
- snapshot ((sidenewpos, sidenewvel, wallhit),
- sidecollide) => rebound |
- snapshot ((endnewpos, endnewvel, wallhit),
- endcollide) => rebound;
- in
- rebound (pos0, vel0, silence);
-
-
- // Handle puck motion
- puckmover (pos0 : vector3, vel0, ppos0, pvel0, score0) =
- let
- rebound (pos : vector3, vel, ppos1, pvel1, snd, oldscore) =
- let
- // Dampen function slows puck down over time
- dampen (oldvel : vector3) =
- vector3Xyz (xComponent (oldvel) * 0.5 / time,
- 0, zComponent (oldvel) * 0.5 / time);
- velocity = dampen (vel);
-
- // Calculate new position
- newpos = pos + integral (velocity);
- xpos = (xComponent (newpos));
- zpos = (zComponent (newpos));
-
- // Handle side wall collisions
- sideextent = 15 - puckradius;
- sidecollide = predicate ((xpos < -sideextent) or
- (xpos > sideextent));
- sidenewvel = vector3Xyz (xComponent (velocity) * -1,
- 0, zComponent (velocity));
- sidenewpos = vector3Xyz (clamp (xComponent (newpos),
- -sideextent, sideextent), 0, zComponent (newpos));
-
- // Handle end wall collisions
- endextent = 20 - puckradius;
- endcollide = predicate (((zpos < -endextent) or
- (zpos > endextent)) and ((xpos<-3) or (xpos>3)));
- endnewvel = vector3Xyz (xComponent(velocity),
- 0, zComponent(velocity) * -1);
- endnewpos = vector3Xyz (xComponent (newpos), 0,
- clamp (zComponent(newpos), -endextent, endextent));
-
- // Goal-keeping functions
- EVENTSCORE = 200;
- goalnewvel = zeroVector3;
- goalnewpos = zeroVector3;
- goodscore = oldscore + 1;
- badscore = oldscore - 1;
-
- // Handle good goal collisions
- goal1event = predicate ((zpos < -endextent) and
- (xpos > -3) and (xpos < 3));
- collide1data = snapshot (goodscore, goal1event);
- goal1collide = exportEvent (collide1data, EVENTSCORE);
-
- // Handle bad goal collisions
- goal2event = predicate ((zpos > endextent) and
- (xpos > -3) and (xpos < 3));
- collide2data = snapshot (badscore, goal2event);
- goal2collide = exportEvent (collide2data, EVENTSCORE);
-
- // Determine player's position, velocity, and sound
- (ppos, pvel, psound) = playermover (ppos1, pvel1);
- mixsnd = snd mix psound;
-
- // Handle player collisions
- relativevector = newpos - ppos;
- playercollide = predicate (length (relativevector) <
- (playerradius + puckradius));
- oldenergy = length (velocity);
-
- // Clamp velocity
- newvel = relativevector * oldenergy + velocity + pvel;
- magnitude = length (newvel);
- newmagnitude = clamp (magnitude, -4, 4);
- phitnewvel = normal (newvel) * newmagnitude;
- phitnewpos = newpos + normal (phitnewvel) *
- (playerradius + puckradius);
-
- in
- (newpos, velocity, ppos, pvel, mixsnd, oldscore) until
- snapshot ((sidenewpos, sidenewvel,ppos, pvel, wallhit,
- oldscore), sidecollide) => rebound |
- snapshot ((endnewpos, endnewvel,ppos, pvel, wallhit,
- oldscore), endcollide) => rebound |
- snapshot ((goalnewpos,goalnewvel,ppos, pvel, winner,
- goodscore), goal1collide) => rebound |
- snapshot ((goalnewpos,goalnewvel,ppos, pvel, loser,
- badscore), goal2collide) => rebound |
- snapshot ((phitnewpos,phitnewvel,ppos, pvel, puckhit,
- oldscore), playercollide) => rebound;
- in
- rebound (pos0, vel0, ppos0, pvel0, silence, score0);
-
- (puckpos, puckvelocity, playerpos, playervelocity, sounds, score)=
- puckmover (vector3Xyz (0, 0, -5), vector3Xyz (-2, 0, 0),
- vector3Xyz (-10, 0, -6), vector3Xyz (-2, 0, 0), 0);
-
- // Apply all positional changes to the player and the puck
- puckmotion = translate (puckpos) o rotate (yVector3, time * 2.9);
- activepuck = transformGeometry (puckmotion, coloredpuck);
- playermotion = translate (playerpos) o rotate (yVector3, time);
- activeplayer = transformGeometry (playermotion, player);
-
- // HTML User Input Events
- EVENTSTART = 100;
- EVENTSTATIC = 101;
- EVENTORBITAL = 102;
- EVENTTRACKING = 103;
- extstartevent = importUnitEvent (EVENTSTART);
- extstaticevent = importUnitEvent (EVENTSTATIC);
- extorbitalevent = importUnitEvent (EVENTORBITAL);
- exttrackingevent = importUnitEvent (EVENTTRACKING);
-
- // Define the linear tracking and the orbital cameras
- staticxform = rotate (xVector3, -0.25) o scale (1, 1, 0.3) o
- translate (0, 0.5, 200 + zComponent (playerpos));
- orbitxform = rotate (yVector3, time / 4) o
- rotate (xVector3, -0.25) o scale (1, 1, 0.3) o
- translate (0, 0.5, 200);
-
- // Determine current camera transformation
- cameraxform (xform) = xform until
- extstaticevent => cameraxform (staticxform) |
- extorbitalevent => cameraxform (orbitxform);
- currentxform = cameraxform (staticxform);
- camera = transformCamera (currentxform, defaultCamera);
-
- // Use camera transformation to position headlight
- headlight = transformGeometry (currentxform,
- lightColor (colorRgb (0.5, 0.5, 0.5), directionalLight));
-
- // Compute cropped area
- topright = point2Xy (xComponent (viewerUpperRight),
- yComponent (viewerUpperRight));
- bottomleft = point2Xy (-xComponent (viewerUpperRight),
- -yComponent (viewerUpperRight));
-
- // Ouput everything
- totalsounds = sounds;
- totalobjects = arena union activepuck union activeplayer;
- totalimage = crop (bottomleft, topright,
- renderedImage (totalobjects union headlight, camera));
- model = (totalimage over backgnd, totalsounds, totalsounds)
- until extstartevent => model;
-