#VRML V2.0 utf8 ## ##:@+ 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", "http://www.blaxxun.com/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 { ## rotation 1 0 0 3.1414 ## scale 10 10 10 ## translation -8 0 0 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 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 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 } ##