media @ VU
[] readme course preface I 1 2 II 3 4 III 5 6 7 IV 8 9 10 V 11 12 afterthoughts appendix references examples resources _

talk show tell print

web3d-x-nurb-bomb.vr

web3d-x-nurb-bomb.vr (wrl ) [ flux / bitmanagement / cortona / octaga ]

Web3D/VR

nurb with texture animation

scene


  WorldInfo 
  {
          title "Nurbs patch animated"
          info "Nurbs Patch with animated controlPoint & environment mapping"
  }
  
  NavigationInfo {
          type ["EXAMINE","ANY"]
  
  }
  
  Viewpoint {
          position 7.5 5 20
  }
  
  

extern proto


  
  EXTERNPROTO NurbsSurface [
  field        SFInt32  uDimension 
  field        SFInt32  vDimension 
  field        MFFloat  uKnot  
  field        MFFloat  vKnot 
  field        SFInt32  uOrder 
  field        SFInt32  vOrder 
  exposedField MFVec3f  controlPoint
  exposedField MFFloat  weight
  exposedField SFInt32  uTessellation
  exposedField SFInt32  vTessellation
  exposedField SFNode   texCoord
  field        SFBool   ccw
  field        SFBool   solid
  ]
  [
          "urn:inet:blaxxun.com:node:NurbsSurface",
          "<a href=http://www.blaxxun.co>/vrml/protos/nurbs.wrl#NurbsSurface"
  ]
  
  

externproto


  
  EXTERNPROTO DropHandler [
          field SFNode root  
          field SFNode rootShape 
  
  ] "drophandler.wrl"
  
  

groups


  
  DEF tropfenGroup Group {
          children [
                  DEF tropfen Transform {
                          children Shape {appearance Appearance {material        Material {diffuseColor 0 0 .5}}
                                  geometry Sphere        {radius        .1}
                          }
                  }
                  Transform {
                          children Shape {appearance Appearance {material        Material {diffuseColor 0 0 .5}}
                                  geometry Sphere        {radius        .1}
                          }
                  }
                  Transform {
                          children Shape {appearance Appearance {material        Material {diffuseColor 0 0 .5}}
                                  geometry Sphere        {radius        .1}
                          }
                  }
                  Transform {
                          children Shape {appearance Appearance {material        Material {diffuseColor 0 0 .5}}
                                  geometry Sphere        {radius        .1}
                          }
                  }
                  Transform {
                          children Shape {appearance Appearance {material        Material {diffuseColor 0 0 .5}}
                                  geometry Sphere        {radius        .1}
                          }
                  }
  
          ]
  }
  
  

position interpolator


  
  DEF        tropfenIP PositionInterpolator {
          key        [0 1]
          keyValue [0 0 0, 1 1 1]
  }
  
  

transform root


  
  DEF ROOT Transform {
  
  
  
  children [
          Sound {source DEF ac AudioClip        {url "../../media/sounds/plop.wav"}}
          DEF ts TouchSensor{}
          Collision {
                  collide        FALSE
          children DEF ROOT-SHAPE Shape { 
                  geometry DEF nurb NurbsSurface {
                          ccw TRUE
                          uOrder 3 
                          vOrder 3 
                          uDimension 6 
                          vDimension 4 
                          uTessellation 23
                          vTessellation 23
                          # texCoord TextureCoordGen {mode "SPHERE"}
                          texCoord TextureCoordGen {
                                          #mode "SPHERE"
                                          #mode "DOT"
                                          #mode "REFRACT"
                                          #mode "SPHERE-LOCAL"
                                          #mode "COORD-EYE"
                                          #mode "CAMERASPACEREFLECTIONVECTOR"
                                          #mode "CAMERASPACEPOSITION"
                                          mode "CAMERASPACENORMAL"
                                  }
                          #uKnot [ 0, 0, 0, 0, .5, .6, 1, 1, 1, 1]
                          #vKnot [ 0, 0, 0, 0, 1, 1, 1, 1]
                          controlPoint[ 0 0 0, 1 0 0, 2 0 0, 3 0 0, 4 0 0, 5 0 0,
                                          0 1 0, 1 1 0, 2 1 0, 3 1 0,  4 1 0, 5 1 0,
                                          0 2 0, 1 2 0, 2 2 0, 3 2 0, 4 2 0, 5 2 0,
                                          0 3 0, 1 3 0, 2 3 0, 3 3 0, 4 3 0, 5 3 0 ]
                          weight [ 1.000000 ]
                           }
                          appearance Appearance {
                              material Material { 
                                                  diffuseColor 0 0 1 
                                                  #specularColor 1 1 1
                                                  ##transparency 0.5 
                                          } 
                                  textureTransform TextureTransform { 
                                          scale 0.5 0.5 
                                          translation        1 1
                                  }
  
                                          texture 
                                          ##ImageTexture {url "chromic.jpg"}
                                          ##ImageTexture {url "../textures/stage_map.jpg"}
                                          ImageTexture {url "@logo.gif"}
                                       }
          }        
  }
  ]
  }
  
  

script


  
  DEF animate Script { 
      eventIn SFTime setTime
          eventIn SFTime setStartTime
          eventIn SFTime setRandomWave
  
      eventIn SFFloat applyEpi
          eventIn SFVec3f setEpi
  
          field MFTime startTime []
          field MFVec3f epiZentrum []
          field SFInt32 nWaves 5
          field SFInt32 i 0
          field SFVec2f patchSize 17 17
          field SFNode nurb USE nurb 
          field SFVec3f tmpEpiZentrum 0 0 0
          field SFVec3f nirvana 100 100 100
          field SFNode spheres USE  tropfen
          field SFNode tropfenGroup USE tropfenGroup
          field SFTime sphereAnimationTime 3
  
          directOutput TRUE
  
  

initialize


  
      url "javascript:
          function initialize() 
          {
                  startTime.length = nWaves;
                  epiZentrum.length = nWaves;
          //        for (var i=0; i<nWaves; i++)	
  	//		tropfenGroup.children[i]  = tropfen;
  
  		nurb.uDimension = patchSize.x;
  		nurb.vDimension = patchSize.y;
  		var cp = new MFVec3f();
  
  		var nv=nurb.vDimension;
  		var nu=nurb.uDimension;
  
  		cp.length = nurb.uDimension*nurb.vDimension;
  
  
  		var u;
  		var v;
  		for (v = 0; v//Browser.print(v*nurb.uDimension+u);
  				cp[v*nv+u] = new SFVec3f(u,v,0);
  		} 
  		}
  		nurb.set_controlPoint = cp;
  		
  		var weight = new MFFloat();
  		weight.length = nurb.uDimension*nurb.vDimension;
  		for (v = 0; v< nurb.uDimension*nurb.vDimension; v++) {
  			weight[v] = 1;
  		}
  		nurb.set_weight = weight;
  
  
  
  		var uknot = new MFFloat();
  		var vknot = new MFFloat();
  		var deltaU;
  		var deltaV;
  		deltaU = 1/(nurb.uDimension + nurb.uOrder);
  		deltaV = 1/(nurb.vDimension + nurb.vOrder);
  			//Browser.print('deltaV');
  			//Browser.print(deltaV);
  			//Browser.print('deltaU');
  			//Browser.print(deltaU);
  
  		var uLength;
  		var vLength;
  		uLength = nurb.uDimension + nurb.uOrder;
  		vLength = nurb.vDimension + nurb.vOrder;
  			//Browser.print('uLength');	Browser.print(uLength);
  			//Browser.print('vLength');	Browser.print(vLength);
  		uknot.length = uLength;
  		vknot.length = vLength;
  
  		for (v = 0; v//Browser.print(vknot[v]);
  		}
  		for (u = 0; u//Browser.print(uknot[u]);
  		}
  		nurb.set_vKnot = vknot;
  		nurb.set_uKnot = uknot;
  
  		if (1) {
  			startTime[i] = Browser.getTime();;
  		
  			epiZentrum[i].x = nurb.uDimension * 0.5;
  			epiZentrum[i].y = nurb.vDimension * 0.5;
  
  			epiZentrum[i].z = 0.5;
  	
  		}
  	}
  
  
  
  
      function setStartTime(value) {
  		startTime[i] = value + sphereAnimationTime;
  		epiZentrum[i].x = tmpEpiZentrum.x;
  		epiZentrum[i].y = tmpEpiZentrum.y;
  		epiZentrum[i].z = 2;
  		i++;
  		i %= nWaves;
  		//Browser.print(value);
  	}
  
  
  	function setRandomWave(value) {
  		var nv=nurb.vDimension;
  		var nu=nurb.uDimension;
  		var nw=nWaves;
  
  		startTime[i] = value;
  		epiZentrum[i].x = 2+Math.random()*(nu-4);
  		epiZentrum[i].y = 2+Math.random()*(nv-4);
  		epiZentrum[i].z = 0.15+1.5*Math.random();
  
  		i++;
  		i %= nWaves;
  	}
  
  
  
      function setTime(value) 
  	{
  		var ii;
  		var u;
  		var v;
  		var l;
  		var a;
  		var t = value;
  		var omega = -1*Math.PI;
   
  				
  		for (ii=0; ii//Browser.print(epiZentrum[ii].z );
  			else {
  				//move the tropfen to nirvana
  				tropfenGroup.children[ii].translation.z = -10;
  
  				if (deltaT > 11) {
                                          //print('NewWave'+value);
                                          setRandomWave(value);
                                  }
                          }
                  } 
  
                  var nv=nurb.vDimension;
                  var nu=nurb.uDimension;
                  var nw=nWaves;
  
                  //z = exp(-(t+l)) * sin(omega * t + l)
                  for (v = 1; v<nv; v++) {
  			var voffset=v*nu;
  			for (u = 1; u// fun, normally 0
  
  				for (ii=0; ii//one wave per 4 control points, more does not make sense because of the interpolation
  					//between the cvs
  
  					// l = distance from epizentrum 
  					//l = Math.PI/2 * Math.sqrt( (v-nurb.vDimension/2)*(v-nurb.vDimension/2) + (u-nurb.uDimension/2)*(u-nurb.uDimension/2) );
  				
  					//l = Math.PI*2 * Math.sqrt( Math.sqr(v-epiZentrum.y) +  Math.sqr(u-epiZentrum.x) );
  					deltaT =  (value - startTime[ii]);
  					if (deltaT > 0)
                                          {
                                                  l = Math.PI/2 * Math.sqrt((v-epiZentrum[ii].y)*(v-epiZentrum[ii].y) +  (u-epiZentrum[ii].x)*(u-epiZentrum[ii].x) );
                                          //        Browser.print(l);
                                                  a = -3 * Math.exp( -1 * ( (deltaT) + l/nv) );
                                                  //a = 1;
                                                  z += epiZentrum[ii].z * a * Math.cos(omega* deltaT + l);        
  
                                                  //  wave can't travel so fast
                                                  // limit on deltaT / l
                                          }        
                                  } 
                                  nurb.controlPoint[voffset+u].z = z;
                          } 
                  }
  
          }
          function setEpi(value)
          {
                  tmpEpiZentrum.x = value.x;
                  tmpEpiZentrum.y = value.y;
                  //Browser.print(value);
          }
  
      "        
  }
  
  

timer and routing


  
  DEF TimeSource TimeSensor {loop TRUE} 
  
  ROUTE TimeSource.time TO animate.setTime
  ROUTE ts.touchTime TO ac.startTime
  ROUTE ts.touchTime TO animate.setStartTime
  ROUTE ts.hitPoint_changed TO animate.setEpi
  
  

DropHandler


  DropHandler        { root USE ROOT        
                          rootShape        USE ROOT-SHAPE 
  }
  


(C) A. Eliëns 21/5/2007

You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.