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