media @ VU
[] readme course preface I 1 2 II 3 4 III 5 6 7 IV 8 9 10 V 11 12 afterthoughts appendix references examples resources _

talk show tell print

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.