Java 3DGame LWJGL Retry Lv3 Texture〜動かして理解する3〜

イントロダクション

前回、惨敗を喫してしまいました。Textureが結局判らずじまい。。。

悔しいので、2次元描画のプログラムをカスタムしてもう一度やってみます。

参照するドキュメント:LWJGL GitBookChapterのChapter5

カスタムするコード:LWJGL GitBook Chapter5

ここで描画した四角形にテクスチャを貼ろうと思います。

<元の画像>

元々のコードにTextureクラスを追加して、MeshクラスにTextureを作成するコードを加えたものを起動してみました。

ちなみにGitに登録しているソースです。下のような感じです。



そして、実行してみた結果は以下です。

想定と全く違うものです。。。原因は一体なんだろう?

ちなみに一部ですが、ソースはこんな感じです。

<Meshクラス>

    // 最後の「boolean」はコンストラクタのオーバーロードのためだけにつけたものです。エラー回避ようです。
    public Mesh(float[] positions, int[] indices, float[] textCoords, boolean flg) {
        FloatBuffer posBuffer = null;
        IntBuffer indicesBuffer = null;
        FloatBuffer textCoordBuffer = null;
        try {
        	texture = new Texture("/textures/Mon.png");
        } catch(Exception e) {
        	e.printStackTrace();
        }
        vboIdList = new ArrayList<>();
        try {
            vertexCount = indices.length;
            vaoId = glGenVertexArrays();
            vboIdList.add(vaoId);
            glBindVertexArray(vaoId);

            // Position VBO
            int posVboId = glGenBuffers();
            vboIdList.add(posVboId);
            posBuffer = MemoryUtil.memAllocFloat(positions.length);
            posBuffer.put(positions).flip();
            glBindBuffer(GL_ARRAY_BUFFER, posVboId);
            glBufferData(GL_ARRAY_BUFFER, posBuffer, GL_STATIC_DRAW);
            glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);

            // Texutre coordinates VBO:2018/11/07追記部分です。
            int vboId = glGenBuffers();
            vboIdList.add(vboId);
            textCoordBuffer = MemoryUtil.memAllocFloat(textCoords.length);
            textCoordBuffer.put(textCoords).flip();
            glBindBuffer(GL_ARRAY_BUFFER, vaoId);
            glBufferData(GL_ARRAY_BUFFER, textCoordBuffer, GL_STATIC_DRAW);
            glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0);
            
            // Index VBO
            idxVboId = glGenBuffers();
            vboIdList.add(idxVboId);
            indicesBuffer = MemoryUtil.memAllocInt(indices.length);
            indicesBuffer.put(indices).flip();
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idxVboId);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_STATIC_DRAW);
            
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glBindVertexArray(0);
        } finally {
            if (posBuffer != null) {
                MemoryUtil.memFree(posBuffer);
            }
            if (indicesBuffer != null) {
                MemoryUtil.memFree(indicesBuffer);
            }
            if (textCoordBuffer != null) {
                MemoryUtil.memFree(textCoordBuffer);
            }
        }
    }

これで、とりあえず動かしてみたのだけど、上記のキャプチャ通りの結果でした。ブログを書いていて気がついたけど「シェーダ・プログラム」を修正していなかった。。。

関連ページ一覧

<今回のやっていること>

  1. Eclipse アプリ作成 Lv1〜家計簿を作る準備〜
  2. Eclipse アプリ作成 Lv2〜家計簿を作る土台作り〜
  3. Eclipse アプリ作成 Lv3〜3Dグラフ用Cube作り〜

<Java Basic>

  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作成〜「動画あり」

<サイトマップ>

 

Eclipse アプリ作成 Lv4〜3Dグラフ用Cubeに高さを与える〜

参照コード:Chapter7-1(Gitです)

参照サイト:https://lwjglgamedev.gitbooks.io/3d-game-development-with-lwjgl/content/chapter07/chapter7.html

イントロダクション

前回は、Cubeを使って7 x 5マスを作りました。これだけではグラフになりませんのでこれに高さを与えてやる必要があります。

現状のソースは以下にようになってます。

@Override
    public void init(Window window) throws Exception {
        renderer.init(window);
        // Cubeのサイズ(たて、横、高さが同じなので値は1つ)
        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;
    }

現状のソースを修正する

現在の処理は次のような処理を行なっています。

  1. Cubeを作成するのに必要な値を初期化、作成の開始点を設定
  2. Cubeを複製するのに必要な値(Cube1つ分の移動する幅)を定義
  3. ループで7回、createCubeを呼ぶ処理を回す
  4. createCubeでCubeを作成する時にcubeSizeを渡す
  5. 上の赤字の部分を修正して次のように変更します。
  6. Cubeの高さを持っているArrayListを作成
  7. Cubeを作成するのに必要な値を初期化、作成の開始点を設定
  8. 1ヶ月分のマス(Cube)を作成するために5回ループを作成
  9. 「2」で指定した開始点にループした回数分ずらす処理を追加(1回目は変更なし)
  10. Cubeを複製するのに必要な値(Cube1つ分の移動する幅)を定義
  11. createCubeでCubeを作成する時にcubeSizeと高さを渡す
  12. ループで7回、createCubeを呼ぶ処理を回す

<今回のソース>

    @Override
    public void init(Window window) throws Exception {
        renderer.init(window);
        // Cubeの高さ
        ArrayList<float[]> floats = new ArrayList<>();
        floats.add(new float[] {0.2f, 0.12f, 0.3f, 0.001f, 0.1f, 0.25f, 0.1f});
        floats.add(new float[] {0.15f, 0.19f, 0.23f, 0.2f, 0.08f, 0.13f, 0.12f});
        floats.add(new float[] {0.1f, 0.2f, 0.4f, 0.001f, 0.2f, 0.05f, 0.15f});
        floats.add(new float[] {0.11f, 0.12f, 0.3f, 0.001f, 0.1f, 0.25f, 0.1f});
        floats.add(new float[] {0.12f, 0.13f, 0.14f, 0.015f, 0.16f, 0.17f, 0.18f});
        // Cubeの底面のサイズ(正方形)
        final float cubeSize = 0.1f;
        // x軸の初期値
        final float xInit = -0.5f;
        // y軸の初期値
        final float yInit = -0.8f;
        // 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();
        // 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週間分
        	float[] week = floats.get(j-1);
            for(int i = 1; i <= 7; i++) {
            	float val = week[i - 1];
        		arr.add(createCube(val,
        				cubeSize, xStart + (xWidth * i), yStart + (yWidth * i), zStart - (zWidth * i)));
            }
        }
        // 配列の要素数を指定する
        GameItem[] items = new GameItem[arr.size()];
        // 配列の取り出し
        gameItems = arr.toArray(items);
    }

    /* 追加したメソッドです */
    private GameItem createCube(float height, float cubeSize, float posX, float posY, float posZ) {
        // Create the Mesh
        float[] positions = new float[]{
            // VO
            -1 * cubeSize,  height,  cubeSize,
            // V1
            -1 * cubeSize, -1 * cubeSize,  cubeSize,
            // V2
            cubeSize, -1 * cubeSize,  cubeSize,
            // V3
            cubeSize,  height,  cubeSize,
            // V4
            -1 * cubeSize,  height, -1 * cubeSize,
            // V5
            cubeSize,  height, -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;
    }

実行結果です


色がみんな同じなのでわかりづらいですね(笑)

続きは次回

でわでわ。。。

関連ページ一覧

<今回のやっていること>

  1. Eclipse アプリ作成 Lv1〜家計簿を作る準備〜
  2. Eclipse アプリ作成 Lv2〜家計簿を作る土台作り〜
  3. Eclipse アプリ作成 Lv3〜3Dグラフ用Cube作り〜

<Java Basic>

  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 JUnit Eclipse LWJGL IntelliJ Discord OpenCV RPi ~記事一覧~

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 JUnit Eclipse LWJGL IntelliJ Discord OpenCV RPi ~記事一覧~

 

 

Eclipse アプリ作成 Lv2〜家計簿を作る土台作り〜

前提

LWJGLのセットアップが完了して、Eclipseのプロジェクトも作成済みであること。→前回をみてください。

インントロダクション

前回はプロジェクトをEclipse上に作成し、開発の準備をしました。

重要なことなので今一度、以下を確認してください。

  1. 作成した、プログラム「Hello World」が動くことを確認 → 前回
  2. LWJGLに必要なライブラリがBuildPathに繋がっていることを確認 → LWJGLのセットアップ


3Dグラフを作る

Chapter7-1で作成したCubeをベースに作成します。

初めにCubeを小さくします。変更するのは各頂点の位置を狭くします。

<DummyGame#init()>

        // Create the Mesh
        float[] positions = new float[]{
            // VO
            -0.1f,  0.1f,  0.1f,
            // V1
            -0.1f, -0.1f,  0.1f,
            // V2
             0.1f, -0.1f,  0.1f,
            // V3
             0.1f,  0.1f,  0.1f,
            // V4
            -0.1f,  0.1f, -0.1f,
            // V5
             0.1f,  0.1f, -0.1f,
            // V6
            -0.1f, -0.1f, -0.1f,
            // V7
             0.1f, -0.1f, -0.1f,
        };

上記のように「0.5f」の部分を「0.1f」に変更します。

それで表示できるのが下のようなイメージです。

これができたら、大きさを調節できるように各頂点を定義している部分をメソッドに切り出します。そして、サイズを指定できるように変数に変えます。

<DummyGame#createCube()>

    /* 追加したメソッドです */
    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;
    }

そして呼び出し部分を以下のように修正します。

<DummyGame#init()>

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

ここまできたら、現在3つ並んでいるCubeをカレンダーのように並べます。が今回はここまでにします。ロジックを考える時間が欲しいのです。。。

でわでわ。。。

関連ページ一覧

<開発ツールのインストール>

<プロジェクトの作成(はじめ方)>

<GitからのPULL方法>

<Javaの基本から応用など>

 

Java 3DGame LWJGL Retry Lv2 〜動かして理解する2〜

イントロダクション

LWJGLのGitBookを読み進めChapter8まできましたが、ここからよく解らなくなってしまいました。

原因は、3Dモデル描画(レンダリング)の部分をちゃんと理解していないためです。

なので、Chapter5-2からやり直します。

幸いにも、GitからPULLしてきたファイルがあるのでそいつをカスタムして理解していきます。

前回は、色の指定方法について解析ました。

今回は、形の変形に関してやります。

変形について

修正したJavaクラス一式に関してはGitにアップロードしてあります。PULLしたらChapter5というパッケージがありますのでそれが今回のソースになります。

元々のソース(GitBookにあるソースより少し修正しています)

<DummyGame#init()>いじって遊ぶ部分です。

 float[] positions = new float[]{
         // V0
         0.0f, 0.25f, 0.0f,
         // V1
         -0.0f, -0.0f, 0.0f,
         // V2
         0.5f, -0.0f, 0.0f,
         // V3
         0.5f, 0.25f, 0.0f,};

この状態での表示結果は下のように表示されます。

コメントにあるV0〜V3までのfloat型の値、3個で1セットになります。

V0「 0.0f, 0.25f, 0.0f,」

V1「-0.0f, -0.0f, 0.0f,」

V2「0.5f, -0.0f, 0.0f,」

V3「0.5f, 0.25f, 0.0f,」

こんな感じです。

<各点のイメージ>

2次元なので2次関数の理解があれば難しくはありません。

問題は3次元での位置

アップロードしたファイル(Git)のChapter7-1に移動します。

<DummyGame#init()>点(Vertexの「V」) が増えて8つになります。

元々のソースです。

        // Create the Mesh
        float[] positions = new float[]{
            // VO
            -0.5f,  0.5f,  0.5f,
            // V1
            -0.5f, -0.5f,  0.5f,
            // V2
             0.5f, -0.5f,  0.5f,
            // V3
             0.5f,  0.5f,  0.5f,
            // V4
            -0.5f,  0.5f, -0.5f,
            // V5
             0.5f,  0.5f, -0.5f,
            // V6
            -0.5f, -0.5f, -0.5f,
            // V7
             0.5f, -0.5f, -0.5f,
        };

ちょいといじってみました。元々はinit()の中でpositions, colours, indicesを設定していたのを変更して、positionsのみ変数で値を変更できるようjにしてみました。

   @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を作成するための座標(8点)を指定して、中点(0.0f, 0.0f, 0.0f0)を起点としたモデルを作成した後にsetPosition()でCubeを移動、setRotation()で傾きをつけてやることで、3Dモデルのようにみることができます。傾きを与えないと正方形にしか見えません。。。

作成したコードで遊んでみる

上のソース「 gameItems = new GameItem[] { createCube(0.1f, 0, 0, -2) }; 」

の行について、gameItemsにGameItemの配列を作成していますが、今回は1つだけ作成しているのであまり意味のないものになっています。がこれの意味をもたせます。

Cubeを3つに増やしてみます。コードを下のように修正します。

gameItems = new GameItem[] { createCube(0.1f, 0, 0, -2), createCube(0.1f, 1, 0, -2) };

名付けて「キューブ三兄弟」!

更に並べてみた。

gameItems = new GameItem[] { createCube(0.1f, 0, 0, -2), createCube(0.1f, 0.185f, 0.033f, -2.1f) , createCube(0.1f, 0.37f, 0.066f, -2.2f) };



お後がよろしいようで。

関連ページ一覧

<開発ツールのインストール>

Java Install Eclipse〜開発ツールのインストール〜

<プロジェクトの作成(はじめ方)>

Eclipse Meven 開発手順〜プロジェクトの作成〜

<GitからのPULL方法>

Eclipse Gitリポジトリの取得 〜GitからソースをPullしよう〜

<Javaの基本から応用など>

Mapping of Java Bassic JUnit Eclipse LWJGL IntelliJ Discord OpenCV RPi ~記事一覧~