CubismJsでモーションファイルを再生する

前回記事のサンプルでは、Live2D のパラメータを直接与えることでキャラクタを動かしていました。
今回はモーションを複数用意することで、滑らかな動き(パラメータの変化)を目指します。

スポンサーリンク

使用するアプリケーション

・Live2D Cubism3
・Cubism SDK for JavaScript (以下cubism-js)

※現在(2020/11)は、Cubism SDK for Web に移行したためCubism SDK for JavaScriptをダウンロードすることはできません。Live2DをWebブラウザで動作させる場合には、Cubism SDK for Webを使用してください。

以下の記事で導入までの流れを紹介しています。

Cubism SDK for Web を使ってみる
この記事では Cubism SDK for Web の基本的な動作(モデルの表示とアニメーション)について確認しています。
Cubism SDK for Web
WebGLで実装されたSDKです。
主要なWebブラウザに対応しているため、幅広い環境で動作させることが可能です。
ソースコードはTypeScriptで書かれており、トランスパイルを行うことでJavaScriptから扱うことも可能です。

使用するイラスト

使用するイラスト
© Unity Technologies Japan/UCL

cubism-jsで使用するモーションの準備

前回記事で作成した pixi3seconds 用のモーションを Live2D の Animator で4種類作成します。

スタートボタンをクリックした時のモーション

目を閉じるモーション。10秒でループします。

目閉じ

誤差が0.1秒未満だった時のモーション

3秒に近いタイムで止めることができた時の表情。モーションの長さは3秒です。

A判定

誤差が0.1秒以上0.5秒未満だった時のモーション

少し誤差が生じてしまった時の表情。モーションの長さは3秒です。

B判定

誤差が0.5秒以上だった時のモーション

大きな誤差が生じてしまった時の表情。モーションの長さは3秒です。

C判定

pixi3seconds.jsの編集

今回作成した4種類のモーションを pixi3seconds.js に組み込みます。

モーションファイルの読込

ファイルを配置した場所を指定して、モーションファイルを読み込みます。
サンプルは「スタートボタンをクリックした時のモーション」(motionS.motion3.json)を読み込むコードです。

pixi3seconds.js
.add('motionS', "../assets/portrait/motionS.motion3.json", { xhrType: PIXI.loaders.Resource.XHR_RESPONSE_TYPE.JSON })

レイヤーの追加

今回作成したモーションファイル用のレイヤーを追加します。
「スタートボタンをクリックした時のモーション」は「Start」レイヤーに、表情変化のモーションは「lipsync」レイヤーに配置しました。
サンプルは「Start」レイヤーを追加するコードです。

pixi3seconds.js
.addAnimatorLayer("Start", LIVE2DCUBISMFRAMEWORK.BuiltinAnimationBlenders.ADD, 1)

今回はパラメータが上書きされないようにするため OVERRIDE (上書き)ではなく ADD を使用しています。

変数の追加

モーションを読み込む時に使用する変数を追加します。
サンプルは「motionS」を読み込む時に使用する変数です。

pixi3seconds.js
var animationS = LIVE2DCUBISMFRAMEWORK.Animation.fromMotion3Json(resources['motionS'].data);

モーションファイルの再生と停止

今回作成した表情を変化させるモーションは、ストップボタンをクリックした時に1回だけ再生したい(ループ×)ので、時間を指定して停止させることにしました。
サンプルは「3秒に近いタイムで止めることができた時の表情」(animationA)を再生、停止させるコードです。

pixi3seconds.js
model.animator.getLayer("lipsync").play(animationA);
var count = 0;
var countup = function() {
  model.animator.getLayer("Start").stop(animationS);
  model.animator.getLayer("lipsync").stop(animationA);
}
setTimeout(countup, 3000);

animationA の長さが3秒なので、setTimeout で3秒後にモーションを停止させています。

Cubism 3 JS Sample

今回の作業で作成したサンプル(resultTimeに応じてキャラクタの表情が変化)のキャプチャを載せます。
ブラウザはEdgeで動作を確認しています。

クリックでGIFアニメーションが再生されます
sample_gif

タイトルとURLをコピーしました