media @ VU
web3d-x-emotiondisc.vr
web3d-x-emotiondisc.vr
(wrl
)
[ flux /
bitmanagement /
cortona /
octaga
]
Web3D/VR
emotion disc
disc
DEF EMOTION_DISC Transform {
translation -3 0 0
scale 3 3 3
children [
Appearance {
material Material {
diffuseColor 0.0 0.0 0.0
}
}
DEF FACE_ELT Transform {
scale 0.00194363 0.00238663 0.002
rotation 1 0 0 3.1415
translation -1.0 1.0 0
children [
Transform {
translation 80 30 0
children DEF L_EYE_TRANS Transform {
translation 329 274 0
children DEF L_EYE Sphere { radius 20 }
}
}
Transform {
translation 125 30 0
children DEF R_EYE_TRANS Transform {
translation 521 272 0
children DEF R_EYE Sphere { radius 20 }
}
}
Transform {
translation 30 30 0
children DEF R_BROW_TRANS Transform {
translation 514 220 0
children DEF R_BROW Extrusion {
orientation 0 0 1 0
spine [ 0 0 0, 22 -19 0, 94 -1 0]
scale [2 2, 10 10, 2 2]
}
}
}
Transform {
translation 170 30 0
children DEF L_BROW_TRANS Transform {
translation 339 220 0
children DEF L_BROW Extrusion {
orientation 0 0 1 0
spine [ 0 0 0, -22 -19 0, -94 4 0]
scale [2 2, 10 10, 2 2]
}
}
}
Transform {
translation 500 560 0
children DEF MOND_TRANS Transform {
children DEF MOUTH Extrusion {
orientation 0 0 1 0
spine [ -36 -38 0, 33 -20 0, 107 -41 0]
scale [10 10, 10 10, 2 2]
}
}
}
]
}
DEF MOON_ANIM Script {
directOutput TRUE
field SFNode rBrowTrans USE R_BROW_TRANS
field SFNode rBrowShape USE R_BROW
field SFNode lBrowTrans USE L_BROW_TRANS
field SFNode lBrowShape USE L_BROW
field SFNode mouthShape USE MOUTH
field MFVec3f spine [0 0 0, 0 0 0, 0 0 0]
eventIn MFFloat setFrame
url "vrmlscript:
function setFrame(values,time) {
rBrowTrans.translation[0] = values[ 0];
rBrowTrans.translation[1] = values[ 1];
spine[0] = new SFVec3f(0,0,0);
spine[1] = new SFVec3f(values[ 2],values[ 3],0);
spine[2] = new SFVec3f( 94,values[ 4],0);
rBrowShape.set_spine = spine;
lBrowTrans.translation[0] = values[ 5];
lBrowTrans.translation[1] = values[ 6];
spine[0] = new SFVec3f(0,0,0);
spine[1] = new SFVec3f(values[ 7],values[ 8],0);
spine[2] = new SFVec3f( -94,values[ 9],0);
lBrowShape.set_spine = spine;
spine[0] = new SFVec3f(values[10],values[11],0);
spine[1] = new SFVec3f(values[12],values[13],0);
spine[2] = new SFVec3f(values[14],values[15],0);
mouthShape.set_spine = spine;
}
"
}
DEF INTERPOLATOR Script {
field MFFloat neutral [339 220 22 -19 -1 514 220 -22 -19 -1 -36 -38 33 -20 107 -41 ]
##Joy
field MFFloat joy_01 [339 220 22 -19 -1 514 220 -22 -19 -1 -36 -38 33 -20 107 -41 ]
field MFFloat joy_02 [339 220 22 -20 -2 514 220 -22 -20 -2 -39 -41 33 -20 110 -44 ]
field MFFloat joy_03 [339 220 22 -20 -2 514 220 -22 -20 -2 -41 -44 33 -20 112 -47 ]
field MFFloat joy_04 [339 220 22 -21 -3 514 220 -22 -21 -3 -44 -47 33 -21 115 -50 ]
field MFFloat joy_05 [339 220 22 -21 -3 514 220 -22 -21 -4 -46 -50 33 -21 118 -53 ]
field MFFloat joy_06 [339 220 22 -22 -4 514 220 -21 -22 -4 -49 -52 33 -21 120 -55 ]
field MFFloat joy_07 [339 220 22 -22 -4 514 220 -21 -22 -5 -51 -55 33 -21 123 -58 ]
field MFFloat joy_08 [339 220 22 -23 -5 514 220 -21 -23 -6 -54 -58 33 -22 126 -61 ]
field MFFloat joy_09 [339 220 22 -23 -5 514 220 -21 -23 -6 -56 -61 33 -22 128 -64 ]
field MFFloat joy_10 [339 220 22 -24 -6 514 220 -21 -24 -7 -59 -64 33 -22 131 -67 ]
##Disgust
field MFFloat disgust_01 [339 220 22 -19 -1 514 220 -22 -19 -1 -36 -38 33 -20 107 -41 ]
field MFFloat disgust_02 [339 220 23 -15 4 514 218 -22 -16 6 -37 -34 36 -24 106 -38 ]
field MFFloat disgust_03 [339 219 24 -11 9 514 217 -22 -12 13 -38 -30 39 -27 104 -36 ]
field MFFloat disgust_04 [339 219 25 -7 14 514 215 -22 -9 19 -39 -26 42 -31 103 -33 ]
field MFFloat disgust_05 [339 218 26 -3 19 514 213 -22 -5 26 -40 -22 45 -34 101 -31 ]
field MFFloat disgust_06 [339 218 27 0 25 514 212 -21 -2 33 -42 -19 47 -38 100 -28 ]
field MFFloat disgust_07 [339 217 28 4 30 514 210 -21 2 40 -43 -15 50 -41 98 -26 ]
field MFFloat disgust_08 [339 217 29 8 35 514 208 -21 5 46 -44 -11 53 -45 97 -23 ]
field MFFloat disgust_09 [339 216 30 12 40 514 207 -21 9 53 -45 -7 56 -48 95 -21 ]
field MFFloat disgust_10 [339 216 31 16 45 514 205 -21 12 60 -46 -3 59 -52 94 -18 ]
##Anger
field MFFloat anger_01 [339 220 22 -19 -1 514 220 -22 -19 -1 -36 -38 33 -20 107 -41 ]
field MFFloat anger_02 [340 218 27 -14 -1 513 218 -26 -14 -1 -37 -32 33 -23 108 -36 ]
field MFFloat anger_03 [340 216 32 -9 -1 513 216 -31 -9 -1 -38 -27 33 -25 109 -31 ]
field MFFloat anger_04 [341 214 36 -4 -1 512 214 -35 -4 -1 -39 -21 33 -28 111 -25 ]
field MFFloat anger_05 [341 212 41 1 -1 511 212 -40 1 -1 -40 -15 33 -31 112 -20 ]
field MFFloat anger_06 [342 209 46 6 -1 511 209 -44 6 -1 -41 -10 33 -33 113 -15 ]
field MFFloat anger_07 [342 207 51 11 -1 510 207 -49 11 -1 -42 -4 33 -36 114 -10 ]
field MFFloat anger_08 [343 205 55 16 -1 509 205 -53 16 -1 -43 2 33 -39 116 -4 ]
field MFFloat anger_09 [343 203 60 21 -1 509 203 -58 21 -1 -44 7 33 -41 117 1 ]
field MFFloat anger_10 [344 201 65 26 -1 508 201 -62 26 -1 -45 13 33 -44 118 6 ]
##Sad
field MFFloat sad_01 [339 220 22 -19 -1 514 220 -22 -19 -1 -36 -38 33 -20 107 -41 ]
field MFFloat sad_02 [339 220 27 -19 -6 514 220 -26 -19 -6 -37 -34 33 -20 107 -36 ]
field MFFloat sad_03 [339 220 32 -19 -11 514 220 -31 -19 -11 -38 -29 33 -20 107 -31 ]
field MFFloat sad_04 [339 220 36 -19 -15 514 220 -35 -19 -15 -39 -25 33 -20 107 -25 ]
field MFFloat sad_05 [339 220 41 -19 -20 514 220 -40 -19 -20 -40 -21 33 -20 107 -20 ]
field MFFloat sad_06 [339 220 46 -19 -25 514 220 -44 -19 -25 -41 -16 33 -20 107 -15 ]
field MFFloat sad_07 [339 220 51 -19 -30 514 220 -49 -19 -30 -42 -12 33 -20 107 -10 ]
field MFFloat sad_08 [339 220 55 -19 -34 514 220 -53 -19 -34 -43 -8 33 -20 107 -4 ]
field MFFloat sad_09 [339 220 60 -19 -39 514 220 -58 -19 -39 -44 -3 33 -20 107 1 ]
field MFFloat sad_10 [339 220 65 -19 -44 514 220 -62 -19 -44 -45 1 33 -20 107 6 ]
##Fear
field MFFloat fear_01 [339 220 22 -19 -1 514 220 -22 -19 -1 -36 -38 33 -20 107 -41 ]
field MFFloat fear_02 [340 218 27 -17 -2 513 219 -26 -18 -3 -33 -36 33 -20 107 -36 ]
field MFFloat fear_03 [340 216 32 -15 -3 513 218 -31 -16 -4 -29 -35 33 -20 107 -30 ]
field MFFloat fear_04 [341 214 36 -14 -4 512 216 -35 -15 -6 -26 -33 33 -20 107 -25 ]
field MFFloat fear_05 [341 212 41 -12 -5 511 215 -40 -14 -8 -22 -31 33 -20 107 -20 ]
field MFFloat fear_06 [342 209 46 -10 -7 511 214 -44 -12 -9 -19 -30 33 -20 107 -14 ]
field MFFloat fear_07 [342 207 51 -8 -8 510 213 -49 -11 -11 -15 -28 33 -20 107 -9 ]
field MFFloat fear_08 [343 205 55 -7 -9 509 211 -53 -10 -13 -12 -26 33 -20 107 -4 ]
field MFFloat fear_09 [343 203 60 -5 -10 509 210 -58 -8 -14 -8 -25 33 -20 107 2 ]
field MFFloat fear_10 [344 201 65 -3 -11 508 209 -62 -7 -16 -5 -23 33 -20 107 7 ]
##Surprise
field MFFloat surprise_01 [339 220 22 -19 -1 514 220 -22 -19 -1 -36 -38 33 -20 107 -41 ]
field MFFloat surprise_02 [339 218 22 -22 -5 514 218 -22 -22 -5 -31 -37 33 -20 101 -39 ]
field MFFloat surprise_03 [339 216 22 -26 -9 514 216 -22 -26 -10 -25 -36 33 -20 96 -37 ]
field MFFloat surprise_04 [339 214 22 -29 -13 514 214 -22 -29 -14 -20 -35 33 -21 90 -35 ]
field MFFloat surprise_05 [339 212 22 -33 -17 514 212 -22 -33 -19 -15 -34 33 -21 85 -33 ]
field MFFloat surprise_06 [339 209 22 -36 -22 514 209 -21 -36 -23 -9 -33 33 -21 79 -30 ]
field MFFloat surprise_07 [339 207 22 -40 -26 514 207 -21 -40 -28 -4 -32 33 -21 74 -28 ]
field MFFloat surprise_08 [339 205 22 -43 -30 514 205 -21 -43 -32 1 -31 33 -22 68 -26 ]
field MFFloat surprise_09 [339 203 22 -47 -34 514 203 -21 -47 -37 7 -30 33 -22 63 -24 ]
field MFFloat surprise_10 [339 201 22 -50 -38 514 201 -21 -50 -41 12 -29 33 -22 57 -22 ]
field MFFloat temp [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
eventOut MFFloat setFrame
eventIn MFFloat set_emotion
eventIn SFFloat set_fraction
url "vrmlscript:
function initialize() {
setFrame = neutral;
}
function interpolateEmotions(strength,fraction,e1,e2,e3,e4) {
i = 0;
for(i=0;i<16;i++) {
a = e1[i] + (e2[i]-e1[i])*fraction;
b = e3[i] + (e4[i]-e3[i])*fraction;
temp[i] = a + (b-a)*strength;
}
setFrame = temp;
}
function getJoy(strength) {
if(strength > 9) return joy_10;
else if(strength > 8) return joy_09;
else if(strength > 7) return joy_08;
else if(strength > 6) return joy_07;
else if(strength > 5) return joy_06;
else if(strength > 4) return joy_05;
else if(strength > 3) return joy_04;
else if(strength > 2) return joy_03;
else if(strength > 1) return joy_02;
else return joy_01;
}
function getDisgust(strength) {
if(strength > 9) return disgust_10;
else if(strength > 8) return disgust_09;
else if(strength > 7) return disgust_08;
else if(strength > 6) return disgust_07;
else if(strength > 5) return disgust_06;
else if(strength > 4) return disgust_05;
else if(strength > 3) return disgust_04;
else if(strength > 2) return disgust_03;
else if(strength > 1) return disgust_02;
else return disgust_01;
}
function getAnger(strength) {
if(strength > 9) return anger_10;
else if(strength > 8) return anger_09;
else if(strength > 7) return anger_08;
else if(strength > 6) return anger_07;
else if(strength > 5) return anger_06;
else if(strength > 4) return anger_05;
else if(strength > 3) return anger_04;
else if(strength > 2) return anger_03;
else if(strength > 1) return anger_02;
else return anger_01;
}
function getSad(strength) {
if(strength > 9) return sad_10;
else if(strength > 8) return sad_09;
else if(strength > 7) return sad_08;
else if(strength > 6) return sad_07;
else if(strength > 5) return sad_06;
else if(strength > 4) return sad_05;
else if(strength > 3) return sad_04;
else if(strength > 2) return sad_03;
else if(strength > 1) return sad_02;
else return sad_01;
}
function getFear(strength) {
if(strength > 9) return fear_10;
else if(strength > 8) return fear_09;
else if(strength > 7) return fear_08;
else if(strength > 6) return fear_07;
else if(strength > 5) return fear_06;
else if(strength > 4) return fear_05;
else if(strength > 3) return fear_04;
else if(strength > 2) return fear_03;
else if(strength > 1) return fear_02;
else return fear_01;
}
function getSurprise(strength) {
if(strength > 9) return surprise_10;
else if(strength > 8) return surprise_09;
else if(strength > 7) return surprise_08;
else if(strength > 6) return surprise_07;
else if(strength > 5) return surprise_06;
else if(strength > 4) return surprise_05;
else if(strength > 3) return surprise_04;
else if(strength > 2) return surprise_03;
else if(strength > 1) return surprise_02;
else return surprise_01;
}
function getEmotion(strength,fraction) {
if(fraction > 5) return getJoy(strength);
else if(fraction > 4) return getDisgust(strength);
else if(fraction > 3) return getAnger(strength);
else if(fraction > 2) return getSad(strength);
else if(fraction > 1) return getFear(strength);
else return getSurprise(strength);
}
function set_emotion(value,time) {
// 0 <= value[0] < 2 PI
// 0 <= value[1] < 1
fraction = (value[0] / (2*Math.PI)) * 6;
strength = value[1] * 10;
//Browser.print('set_emotion '+fraction+' strength '+strength);
if (strength < 0.5) {
setFrame = neutral;
}
f1 = fraction; if(f1<0) f1 += 6;
f2 = fraction + 1; if(f2>6) f2 -= 6;
em1 = getEmotion(strength ,f1);
em2 = getEmotion(strength ,f2);
em3 = getEmotion(strength+1,f1);
em4 = getEmotion(strength+1,f2);
while(strength>1) strength -= 1;
while(fraction>1) fraction -= 1;
//Browser.print('f1 '+f1+' f2 '+f2+' fraction '+fraction);
interpolateEmotions(strength,fraction,em1,em2,em3,em4);
}
"
}
Shape {
appearance Appearance { texture ImageTexture { url "maan.gif" } }
geometry IndexedFaceSet {
solid FALSE
coord Coordinate { point [ -1.0 -1.0 0.0,
1.0 -1.0 0.0,
1.0 1.0 0.0,
-1.0 1.0 0.0] }
texCoord TextureCoordinate { point [ 0 1,
1 1,
1 0,
0 0 ] }
coordIndex [ 0, 1, 2, 3, -1]
texCoordIndex [ 3, 2, 1, 0, -1]
}
}
Transform {
translation 2 0 0
children [
Shape {
appearance Appearance { texture ImageTexture { url "disc.gif" } }
geometry IndexedFaceSet {
solid FALSE
coord Coordinate { point [ -1.0 -1.0 0.0,
1.0 -1.0 0.0,
1.0 1.0 0.0,
-1.0 1.0 0.0] }
texCoord TextureCoordinate { point [ 0 1,
1 1,
1 0,
0 0 ] }
coordIndex [ 0, 1, 2, 3, -1]
texCoordIndex [ 3, 2, 1, 0, -1]
}
}
Group { children [
DEF CONTROL_TRANS Transform {
translation 0 0 0
children DEF CONTROL Sphere { radius 0.1 }
}
DEF DRAGSENSOR PlaneSensor {
minPosition -1 -1
maxPosition 1 1
}
] }
]
}
DEF DISC_INTERFACE Script {
eventIn SFVec3f set_translation
field MFFloat temp [0 0]
eventOut MFFloat set_emotion
url "vrmlscript:
function set_translation(value,time) {
x = value[0];
y = value[1];
clickRadius = Math.sqrt(x*x+y*y);
if(clickRadius >= 1) clickRadius = 0.999;
clickAngle = Math.atan(x/y);
if(y>0) clickAngle += Math.PI;
else if(x>0) clickAngle += 2*Math.PI;
// Turn the wheel a bit...
clickAngle += 5 *(Math.PI/6);
if(clickAngle>(2*Math.PI)) clickAngle -= (2*Math.PI);
// Browser.print('Angle '+clickAngle+ ' Radius '+clickRadius);
temp[0] = clickAngle;
temp[1] = clickRadius;
set_emotion = temp;
}
"
}
ROUTE DRAGSENSOR.translation_changed TO CONTROL_TRANS.translation
ROUTE DRAGSENSOR.translation_changed TO DISC_INTERFACE.set_translation
ROUTE DISC_INTERFACE.set_emotion TO INTERPOLATOR.set_emotion
ROUTE INTERPOLATOR.setFrame TO MOON_ANIM.setFrame
]
}
(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.