media @ VU
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.