There are a lot of actions that are too complex for sensors and interpolators. You can write program scripts in Java or JavaScript that can accept event inputs, generate event outputs and read and write (exposed)fields.
#VRML V2.0 utf8
#PointLight example
Group {
children[
DEF switchinglight PointLight {
location -1.0 0.0 1.0#the light is 1 units left on the X axis
color 0 1 0 #the color is green
on FALSE
}
Transform {
translation -2 0 0
children [
DEF ball Shape{
appearance Appearance{
material Material { }
}
geometry Sphere {
radius 0.5 #radius in units }
}
}
]
}
Transform {
translation 2 0 0
children [ USE ball ]
}
DEF Clicked TouchSensor {}
]
}
Transform {
translation 0 2 0
children [ USE 3balls ]
}
Transform {
translation 0 -2 0
children [ USE 3balls ]
}
]
}
DEF switcher Script {
eventIn SFBool turnOn
eventOut SFBool lightOn
url "javascript:
function turnOn(val){
if(!val) {
if(lightOn) {
lightOn = 0;
}
else {
lightOn = 1;
}
}
}"
}
ROUTE Clicked.isActive TO switcher.turnOn
ROUTE switcher.lightOn TO switchinglight.on
#VRML V2.0 utf8
#Animated Texture with javascript
Viewpoint {
position 0 0 5
fieldOfView 0.785
}
Group {
children [
DEF Square Shape {
appearance Appearance {
material Material {
ambientIntensity 0.25
diffuseColor 0 1 0
}
texture ImageTexture {
url "../images/smalltexture.gif"
}
textureTransform DEF Trans TextureTransform {
translation 0 0
}
}
geometry IndexedFaceSet {
coord Coordinate {
point [ -1 1 0, -1 -1 0, 1 1 0, 1 -1 0 ]
}
coordIndex [ 0, 1, 3, 2, -1 ]
texCoord TextureCoordinate {
point [ 0 1, 0 0, 1 1, 1 0 ]
}
texCoordIndex [ 0, 1, 3, 2, -1 ]
}
}
DEF Time TimeSensor {
cycleInterval 1.5
loop TRUE
startTime 0
}
DEF XInterp ScalarInterpolator {
key [ 0, 1 ]
keyValue [ 0, 1 ]
}
DEF Move_it Script {
eventOut SFVec2f vec
eventIn SFFloat xIn
field SFFloat xBuf 0
url "javascript:
function xIn(value) {
xBuf = value;
vec[0] = xBuf;
vec[1] = yBuf;
}"
}
]
}
ROUTE Time.fraction_changed TO XInterp.set_fraction
ROUTE XInterp.value_changed TO Move_it.xIn
ROUTE Move_it.vec TO Trans.set_translation