CubismJavaFrameworkを直接利用する方法

[最終更新日:2022/10/06]

Cubism SDK for Javaは現在alpha版となっています。beta版や正式版で仕様が変わる場合もございます。

Cubism SDK for Javaに同梱されているサンプルプロジェクトは、CubismJavaFramework (SDKパッケージの /Framework/ 以下)を用いてCubismモデルを扱っています。
Cubismモデルを扱うプロジェクトを作成する場合はサンプルプロジェクトを基礎にご利用いただくのがよいかと思いますが、既存のアプリケーションやユーザー独自のエンジンなどに実装するときはCubismJavaFrameworkのAPIを直接扱いたい場合があるかと思います。
しかし、同梱されているサンプルプロジェクトは高機能なため、そちらを参考にするだけでは構造の理解と切り分けが容易ではありません。

以下では、上記のようなユーザーを対象として、CubismFrameworkを直接呼び出してモデルを扱う最小のスニペットを紹介します。

 

CubismFrameworkのサイクル

CubismFrameworkを扱うための手順は以下のとおりです。

  1. CubismFrameworkの初期化
  2. モデルファイルのパスを取得
  3. モデルの読み込み
  4. アップデート処理
  5. モデルの破棄
  6. CubismFrameworkの終了処理

 

CubismFrameworkの初期化

CubismFrameworkの初期化処理は以下の通りです。

CubismFrameworkは、CubismFramework.startUp() を使用して初期化を行います。
Cubism SDK for Native では第一引数にアロケータ(ICubismAllocator)をとっていましたが、Cubism SDK for Java(alpha版) では使用しません。

Tips

CubismFramework.initialize() を呼び出すのは初期化時に一度のみで、その後はCubismFrameworkが破棄されない限り、連続で呼び出してもスキップします。
ただし、一度CubismFrameworkを破棄した後であれば、再度初期化を行う場合にはCubismFramework.initialize() を呼び出します。

 

モデルファイルのパスを取得

Cubismの組み込み用データ一式は、.model3.jsonにそれぞれの相対パスが記述されています。
MOC3ファイルやテクスチャなどを直接指定して読み込ませても構いませんが、基本的には.model3.jsonからパスを取得して読み込むことを推奨します。

.model3.jsonのパースは、CubismFrameworkのCubismModelSettingJsonクラスを使用します。

 

 

モデルの読み込み

モデルの読み込みには、CubismModelのインターフェースによって行います。

CubismModelのインスタンスは、CubismJavaFrameworkではCubismUserModel._modelが保持しています。
こちらを利用する場合、CubismUserModelを継承したクラスから扱うことを推奨しています。
また、テクスチャやモーション、表情モーション等のリソース管理は外部で行うことも可能です。

ここでは、例としてCubismUserModelを継承したCubismUserModelExtendを用いて説明します。

 

読み込むMOC3ファイルのパスは上記の通り.model3.jsonで取得できますが、同様に.model3.jsonから表情、物理演算、ポーズ、まばたき、リップシンク、ユーザーデータ、モーションのパスも取得できます。
SDKのサンプルではモデルの読み込みと同時にこれらの読み込みも行っております。
それぞれの読み込み方法につきましては以下を参考にしてください。

Tips

上記のスニペットは、画面にモデルを1体表示することを前提としたものです。
画面上に同時に複数体のモデルを表示する場合、表示するモデルと同数のCubismUserModelの派生クラスのインスタンスを生成します。

 

アップデート処理

Cubismモデルのアップデート処理は、モデルの初期化と同様にCubismModelのインターフェースであるCubismModel.update() を呼び出すことで行います。
CubismModel.update() を呼び出すとCubism Core の更新処理が行われ、それまでに設定されたパラメータやパーツの値から頂点情報を更新します。

アップデート処理では必ずupdate() 以前に、視線追従や物理演算、モーション再生などを行います。

CubismModel.update() よりも後にパラメータの値を操作しても反映されません。
その後に再度CubismModel.update() を呼べば反映されますが、この処理は負荷が高いため一つにまとめることを推奨します。

 

モーションを再生するCubismMotionManager.updateMotion() は、再生するモーションに使用されているIDのパラメータの値をすべて上書きします。
そのため、この処理以前にパラメータの値を操作してもすべてCubismMotionManager.updateMotion() によって上書きされてしまいます。
視線追従などの値操作や物理演算などは、先にモーションの再生処理を行い、その後に行うことを推奨します。

 

また、再生するモーションにすべてのパラメータが使用されていない場合や、モーションの再生が停止しているなどの理由からパラメータの値を操作しない場合、前のフレームで行った値操作の結果が残ったままになります。
そのため、その後に行う相対的なパラメータの値操作の結果が意図しないものになる可能性があります。
これは、モーションをモデルに反映させる処理の前後にCubismModel.loadParameter() 、CubismModel.saveParameters() を呼び出すことで、その後に行う相対的な値操作をリセットすることが可能です。

 

視線追従や物理演算、モーションの再生などの処理自体についてはそれぞれのドキュメントを参照してください。

物理演算や_model.update関数で更新された頂点情報などをレンダラーに渡すことで、Cubismモデルを画面に描画することができます。

 

モデルの破棄

Cubism SDK for Java(alpha版)では基本的にはリソースの解放をガベージコレクションに任せていますが、モデルの生成においてはJava Native Interface(JNI)を使用してNativeの関数にアクセスすることで実現しています。
従って、この箇所に関してはdelete処理を実行する必要があります。

 

 

Cubism Frameworkの終了処理

CubismFrameworkが確保した共通部分のリソースを解放するには、CubismFramework.dispose() を呼び出します。
CubismFramework.dispose() は、CubismFramework.initialize() を呼ぶ前には呼び出さないでください。

Tips

CubismFrameworkで初期化したデータはモデルデータには依存していないため、複数のモデル間で使いまわすことができます。
そのため、モデルの切り替えだけであればCubismFramework.dispose() を呼び出す必要はありません。

© 2010 - 2022 Live2D Inc.