#VRML V2.0 utf8 NavigationInfo { type "EXAMINE" } Viewpoint { position -1 3 10 } Background { skyColor 1 1 1 } DEF ROOT Group {} DEF TIMER TimeSensor { cycleInterval 3 loop TRUE } DEF LOADED ProximitySensor { size 1000 1000 1000 } DEF SCRIPT Script { eventIn SFBool go eventOut MFNode newNodes field SFNode timer USE TIMER directOutput TRUE url "vrmlscript: function randR(l,h) { return Math.random()*(h-l)+l; } function go(val) { if(val) { totalNumNodes = 0; for(i=-5; i<5; i++) { for(j=-5; j<5; j++) { tx = i; ty = 0; tz = j; sy = randR(1,5); freshNodes = Browser.createVrmlFromString('Transform {' + ' translation ' + tx + ' 0 ' + tz + ' scale 1 ' + sy + ' 1' + ' children Shape {' + ' appearance Appearance {' + ' material Material {}' + ' }' + ' geometry Box { size .9 .9 .9 }'+ ' }' + '}'); transform = freshNodes[0]; // make interpolator inodes = Browser.createVrmlFromString('PositionInterpolator {}'); interp = inodes[0]; // set interpolator keys and values interp.key = new MFFloat(0, .5, 1); v = new MFVec3f(); v[0] = new SFVec3f(tx, 0, tz); v[1] = new SFVec3f(tx, randR(-2,4), tz); v[2] = new SFVec3f(tx, 0, tz); interp.keyValue = v; // wire timer to interpolator Browser.addRoute(timer, 'fraction_changed', interp, 'set_fraction'); // wire interpolator to transform Browser.addRoute(interp, 'value_changed', transform, 'translation'); // add interpolator node to eventOut array newNodes[totalNumNodes] = interp; ++totalNumNodes; for(k=0; k<freshNodes.length; k++) { newNodes[totalNumNodes+k] = freshNodes[k]; } totalNumNodes += freshNodes.length; } } } } " } ROUTE LOADED.isActive TO SCRIPT.go ROUTE SCRIPT.newNodes TO ROOT.addChildren
mrl