サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

libGDXを使った基本的な3D

このチュートリアルでは、LibGDXに実装されている3D APIの基本的な使用方法について説明します。

このチュートリアルの全 ソース と実行可能なテストはこのgithub リポジトリにあります。

このページではあなたが既にLibGDXに精通していることを想定しているので、さっそく新規にプロジェクトをセットアップしてそれにBasic3DTestと名前を付けてください。 ApplicationListenerを実装する必要があるので、まずはそこからスタートしましょう。:


public class Basic3DTest implements ApplicationListener {
    @Override
    public void create () {
    }

    @Override
    public void render () {
    }

    @Override
    public void dispose () {
    }

    @Override
    public void resume () {
    }

    @Override
    public void resize (int width, int height) {
    }

    @Override
    public void pause () {
    }
}

それでは、いくつかの部品を追加してみましょう。 まずはカメラを追加する必要があります。カメラを使うことで作成している3Dシーンを特定の視点から見ることができます。


public class Basic3DTest implements ApplicationListener {
    public PerspectiveCamera cam;

    @Override
    public void create () {
        cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        cam.position.set(10f, 10f, 10f);
        cam.lookAt(0,0,0);
        cam.near = 1f;
        cam.far = 300f;
        cam.update();
    }
...
}

上記コードでは、67度(一般的に使用される値です)の視野のビューを持つPerectiveCamera を新規に作成し、現在の横幅と高さを使ってアスペクト比を設定しています。 次にカメラを右へ10ユニット、上へ10ユニット、後ろへ10ユニットの位置へ設定しています。 Z軸は見ている人の方へ向かって伸びているので、見ている人にとってはカメラのZ軸が正の値だと視点は後ろへ下がります。 見るための3D オブジェクトを(0,0,0)の位置に置いているので、カメラは(0,0,0)の位置を見るよう設定しています。 near値と far値を設定して、オブジェクトが常に見える状態になるようにしています。 最後にカメラを更新して、全ての設定がカメラに反映されるようにしています。

それでは、実際に描写できるものを追加してみましょう。 もちろん、いくつかのモデリングアプリケーションを使って描写するものを作成できますが(すぐにできます)、今のところはコード上から簡単な箱型を作成するだけで良いです。


public class Basic3DTest implements ApplicationListener {
    public PerspectiveCamera cam;
    public Model model;
    public ModelInstance instance;

    @Override
    public void create () {
        cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        ...
        cam.update();

        ModelBuilder modelBuilder = new ModelBuilder();
        model = modelBuilder.createBox(5f, 5f, 5f, 
            new Material(ColorAttribute.createDiffuse(Color.GREEN)),
            Usage.Position | Usage.Normal);
        instance = new ModelInstance(model);
    }

    @Override
    public void dispose () {
        model.dispose();
    }
...
}

上記コードではModelBuilderのインスタンスを作成しています。ModelBuilderを使用すると、コード上でmodelを作成することができます。 それから、5x5x5サイズの簡単な箱型のmodelを作成しています。 また緑のディフューズ色を設定したmaterial をmodelに追加し、そして 位置と法線のコンポーネントをmodelに追加しています。 model を作成する時は、少なくとも Usage.Positionの設定が必要です。 Usage.Normal は箱に法線の属性を追加します。例えば、これで照明が正しく動作します。 Usage は VertexAttributesのサブクラスです。

model には描写に関する全ての情報が含まれており、そのリソースを保持し続けます。 modelをどの位置に描写するかといったような情報は含まれていません。 したがってModelInstanceを作成する必要があるのです。 ModelInstance には、modelを描写する際の場所情報、回転情報、スケール情報が含まれます。 既定ではこれは (0,0,0)になっているので、(0,0,0)の位置に描写されるModelInstance を作成したことになります。

model は破棄をする必要があるので、Dispose() メソッドに破棄をする行を追加しています。

それでは、model のインスタンスを描写してみましょう。


public class Basic3DTest implements ApplicationListener {
    public PerspectiveCamera cam;
    public ModelBatch modelBatch;
    public Model model;
    public ModelInstance instance;

    @Override
    public void create () {
        modelBatch = new ModelBatch();

        cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        ...
        cam.update();

        ModelBuilder modelBuilder = new ModelBuilder();
        model = modelBuilder.createBox(5f, 5f, 5f, 
                new Material(ColorAttribute.createDiffuse(Color.GREEN)),
                Usage.Position | Usage.Normal);
        instance = new ModelInstance(model);
    }

    @Override
    public void render () {
        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);
        modelBatch.render(instance);
        modelBatch.end();
    }

    @Override
    public void dispose () {
        modelBatch.dispose();
        model.dispose();
    }
...
}

githubにある全ソースコードを見てください

上記コードでは、ModelBatchを追加しています。ModelBatchとは描写を司るクラスで、createメソッド内でそれを初期化しています。 render メソッド内では、画面をクリアして modelBatch.begin(cam)を呼び出し、 ModelInstanceを描写してそれから modelBatch.end()を呼び出して描写を終了しています。 最後に、modelBatchを破棄して全てのリソース(使用しているShaderなど)を適切に破棄するよう必要があります。

basic3dtest1

ちゃんと描写できているように見えますが、照明を使うことでもう少し良くなるかもしれません。それでは照明を追加してみましょう。:


public class Basic3DTest implements ApplicationListener {
    public Environment environment;
    ...

    @Override
    public void create () {
        environment = new Environment();
        environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
        environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
        ...
    }

    @Override
    public void render () {
        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);
        modelBatch.render(instance, environment);
        modelBatch.end();
    }
    ...
}

githubにある全ソースコードを見てください

上記コードでは Environment インスタンスを追加しています。 Environment を作成して環境光(0.4, 0.4, 0.4)を設定しています。アルファ値は無視されるので注意してください。 次に色情報(0.8, 0.8, 0.8)と方向情報(-1.0, -0.8f, 0.2)を持つDirectionalLightを追加しています。 ここではあなたが光源に精通していると想定して説明しています。 最後に、modelbatchのインスタンスを描写する際にenvironmentを引数として渡しています。

basic3dtest2

かなり良くなりました。それではカメラを制御してみましょう。別の視点からmodelを見ることができます。


public class Basic3DTest implements ApplicationListener {
    ...
    public CameraInputController camController;
    ...

    @Override
    public void create () {
        ...
        camController = new CameraInputController(cam);
        Gdx.input.setInputProcessor(camController);
    }

    @Override
    public void render () {
        camController.update();
        ...
    }
...
}

githubにある全ソースコードを見てください

上記コードでは、作成したcamを引数として設定できるCameraInputControllerを追加しています。 そしてGdx.input.setInputProcessorにcamControllerを設定し、renderメソッド内でcamControllerを更新するようにしてください。 ここでは、基本的なカメラコントローラーを追加して終了です。これでドラッグしてカメラを回転させることができるようになります。

Basic3DTest の全コードは LibGDX testsに含まれています。

次: LibGDXを使ってmodelを読み込む