View Matrix / Camera implemented

This commit is contained in:
firefighter198
2021-09-13 15:09:57 +02:00
parent d1340520d4
commit 98b2633d6d
7 changed files with 179 additions and 22 deletions
@@ -8,9 +8,10 @@ out vec2 passUvs;
uniform mat4 transformationMatrix; uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix; uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
void main(void) void main(void)
{ {
gl_Position = projectionMatrix * transformationMatrix * vec4(position.x, position.y, position.z, 1.0); gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position.x, position.y, position.z, 1.0);
passUvs = uvs; passUvs = uvs;
} }
+99 -17
View File
@@ -1,15 +1,17 @@
package EngineTest; package EngineTest;
import Entity.Entity; import Entity.*;
import RenderEngine.DisplayManager; import RenderEngine.DisplayManager;
import RenderEngine.Loader; import RenderEngine.Loader;
import Models.RawModel; import Models.RawModel;
import RenderEngine.Renderer; import RenderEngine.Renderer;
import Shaders.StaticShader; import Shaders.StaticShader;
import Models.TexturedModel; import Models.TexturedModel;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display; import org.lwjgl.opengl.Display;
import Textures.ModelTexture; import Textures.ModelTexture;
import org.lwjgl.util.vector.Vector3f; import org.lwjgl.util.vector.Vector3f;
import sun.awt.AWTAccessor;
public class MainGameLoop public class MainGameLoop
{ {
@@ -26,24 +28,83 @@ public class MainGameLoop
StaticShader shader = new StaticShader(); StaticShader shader = new StaticShader();
Renderer renderer = new Renderer(shader); Renderer renderer = new Renderer(shader);
float[] vertices = float[] vertices = {
{ -0.5f,0.5f,-0.5f,
-.5f, .5f, 0, -0.5f,-0.5f,-0.5f,
-.5f, -.5f, 0, 0.5f,-0.5f,-0.5f,
.5f, -.5f, 0, 0.5f,0.5f,-0.5f,
.5f, .5f, 0
-0.5f,0.5f,0.5f,
-0.5f,-0.5f,0.5f,
0.5f,-0.5f,0.5f,
0.5f,0.5f,0.5f,
0.5f,0.5f,-0.5f,
0.5f,-0.5f,-0.5f,
0.5f,-0.5f,0.5f,
0.5f,0.5f,0.5f,
-0.5f,0.5f,-0.5f,
-0.5f,-0.5f,-0.5f,
-0.5f,-0.5f,0.5f,
-0.5f,0.5f,0.5f,
-0.5f,0.5f,0.5f,
-0.5f,0.5f,-0.5f,
0.5f,0.5f,-0.5f,
0.5f,0.5f,0.5f,
-0.5f,-0.5f,0.5f,
-0.5f,-0.5f,-0.5f,
0.5f,-0.5f,-0.5f,
0.5f,-0.5f,0.5f
}; };
int[] indices =
{ float[] uvs = {
0, 1, 3,
3, 1, 2, 0,0,
0,1,
1,1,
1,0,
0,0,
0,1,
1,1,
1,0,
0,0,
0,1,
1,1,
1,0,
0,0,
0,1,
1,1,
1,0,
0,0,
0,1,
1,1,
1,0,
0,0,
0,1,
1,1,
1,0
}; };
float[] uvs =
{ int[] indices = {
0, 0, 0,1,3,
0, 1, 3,1,2,
1, 1, 4,5,7,
1, 0 7,5,6,
8,9,11,
11,9,10,
12,13,15,
15,13,14,
16,17,19,
19,17,18,
20,21,23,
23,21,22
}; };
RawModel model = loader.loadToVAO(vertices, indices, uvs); RawModel model = loader.loadToVAO(vertices, indices, uvs);
@@ -51,10 +112,31 @@ public class MainGameLoop
TexturedModel texturedModel = new TexturedModel(model, texture); TexturedModel texturedModel = new TexturedModel(model, texture);
Entity entity = new Entity(texturedModel, new Vector3f(0, 0, -5), 0, 0, 0, 1); Entity entity = new Entity(texturedModel, new Vector3f(0, 0, -5), 0, 0, 0, 1);
Camera camera = new Camera();
while(!Display.isCloseRequested()) while(!Display.isCloseRequested())
{ {
if(Keyboard.isKeyDown(Keyboard.KEY_W))
{
camera.translate(0, 0, -.02f);
}
if(Keyboard.isKeyDown(Keyboard.KEY_S))
{
camera.translate(0, 0, .02f);
}
if(Keyboard.isKeyDown(Keyboard.KEY_D))
{
camera.translate(.02f, 0, 0);
}
if(Keyboard.isKeyDown(Keyboard.KEY_A))
{
camera.translate(-.02f, 0, 0);
}
entity.rotate(.5f, .5f, .5f);
renderer.prepare(0, 0, 0); renderer.prepare(0, 0, 0);
shader.start(); shader.start();
shader.loadViewMatrix(camera);
renderer.render(entity, shader); renderer.render(entity, shader);
shader.stop(); shader.stop();
DisplayManager.updateDisplay(); DisplayManager.updateDisplay();
+48
View File
@@ -0,0 +1,48 @@
package Entity;
import org.lwjgl.util.vector.Vector3f;
public class Camera
{
private Vector3f position = new Vector3f(0, 0, 0);
private float rotX, rotY, rotZ;
public Camera()
{
}
public void translate(Vector3f value)
{
position.x += value.x;
position.y += value.y;
position.z += value.z;
}
public void translate(float x, float y, float z)
{
position.x += x;
position.y += y;
position.z += z;
}
public Vector3f getPosition()
{
return position;
}
public float getRotX()
{
return rotX;
}
public float getRotY()
{
return rotY;
}
public float getRotZ()
{
return rotZ;
}
}
+2
View File
@@ -26,8 +26,10 @@ public class Renderer
public void prepare(float r, float g, float b) public void prepare(float r, float g, float b)
{ {
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glClearColor(r, g, b, 1); GL11.glClearColor(r, g, b, 1);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
} }
public void render(Entity entity, StaticShader shader) public void render(Entity entity, StaticShader shader)
+10
View File
@@ -1,5 +1,7 @@
package Shaders; package Shaders;
import Entity.Camera;
import Tools.Maths;
import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Matrix4f;
public class StaticShader extends ShaderProgram public class StaticShader extends ShaderProgram
@@ -7,6 +9,7 @@ public class StaticShader extends ShaderProgram
private static final String vertexFile = "src/shaders/vertexShader.glsl", fragmentFile = "src/shaders/fragmentShader.glsl"; private static final String vertexFile = "src/shaders/vertexShader.glsl", fragmentFile = "src/shaders/fragmentShader.glsl";
private int locationTransform; private int locationTransform;
private int locationProjection; private int locationProjection;
private int locationView;
public StaticShader() public StaticShader()
{ {
@@ -18,6 +21,7 @@ public class StaticShader extends ShaderProgram
{ {
locationTransform = getUniformLocation("transformationMatrix"); locationTransform = getUniformLocation("transformationMatrix");
locationProjection = getUniformLocation("projectionMatrix"); locationProjection = getUniformLocation("projectionMatrix");
locationView = getUniformLocation("viewMatrix");
} }
@Override @Override
@@ -32,6 +36,12 @@ public class StaticShader extends ShaderProgram
loadMatrix(locationTransform, matrix); loadMatrix(locationTransform, matrix);
} }
public void loadViewMatrix(Camera camera)
{
Matrix4f matrix = Maths.createViewMatrix(camera);
loadMatrix(locationView, matrix);
}
public void loadProjectionMatrix(Matrix4f matrix) public void loadProjectionMatrix(Matrix4f matrix)
{ {
loadMatrix(locationProjection, matrix); loadMatrix(locationProjection, matrix);
+2 -1
View File
@@ -8,9 +8,10 @@ out vec2 passUvs;
uniform mat4 transformationMatrix; uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix; uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
void main(void) void main(void)
{ {
gl_Position = projectionMatrix * transformationMatrix * vec4(position.x, position.y, position.z, 1.0); gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position.x, position.y, position.z, 1.0);
passUvs = uvs; passUvs = uvs;
} }
+13
View File
@@ -1,5 +1,6 @@
package Tools; package Tools;
import Entity.Camera;
import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f; import org.lwjgl.util.vector.Vector3f;
@@ -16,4 +17,16 @@ public class Maths
Matrix4f.scale(new Vector3f(scale, scale, scale), matrix, matrix); Matrix4f.scale(new Vector3f(scale, scale, scale), matrix, matrix);
return matrix; return matrix;
} }
public static Matrix4f createViewMatrix(Camera camera)
{
Matrix4f viewMatrix = new Matrix4f();
viewMatrix.setIdentity();
Matrix4f.rotate((float) Math.toRadians(camera.getRotX()), new Vector3f(1, 0, 0), viewMatrix, viewMatrix);
Matrix4f.rotate((float) Math.toRadians(camera.getRotY()), new Vector3f(0, 1, 0), viewMatrix, viewMatrix);
Vector3f cameraPos = camera.getPosition();
Vector3f negativeCameraPos = new Vector3f(-cameraPos.x, -cameraPos.y, -cameraPos.z);
Matrix4f.translate(negativeCameraPos, viewMatrix, viewMatrix);
return viewMatrix;
}
} }