モデルのパーツを切り替える

モーションで腕などのパーツを切り替えるときは、normalizePartsOpacityGroup()メソッドを毎フレーム呼び出して利用します。
※このメソッドは仮のもので、後に変更する可能性があります。

normalizePartsOpacityGroup()の使い方は下に記載してあります。


  1. public void normalizePartsOpacityGroup( Live2DModelAndroid myLive2DModel, String paramGroup[] , float deltaTimeSec )
  2. {
  3.     if ( myLive2DModel == null ) return;
  4.  
  5.     int visibleParts = -1 ;
  6.     float visibleOpacity = 0 ;
  7.  
  8.     float CLEAR_TIME_SEC = 0.5f ;//この時間で不透明になる
  9.     float phi = 0.5f ;//背景が出にくいように、1>0への変化を遅らせる場合は、0.5よりも大きくする。ただし、あまり自然ではない
  10.     float maxBackOpacity = 0.15f ;
  11.  
  12.  
  13.     //初回
  14.     if( deltaTimeSec == 0 )
  15.     {
  16.         String partsVisibleID , partsID;
  17.         boolean v;
  18.         int index;
  19.         for (int i = 0 ; i < 999 && paramGroup[i] != null; i++ )
  20.         {
  21.             partsVisibleID = paramGroup[i];
  22. //          index = partsVisibleID.indexOf(":");
  23.             partsID = partsVisibleID.substring(8);// "VISIBLE:" を飛ばす
  24.             v = ( myLive2DModel.getParamFloat( partsVisibleID ) != 0 ) ;
  25.             myLive2DModel.setPartsOpacity(partsID , (v ? 1.0f : 0.0f) ) ;
  26.         }
  27.         return ;//終了
  28.     }
  29.     else
  30.     {
  31.         String partsVisibleID , partsID;
  32.         // 現在、表示状態になっているパーツを取得
  33.         for (int i = 0 ; i < 999 && paramGroup[i] != null; i++ )
  34.         {
  35.             partsVisibleID = paramGroup[i];
  36.             boolean v = ( myLive2DModel.getParamFloat( partsVisibleID ) != 0 );
  37.  
  38.             if( v )
  39.             {
  40.                 if( visibleParts >= 0 )
  41.                 {
  42.                     break ;
  43.                 }
  44.                 visibleParts = i ;
  45.                 partsID = partsVisibleID.substring(8) ;// "VISIBLE:" を飛ばす
  46.                 visibleOpacity = myLive2DModel.getPartsOpacity(partsID) ;
  47.  
  48.                 // 新しいOpacityを計算
  49.                 visibleOpacity += deltaTimeSec / CLEAR_TIME_SEC ;
  50.                 if( visibleOpacity > 1 )
  51.                 {
  52.                     visibleOpacity = 1 ;
  53.                 }
  54.             }
  55.         }
  56.  
  57.         if( visibleParts < 0 )
  58.         {
  59.             visibleParts = 1 ;
  60.             visibleOpacity = 1 ;
  61.         }
  62.  
  63.         float opacity ,a1 , backOp ;
  64.         // 表示パーツ、非表示パーツの透明度を設定する
  65.         for (int i = 0 ; i < 999 && paramGroup[i] != null ; i++ )
  66.         {
  67.             partsVisibleID = paramGroup[i] ;
  68.             partsID = partsVisibleID.substring(8) ;// "VISIBLE:" を飛ばす
  69.  
  70.             // 表示パーツの設定
  71.             if( visibleParts == i )
  72.             {
  73.                 myLive2DModel.setPartsOpacity(partsID , visibleOpacity ) ;//先に設定
  74.             }
  75.             // 非表示パーツの設定
  76.             else
  77.             {
  78.                 opacity = myLive2DModel.getPartsOpacity(partsID) ;
  79.                 if( visibleOpacity < phi ){
  80.                     a1 = visibleOpacity*(phi-1)/phi + 1 ; // (0,1),(phi,phi)を通る直線式
  81.                 }
  82.                 else
  83.                 {
  84.                     a1 = (1-visibleOpacity)*phi/(1-phi) ; // (1,0),(phi,phi)を通る直線式
  85.                 }
  86.  
  87.                 //背景の見える割合を制限する場合
  88.                 backOp = (1-a1)*(1-visibleOpacity) ;//背景の
  89.                 if( backOp > maxBackOpacity )
  90.                 {
  91.                     a1 = 1 - maxBackOpacity/( 1- visibleOpacity ) ;
  92.                 }
  93.  
  94.                 if( opacity > a1 )
  95.                 {
  96.                     opacity = a1 ;// 計算の透明度よりも大きければ(濃ければ)透明度を上げる
  97.                 }
  98.             myLive2DModel.setPartsOpacity(partsID , opacity ) ;
  99.         }
  100.     }
  101. }




実際の利用は、以下の擬似コードのようになります。

---クラス関数-------------------------------------------------------------------------
  1. Live2DModel live2DModel;     // ・・・[1]
  2. long lastTime = 0;           // ・・・[2]

[1]: Live2DModelクラスをインスタンス化します。
       パーツの切り替えを行うモデルです。

[2]: 前回描画した時間です。
       直前の描画から経過した時間を取得するのに使用します。

---毎描画呼び出されるところ-------------------------------------------------------------------------
  1. String ARM_VISIBLE[] = { "VISIBLE:PARTS_01_ARM_01", "VISIBLE:PARTS_01_ARM_02", null };     // ・・・[1]
  2.  
  3. long  curTime        = UtSystem.getTimeMSec()                                            // ・・・[2]
  4. float deltaTimeSec   = ( lastTime == 0 ) ? 0 : ( curTime - lastTime 1000.0f ;      // ・・・[3]
  5. lastTime             = curTime;                                                            // ・・・[4]
  6.  
  7. normalizePartsOpacityGroup( live2DModel, ARM_VISIBLE, deltaTimeSec);                       // ・・・[5]

[1]: 切り替えたいパーツのIDを配列にします。
       一つ目に初期状態で表示させておきたいパーツのIDを、二つ目は初期状態では非表示で、切り替えて表示させたいパーツのIDを、三つ目にnullを指定します。

[2]: 現在の時間を取得します。

[3]: 前回の描画からの経過時間を計算します。
       現在の時間 - 前回描画した時間

[4] [2]で取得した時間を保存します。

[5]: 上記のnormalizePartsOpacityGroup()を呼び出します。
       


Comments