Java 3DGame LWJGL GitBook chapter6〜Projection(投影)〜

イントロダクション

LWJGL GitBookChapterを写経しながら理解していきます。Git(ソース)はこちら。。。

前回は、Chapter5-2をやりました。

Introduction

LWJGL We will understand GitBook ‘s chapter while shooting. Git (source) is here. . . Last time I did Chapter 5-2so We will do Chapter 6 this time. Let’s get sarted!.

https://ahbejarano.gitbook.io/lwjglgamedev/chapter6

コードを読む(Read Code)

今までに見て来た部分は割愛します。

  1.  Chapter1[外枠の表示のみ]
  2. Chapter2-1〜クラスの構成〜
  3. Chapter2-2〜インターフェースの使い方と詳細〜
  4. Chapter2-3〜GameEngineクラス(サンプルクラス)〜/li>
  5. Chapter2-4〜Windowクラス(サンプルクラス)〜
  6. Chapter3〜描画処理を読む〜
  7. Chapter4〜シェーダについて〜
  8. Chapter5-1〜レンダリングについて〜
  9. Chapter5-2〜レンダリング詳細〜

今回は、いきなりコードではなくドキュメントから読んでいきます。ちょっと難しくなって来ました。

今までと同様に、プロジェクトのコードを起動します。

スクリーンショット 2018-10-28 13.46.42.png

こんな色の四角を描画します(プログラムが)。この描画はChapter5-2でやりました。

次です。

このチャプターの目玉機能「Transformation」です。どうやら以下の様なイメージで動かすことの様です。

そして、上の様な操作を行うためのクラスを作成します。その名も

Transformationクラス

package zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter6.engine.graph;

import org.joml.Matrix4f;
import org.joml.Vector3f;

public class Transformation {
	private final Matrix4f projectionMatrix;
	private final Matrix4f worldMatrix;

	public Transformation() {
		projectionMatrix = new Matrix4f();
		worldMatrix = new Matrix4f();
	}

	public final Matrix4f getProjectionMatrix(float fov, float wid, float hei, float zNear, float zFar) {
		float aspectRatio = wid / hei;
		projectionMatrix.identity();
		projectionMatrix.perspective(fov, aspectRatio, zNear, zFar);
		return projectionMatrix;
	}

	public Matrix4f getWorldMatrix(Vector3f offset, Vector3f rotation, float scale) {
		worldMatrix.identity().translate(offset)
			.rotateX((float) Math.toRadians(rotation.x))
			.rotateY((float) Math.toRadians(rotation.y))
			.rotateZ((float) Math.toRadians(rotation.z))
			.scale(scale);
		return worldMatrix;
	}
}

写経して見て「ああ、なるほど」と思うことは各クラスの繋がりとか役割に関して頭の中でイメージが描けることです。メソッドとか気がついたら覚えているしね(笑)。

結果

スクリーンショット 2018-10-28 21.42.59.png

初めの表示とかわりませんでした。。。

けど、追加で作成したTrasformationクラスを使用してprojectionMatrix, worldMatrixの使い方が少しわかった様な気がします。ShaderProgramに関しても少しずつわかって来た様な気がします。

今回の実装では。GameItemを追加してから表示するためのデータセットのコードが参照したページにはありませんでしたので、自分で考えて実装しました。

DummyGame#init()に処理を追加してやりました。
結局のところ、画面の描画部分には何も変化がなかったのですが、3Dモデルを作成してからモデルを回転したりするときに使用するロジックの様です。でわまた次回。。。