Main Page   Class Hierarchy   Compound List   File List   Compound Members  

SimpleFacialExpression.cpp

00001 // SimpleFacialExpression.cpp: implementation of the SimpleFacialExpression class.
00002 //
00003 //////////////////////////////////////////////////////////////////////
00004 
00005 #include "stdafx.h"
00006 #include "SimpleFacialExpression.h"
00007 
00008 //////////////////////////////////////////////////////////////////////
00009 // Construction/Destruction
00010 //////////////////////////////////////////////////////////////////////
00011 
00012 SimpleFacialExpression::SimpleFacialExpression(char *expressionName, long expressionDuration, float expressionIntensity)
00013 {
00014         fbaps = new FBAPs();
00015         expFbaps = new FBAPs();
00016         currentExpression = 0;
00017         maxIntensity = expressionIntensity;
00018 
00019         if(!_strnicmp(expressionName,"anger",strlen(expressionName)))
00020         {
00021                 expFbaps->setFAP(open_jaw,0);
00022                 expFbaps->setFAP(lower_t_midlip,-90);
00023                 expFbaps->setFAP(raise_b_midlip,66);
00024                 expFbaps->setFAP(stretch_l_cornerlip,13);
00025                 expFbaps->setFAP(stretch_r_cornerlip,13);
00026                 expFbaps->setFAP(lower_t_lip_lm,-90);
00027                 expFbaps->setFAP(lower_t_lip_rm,-90);
00028                 expFbaps->setFAP(raise_b_lip_lm,66);
00029                 expFbaps->setFAP(raise_b_lip_rm,66);
00030                 expFbaps->setFAP(raise_l_cornerlip,-90);
00031                 expFbaps->setFAP(raise_r_cornerlip,-90);
00032 
00033                 expFbaps->setFAP(close_t_l_eyelid,200);
00034                 expFbaps->setFAP(close_t_r_eyelid,200);
00035                 expFbaps->setFAP(close_b_l_eyelid,150);
00036                 expFbaps->setFAP(close_b_r_eyelid,150);
00037 
00038                 expFbaps->setFAP(raise_l_i_eyebrow,-119);
00039                 expFbaps->setFAP(raise_r_i_eyebrow,-119);
00040                 expFbaps->setFAP(raise_l_m_eyebrow,-60);
00041                 expFbaps->setFAP(raise_r_m_eyebrow,-60);
00042                 expFbaps->setFAP(raise_l_o_eyebrow,47);
00043                 expFbaps->setFAP(raise_r_o_eyebrow,47);
00044                 expFbaps->setFAP(squeeze_l_eyebrow,118);
00045                 expFbaps->setFAP(squeeze_r_eyebrow,119);
00046         }
00047         if(!_strnicmp(expressionName,"sadness",strlen(expressionName)))
00048         {
00049                 expFbaps->setFAP(open_jaw,0);
00050                 expFbaps->setFAP(lower_t_midlip,-90);
00051                 expFbaps->setFAP(raise_b_midlip,-153);
00052                 expFbaps->setFAP(stretch_l_cornerlip,110);
00053                 expFbaps->setFAP(stretch_r_cornerlip,110);
00054                 expFbaps->setFAP(lower_t_lip_lm,-122);
00055                 expFbaps->setFAP(lower_t_lip_rm,-122);
00056                 expFbaps->setFAP(raise_b_lip_lm,-242);
00057                 expFbaps->setFAP(raise_b_lip_rm,-242);
00058                 expFbaps->setFAP(raise_l_cornerlip,-122);
00059                 expFbaps->setFAP(raise_r_cornerlip,-122);
00060 
00061                 expFbaps->setFAP(raise_l_i_eyebrow,24);
00062                 expFbaps->setFAP(raise_r_i_eyebrow,24);
00063                 expFbaps->setFAP(raise_l_m_eyebrow,-12);
00064                 expFbaps->setFAP(raise_r_m_eyebrow,-12);
00065                 expFbaps->setFAP(raise_l_o_eyebrow,-60);
00066                 expFbaps->setFAP(raise_r_o_eyebrow,-60);
00067                 expFbaps->setFAP(squeeze_l_eyebrow,144);
00068                 expFbaps->setFAP(squeeze_r_eyebrow,144);
00069         }
00070         if(!_strnicmp(expressionName,"joy",strlen(expressionName)))
00071         {
00072                 expFbaps->setFAP(open_jaw,120);
00073                 expFbaps->setFAP(lower_t_midlip,-181);
00074                 expFbaps->setFAP(raise_b_midlip,-181);
00075                 expFbaps->setFAP(stretch_l_cornerlip,77);
00076                 expFbaps->setFAP(stretch_r_cornerlip,77);
00077                 expFbaps->setFAP(lower_t_lip_lm,-153);
00078                 expFbaps->setFAP(lower_t_lip_rm,-153);
00079                 expFbaps->setFAP(raise_b_lip_lm,-122);
00080                 expFbaps->setFAP(raise_b_lip_rm,-122);
00081                 expFbaps->setFAP(raise_l_cornerlip,273);
00082                 expFbaps->setFAP(raise_r_cornerlip,273);
00083 
00084                 expFbaps->setFAP(close_t_l_eyelid,180);
00085                 expFbaps->setFAP(close_t_r_eyelid,180);
00086                 expFbaps->setFAP(close_b_l_eyelid,100);
00087                 expFbaps->setFAP(close_b_r_eyelid,100);
00088 
00089                 expFbaps->setFAP(raise_l_i_eyebrow,24);
00090                 expFbaps->setFAP(raise_r_i_eyebrow,24);
00091                 expFbaps->setFAP(raise_l_m_eyebrow,23);
00092                 expFbaps->setFAP(raise_r_m_eyebrow,23);
00093                 expFbaps->setFAP(raise_l_o_eyebrow,0);
00094                 expFbaps->setFAP(raise_r_o_eyebrow,0);
00095                 expFbaps->setFAP(squeeze_l_eyebrow,63);
00096                 expFbaps->setFAP(squeeze_r_eyebrow,63);
00097         }
00098         if(!_strnicmp(expressionName,"fear",strlen(expressionName)))
00099         {
00100                 expFbaps->setFAP(open_jaw,210);
00101                 expFbaps->setFAP(lower_t_midlip,0);
00102                 expFbaps->setFAP(raise_b_midlip,-200);
00103                 expFbaps->setFAP(stretch_l_cornerlip,-38);
00104                 expFbaps->setFAP(stretch_r_cornerlip,-38);
00105                 expFbaps->setFAP(lower_t_lip_lm,0);
00106                 expFbaps->setFAP(lower_t_lip_rm,0);
00107                 expFbaps->setFAP(raise_b_lip_lm,-150);
00108                 expFbaps->setFAP(raise_b_lip_rm,-150);
00109                 expFbaps->setFAP(raise_l_cornerlip,-21);
00110                 expFbaps->setFAP(raise_r_cornerlip,-21);
00111 
00112                 expFbaps->setFAP(close_t_l_eyelid,-100);
00113                 expFbaps->setFAP(close_t_r_eyelid,-100);
00114                 expFbaps->setFAP(close_b_l_eyelid,-100);
00115                 expFbaps->setFAP(close_b_r_eyelid,-100);
00116 
00117                 expFbaps->setFAP(raise_l_i_eyebrow,100);
00118                 expFbaps->setFAP(raise_r_i_eyebrow,100);
00119                 expFbaps->setFAP(raise_l_m_eyebrow,80);
00120                 expFbaps->setFAP(raise_r_m_eyebrow,80);
00121                 expFbaps->setFAP(raise_l_o_eyebrow,60);
00122                 expFbaps->setFAP(raise_r_o_eyebrow,60);
00123                 expFbaps->setFAP(squeeze_l_eyebrow,135);
00124                 expFbaps->setFAP(squeeze_r_eyebrow,135);
00125         }
00126         if(!_strnicmp(expressionName,"surprise",strlen(expressionName)))
00127         {
00128                 expFbaps->setFAP(open_jaw,696);
00129                 expFbaps->setFAP(lower_t_midlip,0);
00130                 expFbaps->setFAP(raise_b_midlip,-600);
00131                 expFbaps->setFAP(stretch_l_cornerlip,-38);
00132                 expFbaps->setFAP(stretch_r_cornerlip,-38);
00133                 expFbaps->setFAP(lower_t_lip_lm,0);
00134                 expFbaps->setFAP(lower_t_lip_rm,0);
00135                 expFbaps->setFAP(raise_b_lip_lm,-400);
00136                 expFbaps->setFAP(raise_b_lip_rm,-400);
00137                 expFbaps->setFAP(raise_l_cornerlip,-61);
00138                 expFbaps->setFAP(raise_r_cornerlip,-61);
00139 
00140                 expFbaps->setFAP(close_t_l_eyelid,-80);
00141                 expFbaps->setFAP(close_t_r_eyelid,-80);
00142                 expFbaps->setFAP(close_b_l_eyelid,-80);
00143                 expFbaps->setFAP(close_b_r_eyelid,-80);
00144   
00145                 expFbaps->setFAP(raise_l_i_eyebrow,214);
00146                 expFbaps->setFAP(raise_r_i_eyebrow,214);
00147                 expFbaps->setFAP(raise_l_m_eyebrow,178);
00148                 expFbaps->setFAP(raise_r_m_eyebrow,178);
00149                 expFbaps->setFAP(raise_l_o_eyebrow,83);
00150                 expFbaps->setFAP(raise_r_o_eyebrow,83);
00151                 expFbaps->setFAP(squeeze_l_eyebrow,135);
00152                 expFbaps->setFAP(squeeze_r_eyebrow,135);
00153         }
00154 
00155         // copy outer lip contour from inner lip contour
00156         for(int i = 0;i<10;i++)
00157                 expFbaps->setFAP(lower_t_midlip_o + i,expFbaps->faps->llf.value[lower_t_midlip + i]);
00158 
00159         duration = expressionDuration;
00160         if(duration<0)
00161                 duration=0;
00162         playing = 0;
00163 }
00164 /*
00165 SimpleFacialExpression::setFBAPs(FBAPs *_fbaps,char *mask, char *fapsVal)
00166 {
00167         FAPs *faps = _fbaps->faps;
00168         LLFAPs *llfaps = &faps->llf;
00169         int i;
00170         
00171         char *s;
00172         
00173         for(i=0; i<N_FAP_GROUP; i++) 
00174         {
00175                 faps->maskType[i] = 1;
00176         }
00177         s = mask;
00178         for(i=0; i<NFAP; i++) 
00179         {
00180                 sscanf(s, "%d", &faps->groupMask[i]);   
00181                 while(s[0] && s[0] != ' ') s++;
00182                 s++;
00183         }
00184                   
00185         s = fapsVal;
00186         for(i=2; i<NFAP; i++) 
00187         {
00188                 if(faps->groupMask[i]) 
00189                 {
00190                         sscanf(s, "%d", &(llfaps->value[i]));
00191                         while(s[0] && s[0] != ' ') s++;
00192                         s++;
00193                 }
00194                 else
00195                         llfaps->value[i] = 0; 
00196         }
00197 }
00198 */
00199 SimpleFacialExpression::~SimpleFacialExpression()
00200 {
00201         delete fbaps;
00202 }
00203 
00204 FBAPs * SimpleFacialExpression::getFBAPs(long globalTime, FBAPs *lastFBAPs, AFM *afm)
00205 {
00206         if(!playing)
00207                 return fbaps;
00208 
00209         long localTime = globalTime - globalStartTime;
00210 
00211         if(localTime > duration)
00212                 return NULL; // indicate that the action has finished, the FAPlayer may now remove or delete it, depending on the playing mode
00213 
00214         long time_step;
00215         float intensity_step;
00216         int phase;
00217         float dir;
00218 
00219         // calculate the time sice the last call to this function
00220         time_step = localTime - lastTimeMs;
00221         lastTimeMs = localTime;
00222 
00223         // check in which phase is the expression
00224         if(localTime < attack_time) phase = 1; // attack phase
00225         else
00226                 if(localTime < attack_time+sustain_time) phase = 2; // sustain phase
00227                 else
00228                         phase = 3; // decay phase
00229 
00230         switch(phase)
00231         {
00232         case 1: // in the attack phase, grow linearly
00233                 intensity_step = (float)(1.0f * (time_step / attack_time));
00234                 dir = 1.0;
00235                 break;
00236         case 2: // in the sustain phase, no change
00237                 intensity_step = 0.0;
00238                 dir = 0.0;
00239                 break;
00240         case 3: // in the decay phase, fall linearly
00241                 intensity_step = (float)(1.0f * (time_step / decay_time));
00242                 dir = -1.0;
00243                 break;
00244         default:
00245                 intensity_step = 0.0;
00246                 dir = 0.0;
00247                 break;
00248         }
00249         // set the intensity for FAP expression 1
00250         intensity += intensity_step * dir;
00251         if(intensity>1.0) intensity = 1.0;
00252         if(intensity<0.0) intensity = 0.0;
00253         fbaps->set(expFbaps,intensity*maxIntensity);
00254 
00255         return fbaps;
00256 }
00257 
00258 void SimpleFacialExpression::start(long globalTime)
00259 {
00260         globalStartTime = globalTime;
00261         lastTimeMs = 0;
00262         attack_time = duration / 6; // the duration of the attack phase, in milliseconds (1/6 of the total duration)
00263         sustain_time = duration / 2; // the duration of the sustain phase, in milliseconds (3/6 of the total duration)
00264         decay_time = duration / 3; // the duration of the decay phase, in milliseconds (2/6 of the total duration)
00265         fbaps->faps->fap2.expression1 = currentExpression;
00266         fbaps->faps->fap2.intensity1 = 0;
00267         intensity = 0.0f;
00268         playing = 1;
00269 }
00270 
00271 void SimpleFacialExpression::stop()
00272 {
00273         fbaps->faps->fap2.expression1 = currentExpression;
00274         fbaps->faps->fap2.intensity1 = 0;
00275         playing = 0;
00276 }

Generated on Wed Nov 8 16:13:38 2006 for VisageLink by doxygen 1.3.1