このページではサンプルプログラムの中身を解説します。
Assetsとはプログラムで使用されるデータの集合です。
まずMikuMikuStudioでサンプルプログラムを開き、左側のProjectのツリー(赤○で囲った部分)を見て下さい。このProject Assetsというところにプログラムで使用するPMDモデルやテクスチャファイルなどが格納されています。
このサンプルでは初音ミクのモデルはModelの下に、モーションデータはmotionの下に格納されています。
toonの下にはトゥーンシェードで使用するビットマップが格納されています。
ProjectのツリーのSource Packageというところを展開するとMain.javaというファイルがあります。これがプログラム本体です。
Main.javaをダブルクリックするとファイルが開きます。
ソースコード
ソースはたったこれだけです。
順番に解説していきます。
public class Main extends SimpleApplication {
MainクラスはSimpleApplicationクラスを継承しています。SimpleApplicationクラスは最も一般的なアプリケーションの機能を提供します。
public static void main(String[] args) {
// com.jme3.system.JmeSystem.setLowPermissions(true);
Main app = new Main();
app.start();
}
Mainクラスのインスタンスを作成し、start()メソッドを呼んでいます。 startメソッドが呼ばれるとSimpleApplicationはまず設定ダイアログを表示し、ユーザーが設定した解像度やフレームレートでOpenGLを初期化し、メインウィンドウを表示します。
アプリケーションの初期化を行うメソッドです。
flyCam.setMoveSpeed(50);
SimpleApplicationでは標準でflyCamが用意されています。flyCamはユーザーのマウスやキーボード操作で自由に動かす事の出来るカメラです。 ここではカメラの移動速度を50にセットしています。
PMDNode pmdNode = (PMDNode) assetManager.loadModel("/Model/初音ミク.pmd");
VMDFile vmd = (VMDFile) assetManager.loadAsset("/motion/ごまえミク.vmd");
PMDモデルとVMDモーションデータをassetsから読み込みます。
vmdControl = new VMDControl(pmdNode, vmd);
pmdNode.addControl(vmdControl);
pmdNode.addControl(new UpdateControl(pmdNode));
モーションを再生するためのコントロールをpmdNodeに設定します。
vmdControlはVMDファイルの再生を行うコントロールです。 各フレームごとにVMD再生、IK計算、物理演算を行いボーンの位置を更新します。
UpdateControlは表情モーフィングと、vmdControlで更新されたボーンの位置情報をジオメトリに反映させるコントロールです。
vmdControl.setFrameNo(0);
vmdControl.setPause(true);
VMDファイルの再生位置を0フレーム目にセットし、再生を一時停止しています。
rootNode.attachChild(pmdNode);
rootNodeにPMDモデルを追加します。
DirectionalLight dl = new DirectionalLight();
dl.setDirection(new Vector3f(1, 0, -5).normalizeLocal());
dl.setColor(ColorRGBA.White.mult(0.5f));
rootNode.addLight(dl);
AmbientLight al = new AmbientLight();
al.setColor(ColorRGBA.White.mult(1.0f));
rootNode.addLight(al);
ライトを追加しています。尚、ライトの追加を忘れると完全な暗闇になり、何も表示されなくなるので注意して下さい。
ここではDirectionalLight(方向のあるライト)とAmbientLight(環境光)を追加しています。
CartoonEdgeProcessor cartoonEdgeProcess = new CartoonEdgeProcessor();
viewPort.addProcessor(cartoonEdgeProcess);
CartoonEdgeProcessorはトゥーンシェードの輪郭線を描くプロセッサーです。これを忘れると輪郭線が表示されなくなります。
cam.setLocation(new Vector3f(0, 10, 40));
カメラの初期位置を設定します。
float time = 0;
@Override
public void simpleUpdate(float tpf) {
time += tpf;
if (time > 5) {
// start after 5 seconds.
if (vmdControl != null) {
vmdControl.setPause(false);
}
}
}
simpleUpdateメソッドは、各フレームごとに呼ばれるメソッドです。ここではプログラム開始後5秒間経つとvmdControl.setPause(false) を呼び、再生を開始しています。