void L2DEyeBlink::setParam( live2d::ALive2DModel *model ) { l2d_int64 time = live2d::UtSystem::getTimeMSec() ; float eyeParamValue ; float t = 0 ; switch( this->eyeState ) { case STATE_CLOSING: t = (float)(( time - stateStartTime ) / (double)closingMotionMsec ) ; if( t >= 1 ) { t = 1 ; this->eyeState = STATE_CLOSED ; this->stateStartTime = time ; } eyeParamValue = 1 - t ; break ; case STATE_CLOSED: t = (float)(( time - stateStartTime ) / (double)closedMotionMsec) ; if( t >= 1 ) { this->eyeState = STATE_OPENING ; this->stateStartTime = time ; } eyeParamValue = 0 ; break ; case STATE_OPENING: t = (float)(( time - stateStartTime ) / (double)openingMotionMsec ) ; if( t >= 1 ) { t = 1 ; this->eyeState = STATE_INTERVAL ; this->nextBlinkTime = calcNextBlink() ; } eyeParamValue = t ; break ; case STATE_INTERVAL: if( this->nextBlinkTime < time ) { this->eyeState = STATE_CLOSING ; this->stateStartTime = time ; } eyeParamValue = 1 ; break ; case STATE_FIRST: default: this->eyeState = STATE_INTERVAL ; this->nextBlinkTime = calcNextBlink() ; eyeParamValue = 1 ; break ; } if( ! closeIfZero ) eyeParamValue = -eyeParamValue ; model->setParamFloat( eyeID_L.c_str() , eyeParamValue ) ; model->setParamFloat( eyeID_R.c_str() , eyeParamValue ) ; }
/* * モデルのパラメータを更新 * update時に呼び出す */ void L2DEyeBlink::setParam( live2d::ALive2DModel *model ) { l2d_int64 time = live2d::UtSystem::getTimeMSec() ; float eyeParamValue ;// 設定する値 float t = 0 ; switch( this->eyeState ) { case STATE_CLOSING: // 閉じるまでの割合を0..1に直す(blinkMotionMsecの半分の時間で閉じる) t = (float)(( time - stateStartTime ) / (double)closingMotionMsec ) ; if( t >= 1 ) { t = 1 ; this->eyeState = STATE_CLOSED ;// 次から開き始める this->stateStartTime = time ; } eyeParamValue = 1 - t ; break ; case STATE_CLOSED: t = (float)(( time - stateStartTime ) / (double)closedMotionMsec) ; if( t >= 1 ) { this->eyeState = STATE_OPENING ;// 次から開き始める this->stateStartTime = time ; } eyeParamValue = 0 ;// 閉じた状態 break ; case STATE_OPENING: t = (float)(( time - stateStartTime ) / (double)openingMotionMsec ) ; if( t >= 1 ) { t = 1 ; this->eyeState = STATE_INTERVAL ;// 次から開き始める this->nextBlinkTime = calcNextBlink() ;// 次回のまばたきのタイミングを始める時刻 } eyeParamValue = t ; break ; case STATE_INTERVAL: // まばたき開始時刻なら if( this->nextBlinkTime < time ) { this->eyeState = STATE_CLOSING ; this->stateStartTime = time ; } eyeParamValue = 1 ;// 開いた状態 break ; case STATE_FIRST: default: this->eyeState = STATE_INTERVAL ; this->nextBlinkTime = calcNextBlink() ;// 次回のまばたきのタイミングを始める時刻 eyeParamValue = 1 ;// 開いた状態 break ; } if( ! closeIfZero ) eyeParamValue = -eyeParamValue ; // ---- 値を設定 ---- model->setParamFloat( eyeID_L.c_str() , eyeParamValue ) ; model->setParamFloat( eyeID_R.c_str() , eyeParamValue ) ; }