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-video-nurbs.vr

web3d-video-nurbs.vr (wrl ) [ flux / bitmanagement / cortona / octaga ]

Web3D/VR

extern


  
  EXTERNPROTO MultiTexture [
          exposedField MFString mode
          exposedField MFNode texture
          exposedField MFNode textureTransform
          exposedField MFInt32 textureOp
  ]
  [ "urn:inet:blaxxun.com:node:MultiTexture" "<a href=http://www.blaxxun.co>/vrml/protos/nodes.wrl#MultiTexture" ]
  
  

world


  
  WorldInfo 
  {
          title "Nurbs patch animated"
          info "Nurbs Patch with animated controlPoint & environment mapping"
  }
  
  NavigationInfo {
          type ["EXAMINE","ANY"]
  
  }
  
  Viewpoint {
          position 7.5 5 20
  }
  
  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 DropHandler [
          field SFNode root  
          field SFNode rootShape 
  
  ] "../../event/drop/drophandler.wrl"
  
  EXTERNPROTO TextureCoordGen[
      exposedField SFString mode
      exposedField MFFloat parameter
  ]
  ["urn:inet:blaxxun.com:node:TextureCoordGen","<a href=http://www.blaxxun.co>/vrml/protos/nodes.wrl#TextureCoordGen","nodes.wrl#TextureCoordGen"]
  
  EXTERNPROTO MultiTextureCoordinate[
      exposedField MFNode coord
  ]
  ["urn:inet:blaxxun.com:node:MultiTextureCoordinate","<a href=http://www.blaxxun.co>/vrml/protos/nodes.wrl#MultiTextureCoordinate","nodes.wrl#MultiTextureCoordinate"]
  

##############################################


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} } } ] } DEF tropfenIP PositionInterpolator { key [0 1] keyValue [0 0 0, 1 1 1] } DEF ROOT Transform { ##rotation 1 0 0 3.1414

scale 10 10 10 ##translation -8 0 0 children [ Sound {source DEF ac AudioClip {url "../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 MultiTextureCoordinate { coord [ NULL 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 } texture MultiTexture { mode [ "MODULATE" "ADD" ] textureTransform [ NULL TextureTransform { scale 0.5 0.5 translation 1 1 } ] texture [ MovieTexture { url "local/clips/effects/balls.wmv" startTime 0 stopTime -1 loop TRUE repeatS FALSE repeatT FALSE

                                                          }
                                                          ##ImageTexture {url "chromic.jpg"}
                                                          ImageTexture {url "logo.jpg"}
                                                  ]}
                               }
                          }        
                  }
          ]
  }
  
  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
  
      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);
          }
  
      "        
  }
  
  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.