イントロダクション
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) };
お後がよろしいようで。
関連ページ一覧
<開発ツールのインストール>
<プロジェクトの作成(はじめ方)>
<GitからのPULL方法>
<Javaの基本から応用など>
Mapping of Java Bassic JUnit Eclipse LWJGL IntelliJ Discord OpenCV RPi ~記事一覧~