イントロダクション
LWJGL GitBookのChapterを写経しながら理解していきます。Git(ソース)はこちら。。。
Introduction
LWJGL We will understand GitBook ‘s chapter while shooting. Git (source) is here. . . Last time I did Chapter6 so We will do Chapter 6 this time. Let’s get sarted!.
https://ahbejarano.gitbook.io/lwjglgamedev/chapter7
コードを読む(Read Code)
今までに見て来た部分は割愛します。
- Chapter1[外枠の表示のみ]
- Chapter2-1〜クラスの構成〜
- Chapter2-2〜インターフェースの使い方と詳細〜
- Chapter2-3〜GameEngineクラス(サンプルクラス)〜/li>
- Chapter2-4〜Windowクラス(サンプルクラス)〜
- Chapter3〜描画処理を読む〜
- Chapter4〜シェーダについて〜
- Chapter5-1〜レンダリングについて〜
- Chapter5-2〜レンダリング詳細〜
- Chapter6〜Projection(投影)〜
今回はいきなりコードから入ります。
Chapter6と違う部分は以下のクラスです。
- DummyGame.java
- Renderer.java
今回は3Dモデル(立方体)を作るみたいです。
プログラムの起動結果はこちら(ツイートで失礼)
LWJGL(3DJavaGameフレームワーク)のサンプル写経しただけ、だけどなんか嬉しい
参照サイトhttps://t.co/UJHCGN0QpE
ソースコードhttps://t.co/U4aDVNwlYy
動いたもの pic.twitter.com/C4re8k00fe— たくのじ (@java_takunoji) October 29, 2018
上記であげた違いの部分=このChapterで追加した部分を見て行きます。
上の様に比較するとわかりやすいです。ソースを選択して(2つ)→右クリック→CompareWith(比較)→EachOther(相互)で見れます。(Eclipse)
下の様な図にある点(Vertex: V0〜V7)をを定義している様です。
[DummyGame#init()]
public void init(Window window) throws Exception { renderer.init(window); // 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, }; 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(0, 0, -2); gameItems = new GameItem[] { gameItem }; }
正直のところ色(colour)に関してはよくわかっていません。。。がポジション(positions)と順番(indices)に関しては理解できたと思っています。紙と鉛筆が必要ですが。。。。
①コメントにある通りpositionsでV0〜V7までの頂点の座標を定義(中央が0.0)して7つ定義しています。
②色はよくわかっていません。。。
③各面(四角形)分の点の順番を定義して行きます。「V0, V1, V3」で1つの三角形「V3, V1, V2」で1つの三角形 = 四角形(Front face)になります。
あとは入力のハンドリング
@Override public void input(Window window) { displyInc = 0; displxInc = 0; displzInc = 0; scaleInc = 0; if (window.isKeyPressed(GLFW_KEY_UP)) { displyInc = 1; } else if (window.isKeyPressed(GLFW_KEY_DOWN)) { displyInc = -1; } else if (window.isKeyPressed(GLFW_KEY_LEFT)) { displxInc = -1; } else if (window.isKeyPressed(GLFW_KEY_RIGHT)) { displxInc = 1; } else if (window.isKeyPressed(GLFW_KEY_A)) { displzInc = -1; } else if (window.isKeyPressed(GLFW_KEY_Q)) { displzInc = 1; } else if (window.isKeyPressed(GLFW_KEY_Z)) { scaleInc = -1; } else if (window.isKeyPressed(GLFW_KEY_X)) { scaleInc = 1; } }
コードから察するに十字キーと「A」「Q」「Z」「X」ボタンで動かせる様です。
細かいところは今までのChapterで見て来たので割愛しますが、大雑把に次の様な順で動きます。
- Main#main(): DummyGame(IGameLogic)とGameEngineをインスタンス化
- GameEngineを別スレッドで起動
- WindowとTimerをインスタンス化
- スレッド開始(GameEngine.start())
- GameEngineのinitとgameLoopを起動する
こんな感じです。
前回は、面を作るだけだったのですが単純に頂点の数と順序の数を追加しただけの様に見えます。
ポイント
- 3Dモデルの描画では、平面の時より頂点数が増えるだけ
- 無限ループの中で入力があった時に画面を更新(updateは常に行なっている)
- Windowクラスの「vSync」がきになるが値を変更している処理はない。。。
疑問点
これで、単純な3Dモデル(立方体、四角錐)は作成できる様になったけど、球体はどの様にやるのだろうか?