#VRML V2.0 utf8 ## ##@* 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 ] } ##