パラメータ操作

[最終更新日:2019/01/18]

 

CubismIdHandle

Cubismでパラメータを最終的に特定するには、パラメータの並びであるIndexを得る必要があります。
IDで特定する場合には、パラメータの文字列であるIDを照合してくことになります。
Frameworkでは照合の計算コストを削減するためにCubismIdHandleという型を用意しました。

 

Native

CubismIdHandle型の実態はCubismIdクラスのポインタ型で、管理クラスの関数CubismIdManager::GetId関数によって取得できます。
CubismIdManager::GetId関数は同じ文字列であれば同じポインタを返すため、
CubismIdHandle同士を比較し同じポインタアドレスであれば、同じ文字列である保証ができます。

CubismIdManagerインスタンスにはstaticであるCubismFramework::GetIdManager関数でアクセスできます。

値の操作関数ではIndexによるアクセスと、CubismIdHandleによるアクセスの二つの方法が用意されています。

 

Web

CubismIdHandle型の実態はCubismIdクラスのオブジェクト型で、管理クラスの関数CubismIdManager.getId関数によって取得できます。
CubismIdManager.getId関数は同じ文字列であれば同じインスタンスを返すため、
CubismIdHandle同士を比較し同じオブジェクトであれば、同じ文字列である保証ができます。

CubismIdManagerインスタンスにはstaticであるCubismFramework.getIdManager関数でアクセスできます。

値の操作関数ではIndexによるアクセスと、CubismIdHandleによるアクセスの二つの方法が用意されています。

 

パラメータを設定する

パラメータは、通常ではモーションから再生されますが直接値を指定することもできます。
パラメータを操作する関数は、以下の通り、適用する値の計算方法ごとに3種類あります。

 

1.値を上書きする

Native(C++)のCubismModel::SetParameterValue関数、またはWeb(TypeScript)のCubismModel.setParameterValueById関数を使用します。
第一引数にパラメータのIDかインデックス,第二引数に値、第三引数に影響度を設定します。
影響度は省略可能で、その場合は1になります。
例えば0.5にすると前の値の影響を50%残したまま設定することになります。

 

 

2. 現在の値に加算する

Native(C++)のCubismModel::AddParameterValue関数、またはWeb(TypeScript)のCubismModel.addParameterValueById関数を使用します。
引数はNative(C++)のCubismModel::SetParameterValue関数、またはWeb(TypeScript)のCubismModel.setParameterValueById関数と同じです。
この関数で設定した値は、そのパラメータに現在設定されている値に加算されます。

 

 

3. 現在の値に乗算する

Native(C++)のCubismModel::MultiplyParameterValue関数、またはWeb(TypeScript)のCubismModel.multiplyParameterValueById関数を使用します。
引数はNative(C++)のCubismModel::SetParameterValue関数、またはWeb(TypeScript)のCubismModel.setParameterValueById関数と同じです。
この関数で設定した値は、そのパラメータに現在設定されている値に乗算されます。

また、現在のパラメータ値の取得にはNative(C++)のCubismModel::GetParameterValue関数、またはWeb(TypeScript)のCubismModel.getParameterValueById関数を使用します。

 

パラメータのインデックスによる指定

パラメータのID指定には、文字列から生成するID型で指定する方法とインデックスで指定する方法があります。
インデックスをあらかじめ取得するなどキャッシュした上でインデックスを使ったほうが高速なため、呼び出し頻度が多い場合はインデックスの使用をおすすめします。
パラメータのインデックスはNative(C++)のCubismModel::GetParameterIndex関数、またはWeb(TypeScript)のCubismModel.getParameterIndex関数で取得できます。

 

 

パラメータの値を保存、復元する

モデルの現在のパラメータ値を一時的に保存する場合はNative(C++)のCubismModel::SaveParameters関数、またはWeb(TypeScript)のCubismModel.saveParameters関数を使用します。
これを実行するとすべてのパラメータ値を一時保存し、次にNative(C++)のCubismModel::LoadParameters関数、またはWeb(TypeScript)のCubismModel.loadParameters関数を読んだ時に復元されます。

 

 

LAppModel::UpdateにおけるSaveParameters、LoadParametersの使い方

APIとしてのSaveParameters、LoadParametersは値の保存と呼び出しを行うものですが、
実際のLAppModel::Update関数ではLoadParameterを呼び出して前回状況へリセットを行い、
モーションの再生を適用してから、SaveParameterを実行しています。

 

この方法の目的は、モーションが再生されていなかったり、モーション再生によって指定のなかったパラメータへ
Updateの他の操作が入る前の値で上書きすることで、加算・乗算計算のベースを作り出すことにあります。

この機能がない場合はモーションで指定のないパラメータへAddを行うと、更新ごとに値がAddされて範囲外へ値が出ることになります。

モーション再生前のLoadのみであっても加算・乗算のベースは作成できますが、
モーション再生後のSaveが入ることによりモーションの最後の状態を保持できるようになります。

 

パーツの透明度を取得・設定する

パーツの透明度の設定はNative(C++)のCubismModel::SetPartOpacity関数、またはWeb(TypeScript)のCubismModel.setPartOpacityById関数を、
パーツの透明度の取得はNative(C++)のCubismModel::GetPartOpacity関数、またはWeb(TypeScript)のCubismModel.getPartOpacityById関数を使用します。

 

 

パラメータの適用タイミングとコスト

パラメータの設定時にはパラメータ値を書き換えるだけで頂点計算は行いません。
パラメータ変更後のNative(C++)のCubismModel::Update関数、またはWeb(TypeScript)のCubismModel.update関数で頂点が計算され
その後Native(C++)のCubismRenderer::DrawModel関数、またはWeb(TypeScript)のCubismRenderer.drawModel関数でパラメータ適用後のモデルが描画されます。

 

パラメータの計算順序の重要性

パラメータ操作には上書き、加算、乗算の3タイプがあります。
乗算の計算を最初に行っても後の加算や上書きには影響しません。
上書きを最後に行うとそれまでの計算結果がすべて無視されます。
上書き、加算、乗算と適用していくのが一般的です。

プログラムコンポーネントなどとして計算内容が確認しづらい状況では
どの操作がどの計算を行うか把握し、順序をもってコンポーネントの適用順を設定する必要があります。

 

上にあるGifに示した目の開きの違いが、どのようなコードの違いで発生するかを見ていきます。
SDKに含まれるサンプルモデルのharuに対してまばたきと表情の適用を行っている例になります。
表情設定に関しては目の開閉を2倍に見開くf06.exp3.jsonを再生している状態です。
計算順序だけが問題のためC++のコードのみを掲載します。

上書き動作の自動まばたきの後に、乗算動作の表情設定を行うAのUpdate

 

乗算動作の表情設定��後に、上書き動作の自動まばたきを行うBのUpdate

 

Aではまばたきの後に表情の効果で目が大きく見開かれていること確認できます。
一方でBの計算ではまばたきに上書きされ標準の目の開閉に抑えられてしまっています。
計算の順番が違うだけでモデルが表現するニュアンスは大きく異なってしまいます。

モーションや表情、機能の計算順序はデザイナとも共有しておきましょう。

Copyright © 2019 Live2D Inc.