Eclipse アプリ作成 Lv3〜3Dグラフ用Cube作り〜

参照コード: Chapter7-1

イントロダクション

前回は、Cubeを作成して3つ並べるところまでやりました。

今回は、3つではなく7つ並べてみようと思います。

<前回のコード>

    @Override
    public void init(Window window) throws Exception {
        renderer.init(window);
        gameItems = new GameItem[] { createCube(0.1f, 0, 0, -2) };
        
    }

    /* 追加したメソッドです */
    private GameItem createCube(float cubeSize, float posX, float posY, float posZ) {
        // Create the Mesh
        float[] positions = new float[]{
            // VO
            -1 * cubeSize,  cubeSize,  cubeSize,
            // V1
            -1 * cubeSize, -1 * cubeSize,  cubeSize,
            // V2
            cubeSize, -1 * cubeSize,  cubeSize,
            // V3
            cubeSize,  cubeSize,  cubeSize,
            // V4
            -1 * cubeSize,  cubeSize, -1 * cubeSize,
            // V5
            cubeSize,  cubeSize, -1 * cubeSize,
            // V6
            -1 * cubeSize, -1 * cubeSize, -1 * cubeSize,
            // V7
            cubeSize, -1 * cubeSize, -1 * cubeSize,
        };
        float[] colours = new float[]{
            0.5f, 0.0f, 0.0f,
            0.0f, 0.5f, 0.0f,
            0.0f, 0.0f, 0.5f,
            0.0f, 0.5f, 0.5f,
            0.5f, 0.0f, 0.0f,
            0.0f, 0.5f, 0.0f,
            0.0f, 0.0f, 0.5f,
            0.0f, 0.5f, 0.5f,
        };
        int[] indices = new int[]{
            // Front face
            0, 1, 3, 3, 1, 2,
            // Top Face
            4, 0, 3, 5, 4, 3,
            // Right face
            3, 2, 7, 5, 3, 7,
            // Left face
            6, 1, 0, 6, 0, 4,
            // Bottom face
            2, 1, 6, 2, 6, 7,
            // Back face
            7, 6, 4, 7, 4, 5,
        };
        Mesh mesh = new Mesh(positions, colours, indices);
        GameItem gameItem = new GameItem(mesh);
        gameItem.setPosition(posX, posY, posZ);
        gameItem.setRotation(20, 30, 0);
        return gameItem;
    }

前回のコードではCubeを作成するのに、いちいちX〜Zまでの値を設定していました。これは、コードを書き間違えやすく修正点も多いのでイマイチなコードです。なので、これを一般化して作成するCubeの数を与えるようなコードに修正します。

<修正したコード>

    @Override
    public void init(Window window) throws Exception {
        renderer.init(window);

        final float cubeSize = 0.1f;
        // x軸の初期値
        final float xInit = 0;
        // y軸の初期値
        final float yInit = 0;
        // z軸の初期値
        final float zInit = -2;
        // x軸の増減幅
        final float xWidth = 0.185f;
        // y軸の増減幅
        final float yWidth = 0.033f;
        // z軸の増減幅
        final float zWidth = 0.1f;

        ArrayList arr = new ArrayList();
        for(int i = 1; i <= 7; i++) {
    		arr.add(createCube(
    				cubeSize, xInit + (xWidth * i), yInit + (yWidth * i), zInit - (zWidth * i)));
        }
        // 配列の要素数を指定する
        GameItem[] items = new GameItem[arr.size()];
        // 配列の取り出し
        gameItems = arr.toArray(items);
    }

    /* 追加したメソッドです */
    private GameItem createCube(float cubeSize, float posX, float posY, float posZ) {
        // Create the Mesh
        float[] positions = new float[]{
            // VO
            -1 * cubeSize,  cubeSize,  cubeSize,
            // V1
            -1 * cubeSize, -1 * cubeSize,  cubeSize,
            // V2
            cubeSize, -1 * cubeSize,  cubeSize,
            // V3
            cubeSize,  cubeSize,  cubeSize,
            // V4
            -1 * cubeSize,  cubeSize, -1 * cubeSize,
            // V5
            cubeSize,  cubeSize, -1 * cubeSize,
            // V6
            -1 * cubeSize, -1 * cubeSize, -1 * cubeSize,
            // V7
            cubeSize, -1 * cubeSize, -1 * cubeSize,
        };
        float[] colours = new float[]{
            0.5f, 0.0f, 0.0f,
            0.0f, 0.5f, 0.0f,
            0.0f, 0.0f, 0.5f,
            0.0f, 0.5f, 0.5f,
            0.5f, 0.0f, 0.0f,
            0.0f, 0.5f, 0.0f,
            0.0f, 0.0f, 0.5f,
            0.0f, 0.5f, 0.5f,
        };
        int[] indices = new int[]{
            // Front face
            0, 1, 3, 3, 1, 2,
            // Top Face
            4, 0, 3, 5, 4, 3,
            // Right face
            3, 2, 7, 5, 3, 7,
            // Left face
            6, 1, 0, 6, 0, 4,
            // Bottom face
            2, 1, 6, 2, 6, 7,
            // Back face
            7, 6, 4, 7, 4, 5,
        };
        Mesh mesh = new Mesh(positions, colours, indices);
        GameItem gameItem = new GameItem(mesh);
        gameItem.setPosition(posX, posY, posZ);
        gameItem.setRotation(20, 30, 0);
        return gameItem;
    }

こちらのコードでは、Cubeの初期値(を指定しています、この初期値から何個並べるのかを指定できるようにしてあります。赤字の部分が初期値を設定している部分になります。

処理概要DummyGame#init()

  1. 初期値を設定(初期化)
  2. 7回Cube作成メソッドを呼び出す
  3. ループするたびに「増減幅」文を初期値に追加(+, -)する

<実行結果>

初期値を画面の中心に指定しているのでこのようになります。

次は?

3Dグラフを表示するのに、グラフが右に寄りすぎ、、、位置が悪いので修正します。

        // x軸の初期値
        final float xInit = -0.8f;
        // y軸の初期値
        final float yInit = -0.8f;
        // z軸の初期値
        final float zInit = -2;

修正したのは赤字の部分の値だけです。表示結果は以下のようになります。

なんかイマイチですが、これを1ヶ月分(7 x 5マス)並べてみます。

修正した部分は以下になります。For文が1つだったのを2つにして以下のような手順に変更しました。

  1. 5回ループする
  2. 7つCubeを作成するときの初期値を変更する
  3. 初期値を元にCubeを7つ並べる



コードは以下になります。いわゆる2次元ループってやつですね(笑)

        // 1ヶ月分(5週間分のマスを作る)
        for(int j = 1; j <= 5; j++) {
        	// 開始点より一列文ずらす
        	// X軸の開始点
        	float xStart = xInit - (0.1f * j);
        	// Y軸の開始点
        	float yStart = yInit + (0.06f * j) ;
        	// Z軸の開始点
        	float zStart = zInit - (0.16f * j);
            // 1週間分
            for(int i = 1; i <= 7; i++) {
        		arr.add(createCube(
        				cubeSize, xStart + (xWidth * i), yStart + (yWidth * i), zStart - (zWidth * i)));
            }
        }

でわでわ。。。

関連ページ一覧

  1. Java Basic for文 〜Step1_3_1〜
  2. Java Basic Level8 〜How to use for statement〜
  3. Java Basic Level 9〜Training of for statement〜
  4. Java 3DGame LWJGL GitBook chapter7-1〜Cube作成〜「動画あり」

<サイトマップ>

Mapping of Java Bassic etc …~Java Basicなど記事一覧~