#VRML V2.0 utf8 # Author : Gilliean Lee # Course : CAP 5805 Homework #2 Group { children [ # Helix 1. initially empty. get coordinates by HelixMaker Shape { appearance Appearance { material Material { diffuseColor 0.3 0.3 0.5 } } geometry DEF Helix1 Extrusion { crossSection [ ] spine [ ] creaseAngle 1.57 beginCap FALSE endCap FALSE } }, # Helix maker1 DEF HelixMaker1 Script { url "generatehelix.js" field SFFloat crossSectionRadius .07 field SFFloat spineRadius 2.0 field SFInt32 crossSectionResolution 32 field SFInt32 spineResolution 32 field SFFloat height 2.0 field SFInt32 direction 1 eventIn SFFloat set_crossSectionRadius eventIn SFFloat set_spineRadius eventOut MFVec2f crossSection_changed eventOut MFVec3f spine_changed }, Shape { appearance Appearance { material Material { diffuseColor 0.0 0.5 0.5 } } geometry DEF Helix2 Extrusion { crossSection [ ] spine [ ] creaseAngle 1.57 beginCap FALSE endCap FALSE } }, # Helix maker2. right helix's radius is smaller than left helix to prevent balls from collision. DEF HelixMaker2 Script { url "generatehelix.js" field SFFloat crossSectionRadius .07 field SFFloat spineRadius 1.6 field SFInt32 crossSectionResolution 32 field SFInt32 spineResolution 32 field SFFloat height 2.0 field SFInt32 direction 0 eventIn SFFloat set_crossSectionRadius eventIn SFFloat set_spineRadius eventOut MFVec2f crossSection_changed eventOut MFVec3f spine_changed }, # upper plate. act as a touch sensor, trigger Transform { translation 0 2.1 0 children [ DEF UPPLATE TouchSensor { } DEF COLUMN Shape { appearance DEF A Appearance { texture ImageTexture { url "wall2.jpg" } material Material { transparency .3 } } geometry Cylinder { height .2 radius 2.2 } } ] }, #lower plate. Transform { translation 0 -2.1 0 children [ DEF DOWNPLATE TouchSensor { } USE COLUMN ] }, #center column Shape { appearance Appearance { material Material { diffuseColor 0.5 0.3 0.3 } } geometry Cylinder { height 4.0 radius .07 } }, # Ball on the right. Transform { translation 1.6 2.0 0 children DEF BALL1TRANSFORM Transform { children [ Sound { source DEF Source1 AudioClip { url "setup0.wav" loop FALSE } minFront 10 minBack 10 maxFront 14.0 maxBack 14.0 } DEF BALL Shape { appearance Appearance { material Material { diffuseColor 1.0 .1 .1 emissiveColor .1 .0 .0 } } geometry Sphere { radius .2 } } ] } }, #Ball on the left Transform { translation -2.0 2.0 0 children [ DEF BALL2TRANSFORM Transform { children[ Sound { source DEF Source2 AudioClip { url "welcom98.wav" loop FALSE } minFront 10 minBack 10 maxFront 14.0 maxBack 14.0 } Shape { appearance Appearance { material Material { diffuseColor 0 1.0 0 } } geometry Sphere { radius .2 } } ] } ] }, # Ball on the center Transform { translation 0.0 2 0 children [ DEF BALL3TRANSFORM Transform { children [ Sound { source DEF Source3 AudioClip { url "canyon.mid" loop FALSE } minFront 10.0 minBack 10.0 maxFront 12.0 maxBack 12.0 } Shape { appearance Appearance { material Material { diffuseColor 0 0 1.0 } } geometry Sphere { radius .2 } } ] } ] }, #Animation Clock for Ball1 DEF Clock1 TimeSensor { cycleInterval 5 enabled TRUE loop FALSE }, #Animation Clock for Ball2 DEF Clock2 TimeSensor { cycleInterval 7.5 enabled TRUE loop FALSE }, #Animation Clock for Ball3 DEF Clock3 TimeSensor { cycleInterval 4 enabled TRUE loop FALSE } #Animation script for Ball 1 DEF Mover1 Script { url "TraceInterpolator.js" field SFFloat height 2.0 field SFInt32 direction 0 field SFFloat spineRadius 1.6 field SFFloat x_transform 1.6 eventIn SFFloat set_fraction eventOut SFVec3f value_changed }, #Animation script for Ball 2 DEF Mover2 Script { url "TraceInterpolator.js" field SFFloat height 2.0 field SFInt32 direction 1 field SFFloat spineRadius 2.0 field SFFloat x_transform 2.0 eventIn SFFloat set_fraction eventOut SFVec3f value_changed }, #Animation script for Ball 3 DEF Mover3 Script { url "TraceInterpolator.js" field SFFloat height 2.0 field SFInt32 direction 2 field SFFloat spineRadius 2.0 field SFFloat x_transform 2.0 eventIn SFFloat set_fraction eventOut SFVec3f value_changed }, #Script to calculate music stop time related to ball 1. DEF StopTimeCalculate1 Script { eventIn SFBool isActive field SFTime cycleInterval 5 eventOut SFTime stopTime url "javascript: function isActive(value,timestamp) { if (value == true) stopTime = timestamp + cycleInterval; }" }, #Script to calculate music stop time related to ball 2. DEF StopTimeCalculate2 Script { eventIn SFBool isActive field SFTime cycleInterval 7.5 eventOut SFTime stopTime url "javascript: function isActive(value,timestamp) { if (value == true) stopTime = timestamp + cycleInterval; }" }, #Script to calculate music stop time related to ball 3. DEF StopTimeCalculate3 Script { eventIn SFBool isActive field SFTime cycleInterval 4.0 eventOut SFTime stopTime url "javascript: function isActive(value,timestamp) { if (value == true) stopTime = timestamp + cycleInterval; }" } ] } ROUTE UPPLATE.touchTime TO Source1.set_startTime ROUTE UPPLATE.touchTime TO Source2.set_startTime ROUTE UPPLATE.touchTime TO Source3.set_startTime ROUTE UPPLATE.touchTime TO Clock1.set_startTime ROUTE UPPLATE.touchTime TO Clock2.set_startTime ROUTE UPPLATE.touchTime TO Clock3.set_startTime ROUTE Clock1.isActive TO StopTimeCalculate1.isActive ROUTE Clock2.isActive TO StopTimeCalculate2.isActive ROUTE Clock3.isActive TO StopTimeCalculate3.isActive ROUTE StopTimeCalculate1.stopTime TO Source1.set_stopTime ROUTE StopTimeCalculate2.stopTime TO Source2.set_stopTime ROUTE StopTimeCalculate3.stopTime TO Source3.set_stopTime ROUTE DOWNPLATE.touchTime TO Source1.set_stopTime ROUTE HelixMaker1.crossSection_changed TO Helix1.set_crossSection ROUTE HelixMaker1.spine_changed TO Helix1.set_spine ROUTE HelixMaker2.crossSection_changed TO Helix2.set_crossSection ROUTE HelixMaker2.spine_changed TO Helix2.set_spine ROUTE Clock1.fraction_changed TO Mover1.set_fraction ROUTE Clock2.fraction_changed TO Mover2.set_fraction ROUTE Clock3.fraction_changed TO Mover3.set_fraction ROUTE Mover1.value_changed TO BALL1TRANSFORM.set_translation ROUTE Mover2.value_changed TO BALL2TRANSFORM.set_translation ROUTE Mover3.value_changed TO BALL3TRANSFORM.set_translation