Develop and Download Open Source Software

Recent Changes

2011-12-29
2011-10-25
2011-09-19
2011-09-18

Wiki Guide

Side Bar

サンプルプログラム説明

このページではサンプルプログラムの中身を解説します。

Assetsとは

Assetsとはプログラムで使用されるデータの集合です。

Assetsの構造

まずMikuMikuStudioでサンプルプログラムを開き、左側のProjectのツリー(赤○で囲った部分)を見て下さい。このProject Assetsというところにプログラムで使用するPMDモデルやテクスチャファイルなどが格納されています。

このサンプルでは初音ミクのモデルはModelの下に、モーションデータはmotionの下に格納されています。

toonの下にはトゥーンシェードで使用するビットマップが格納されています。

プログラムの構造

ProjectのツリーのSource Packageというところを展開するとMain.javaというファイルがあります。これがプログラム本体です。

Main.javaをダブルクリックするとファイルが開きます。

ソースコード

package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.light.PointLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import projectkyoto.jme3.mmd.CartoonEdgeProcessor;
import projectkyoto.jme3.mmd.PMDNode;
import projectkyoto.jme3.mmd.UpdateControl;
import projectkyoto.jme3.mmd.vmd.VMDControl;
import projectkyoto.mmd.file.VMDFile;

/**
 * test
 * <p/>
 * @author kobayasi
 */
public class Main extends SimpleApplication {

    PointLight pl;
    Geometry lightMdl;
    VMDControl vmdControl;

    public static void main(String[] args) {
//        com.jme3.system.JmeSystem.setLowPermissions(true);
        Main app = new Main();
        app.start();
    }

    @Override
    public void simpleInitApp() {
        flyCam.setMoveSpeed(50);
        // Load Model
        PMDNode pmdNode = (PMDNode) assetManager.loadModel("/Model/初音ミク.pmd");
        VMDFile vmd = (VMDFile) assetManager.loadAsset("/motion/ごまえミク.vmd");
        vmdControl = new VMDControl(pmdNode, vmd);
        pmdNode.addControl(vmdControl);
        pmdNode.addControl(new UpdateControl(pmdNode));
        vmdControl.setFrameNo(0);
        vmdControl.setPause(true);

        rootNode.attachChild(pmdNode);


        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);
        CartoonEdgeProcessor cartoonEdgeProcess = new CartoonEdgeProcessor();
        viewPort.addProcessor(cartoonEdgeProcess);

        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);
            }
        }
    }
}

ソースはたったこれだけです。

順番に解説していきます。

クラス定義

public class Main extends SimpleApplication {

MainクラスはSimpleApplicationクラスを継承しています。SimpleApplicationクラスは最も一般的なアプリケーションの機能を提供します。

main メソッド

    public static void main(String[] args) {
//        com.jme3.system.JmeSystem.setLowPermissions(true);
        Main app = new Main();
        app.start();
    }

Mainクラスのインスタンスを作成し、start()メソッドを呼んでいます。 startメソッドが呼ばれるとSimpleApplicationはまず設定ダイアログを表示し、ユーザーが設定した解像度やフレームレートでOpenGLを初期化し、メインウィンドウを表示します。

simpleInitApp メソッド

アプリケーションの初期化を行うメソッドです。

カメラ設定

        flyCam.setMoveSpeed(50);

SimpleApplicationでは標準でflyCamが用意されています。flyCamはユーザーのマウスやキーボード操作で自由に動かす事の出来るカメラです。 ここではカメラの移動速度を50にセットしています。

PMD,VMDファイル読み込み

        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の設定

        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追加

        CartoonEdgeProcessor cartoonEdgeProcess = new CartoonEdgeProcessor();
        viewPort.addProcessor(cartoonEdgeProcess);

CartoonEdgeProcessorはトゥーンシェードの輪郭線を描くプロセッサーです。これを忘れると輪郭線が表示されなくなります。

カメラ初期位置設定

        cam.setLocation(new Vector3f(0, 10, 40));

カメラの初期位置を設定します。

simpleUpdate メソッド

    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) を呼び、再生を開始しています。


SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.