モーションについて

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

 

モーションを再生するまでに必要なクラス

1、モーションデータを保持し、モデルに対して操作するクラス

a.インスタンスの作成(motion3.jsonファイルの読み込み)

b.モーションの再生方法についての設定

c.インスタンスの破棄

2、モーション管理クラス

a.インスタンスの作成

b.モーション再生

c.モデルのパラメータ更新

d.モーションの終了

e.ユーザトリガーの受取り

 

1-a.モーションのインスタンスの作成(.motion3.jsonファイルの読み込み)

モーションの再生にはACubsimMotionクラスから派生したCubismMotionクラスを使用します。
モーションに利用するデータは拡張子が「.motion3.json」となっているモーションファイルです。
Cubism2.1の「.mtn」は使用できません。
この.motion3.jsonファイルの読み込みにはNative(C++)のCubismMotion::Create関数、またはWeb(TypeScript)のCubismMotion.create関数を利用します。
jsonファイルを一度ロードしてからバッファとサイズを渡してロードします。

 

 

1-b.モーションファイルごとの再生方法設定

モーションには主に以下の項目を設定します。
これらの設定は行わなくても再生することができます。

* モーション開始時のフェードインの時間

Native(C++)のACubismMotion::SetFadeInTime関数、またはWeb(TypeScript)のACubismMotion.setFadeInTime関数で設定、
Native(C++)のACubismMotion::GetFadeInTime関数、またはWeb(TypeScript)のACubismMotion.getFadeInTime関数で取得できます。
フェードインの時間を秒で指定します。

* モーション終了時のフェードアウトの時間

Native(C++)のACubismMotion::SetFadeOutTime関数、またはWeb(TypeScript)のACubismMotion.setFadeOutTime関数で設定、
Native(C++)のACubismMotion::GetFadeOutTime関数、またはWeb(TypeScript)のACubismMoiton.getFadeOutTime関数で取得できます。
フェードアウトの時間を秒で指定します。

* ループ再生のON/OFF

Native(C++)のvoid CubismMotion::IsLoop(csmBool loop)関数、またはWeb(TypeScript)のCubismMotion.setIsLoop関数で設定、
Native(C++)のcsmBool CubismMotion::IsLoop()関数、またはWeb(TypeScript)のCubismMotion.isLoop関数で現在の値を取得できます。
trueを設定すると終了時に最初から再生します。
他のモーションが割り込むか終了命令が呼ばれるまで無限にループ再生し続けます。
設定しない場合の初期値はfalse(ループしない)です。

※Frameworkのループの動作はエディターのループ動作と完全な一致を保証していません。
※現在Animatorはmotion3.jsonファイルにループ設定を反映させられないため、
 Frameworkはmotion3.jsonファイルのループ設定を無視してfalseを設定します。

設定例 (※これらの設定はモーションの再生前に行ってください)

1-c.インスタンスの破棄

Cubism 3 SDK for Webでは明示的に破棄する必要はありません。

 

モーションのフェード値をファイルから設定する方法については

A、.motion3.jsonファイルに全体値として設定する方法

B、.motion3.jsonファイルにパラメータ個別の値として設定する方法

C、.model3.jsonファイルに全体値として設定する方法

この3つがあり、優先度はB、C、Aの順で適用されます。
いずれの指定もない場合はデフォルト値の1秒が設定されます。

 

 

 

2-a.モーション管理クラスのインスタンスの作成

前項で作成したCubismMotionクラスのインスタンスをモデルに適用する(アニメーションさせる)ためには、 CubismMotionManagerクラスを使用します。

 

 

2-b.モーションの再生

モーションの再生にはNative(C++)のCubismMotionManager::StartMotionPriority関数、またはWeb(TypeScript)のCubismMotionManager.startMotionPriority関数を使用します。

第一引数:ACubismMotionインスタンス、モーションデータ

モーションデータのインスタンスを渡します。
この引数にはACubismMotionの派生インスタンスであるCubismMotionとCubismExpressionMotionのインスタンスが指定できます。
一般的に一つのモーションマネージャが取り扱うインスタンスタイプは一方だけにします。

第二引数:Boolen、自動削除のフラグ

再生が終了したときに自動的にモーションのデータを削除するかどうかのフラグです。
一度だけ再生されるようなモーションに使用します。

第三引数:Int、優先度

CubismMotionManagerで管理する再生の際の優先度設定を指定します。
優先度による再生拒否はCubismMotionManagerの外部で行う必要があります。
優先度に関してはページ下部にあるCubismMotionManagerの項目をごらんください。

モーションを複数同時に再生させたい場合は、CubismMotionManagerインスタンスを増やしてください。
これは右手と左手のモーションを別々に制御するなどのことに使えます。
モーションを同時に再生する場合は、できるだけ同じパラメータについては設定しないでください。
その場合最後に更新したモーションのパラメータが有効になります。
また、フェードが綺麗にかからない場合があります。

 

2-c.モデルのパラメータ更新

Native(C++)のCubismMotionManager::StartMotionPriority関数、またはWeb(TypeScript)のCubismMotionManager.startMotionPriority関数で
モーションを再生しただけでは、モデルはアニメーションしません。
現在再生中のモーションのパラメータをモデルに設定するためには、
毎描画時にNative(C++)のCubismMotionManager::UpdateMotion関数、またはWeb(TypeScript)のCubismMotionmanager.updateMotion関数を呼び出します。

第一引数:CubismModelインスタンス、モーションを適用するモデル

パラメータ情報の取得、操作のみに使用されます。

第二引数:Float、前回実行時からの差分時間

Updateなどで計算される差分時間を入力します。
Float実数で秒単位で入力します。 60FPSでの実行ならば1/60秒で0.016を、30FPSならば1/30秒で0.03を入力します。

 

入力するdeltaTimeSecondsを調整することでスローや停止、早送りをすることができます。
ただし、マイナスの値を使った逆再生は考慮の範囲外の設計になっています。

 

 

2-d.モーションの終了

モーションは再生時間を過ぎたときに自動で終了しますが
任意のタイミングで終了したいときはNative(C++)のCubismMotionQueueManager::StopAllMotions関数、
またはWeb(TypeScript)のCubismMotionQueueManager.stopAllMotions関数を使用します。
フェードの途中などで、同時に2つ以上のモーションを再生している場合、それらすべてを終了します。

 

 

2-e.イベントの受取り

モーションに設定された「イベント」が再生されたときに、
CubismMotionQueueManagerにNative(C++)のSetUserTriggerCallback関数、
またはWeb(TypeScript)のsetUserTriggerCallback関数で登録したコールバックで呼び出しを受けることができます。
登録できるコールバックは1つのみです。
インスタンスの関数を呼び出したい時にはstaticな関数をインスタンスのポインタと一緒に登録し、
staticな関数から登録しておいたインスタンスのポインタを使って目的の関数を呼び出すようにしてください。
複数の動作をさせたい時には一つのコールバックから順に呼び出すようにしてください。

CubismUserModelクラスには標準でこの仕組みが組み込まれています。
Native(C++)の(CubismUserModel::UserTriggerEventFired関数、CubismUserModel::CubismDefaultUserTriggerCallback関数)
またはWeb(TypeScript)の(CubismUserModel.cubismDefaultUserTriggerCallback関数)

 

モーションの自動削除

Native(C++)のCubismMotionQueueManager::StartMotion関数、またはWeb(TypeScript)のCubismMotionQueueManager.startMotion関数の呼び出し時に第二引数のautoDeleteにtrueを入れると、
モーションが再生終了するときにCubismMotionQueueEntryの削除とともにモーションも削除されます。
一度のみ再生されるファイルに対して使用されることを想定しています。

 

 

CubismMotionQueueManagerクラスとCubismMotionManagerクラス

モーションの管理クラスにはCubismMotionQueueManagerクラスと、
CubismMotionQueueManagerクラスを継承したCubismMotionManagerクラスがあります。

 

CubismMotionQueueManager

CubismMotionQueueManagerはモーションの値の適用度合いにフェードが効いた切り替えを担当します。

Native(C++)のLAppModel::StartMotion関数、またはWeb(TypeScript)のLAppModel.startMotion関数でモーション再生追加時にすでに再生しているモーション群に対して
StartFadeoutによって終了時間の前倒しを行います。

この操作によって再生中のモーションがフェードをもって新しいモーションとの切り替わりを実現します。

 

 

CubismMotionManager

CubismMotionManagerクラスは再生するモーションの優先度を保存する機能と、これから再生する予定の優先度を整数として登録する機能があります。
この記録された優先度と比較することで優先度の低いモーション再生を規制する機能を作成することを想定しています。
再生規制をする部分に関してはCubismMotionManagerの外部に用意する必要があります。

Native(C++)のLAppModel::StartMotion関数、またはWeb(TypeScript)のLAppModel.startMotion関数は非同期スレッドからの再生に対応しています。
関数の冒頭で再生の優先をSetReservePriorityやReserveMotionによって登録されます。
次に読み込みが実行されますが、非同期でこの関数を呼ばれた場合冒頭で優先度を登録されるので、
読み込み中に他のスレッドで他の低優先度の再生は規制される仕組みになっています。

再生終了時は優先度が0に設定されるのは固定で、その他の制御は外部に任されます。

Copyright © 2018 Live2D Inc.