00001
00002
00003
00004
00005 #include "stdafx.h"
00006 #include "SimpleFacialExpression.h"
00007
00008
00009
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
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
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
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;
00213
00214 long time_step;
00215 float intensity_step;
00216 int phase;
00217 float dir;
00218
00219
00220 time_step = localTime - lastTimeMs;
00221 lastTimeMs = localTime;
00222
00223
00224 if(localTime < attack_time) phase = 1;
00225 else
00226 if(localTime < attack_time+sustain_time) phase = 2;
00227 else
00228 phase = 3;
00229
00230 switch(phase)
00231 {
00232 case 1:
00233 intensity_step = (float)(1.0f * (time_step / attack_time));
00234 dir = 1.0;
00235 break;
00236 case 2:
00237 intensity_step = 0.0;
00238 dir = 0.0;
00239 break;
00240 case 3:
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
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;
00263 sustain_time = duration / 2;
00264 decay_time = duration / 3;
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 }