Implementing Rotation of the camera by mouse input

This commit is contained in:
Sebastian 2023-08-24 15:19:32 +02:00
parent 7acf9fd703
commit 98b6208c74
2 changed files with 120 additions and 35 deletions

View File

@ -8,12 +8,14 @@ import core.engine.model.TexturedModel;
import core.engine.renderer.MasterRenderer; import core.engine.renderer.MasterRenderer;
import core.engine.terrain.Terrain; import core.engine.terrain.Terrain;
import core.engine.textures.ModelTexture; import core.engine.textures.ModelTexture;
import org.lwjgl.BufferUtils;
import org.lwjgl.Version; import org.lwjgl.Version;
import org.lwjgl.glfw.*; import org.lwjgl.glfw.*;
import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GL;
import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryStack;
import utils.vectors.Vector3f; import utils.vectors.Vector3f;
import java.nio.DoubleBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import static org.lwjgl.glfw.Callbacks.glfwFreeCallbacks; import static org.lwjgl.glfw.Callbacks.glfwFreeCallbacks;
@ -30,6 +32,10 @@ public class Engine {
private final Loader loader = new Loader(); private final Loader loader = new Loader();
public static int WINDOW_WIDTH = 1280; public static int WINDOW_WIDTH = 1280;
public static int WINDOW_HEIGHT = 720; public static int WINDOW_HEIGHT = 720;
private static boolean isMouseWheelPressed = false;
private static DoubleBuffer lastCursorX = BufferUtils.createDoubleBuffer(1);
private static DoubleBuffer lastCursorY = BufferUtils.createDoubleBuffer(1);
public Engine() { public Engine() {
@ -112,41 +118,7 @@ public class Engine {
glClearColor(1.0f, 0.0f, 0.0f, 0.0f); glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
Camera camera = new Camera(); Camera camera = new Camera();
GLFWScrollCallback glfwScrollCallback = new GLFWScrollCallback() { input(camera);
@Override
public void invoke(long window, double xOffset, double yOffset) {
if(yOffset > 0) {
camera.zoomIn();
} else if(yOffset < 0) {
camera.zoomOut();
}
}
};
glfwSetScrollCallback(window, glfwScrollCallback);
glfwSetKeyCallback(window, glfwKeyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
if(key == GLFW_KEY_A) {
//move camera to left
camera.moveLeft();
}
if(key == GLFW_KEY_D) {
//move camera to right
camera.moveRight();
}
if(key == GLFW_KEY_W) {
camera.moveForward();
}
if(key == GLFW_KEY_S) {
camera.moveBackward();
}
}
});
Light light = new Light(new Vector3f(0,0,-20), new Vector3f(1,1,1)); Light light = new Light(new Vector3f(0,0,-20), new Vector3f(1,1,1));
RawModel model = OBJLoader.loadOBJModel("dragon", loader); RawModel model = OBJLoader.loadOBJModel("dragon", loader);
@ -177,4 +149,89 @@ public class Engine {
loader.cleanUp(); loader.cleanUp();
} }
private void input(Camera camera) {
GLFWScrollCallback glfwScrollCallback = new GLFWScrollCallback() {
@Override
public void invoke(long window, double xOffset, double yOffset) {
if(yOffset > 0) {
camera.zoomIn();
} else if(yOffset < 0) {
camera.zoomOut();
}
}
};
GLFWMouseButtonCallback glfwMouseButtonCallback = new GLFWMouseButtonCallback() {
@Override
public void invoke(long window, int button, int action, int mods) {
if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE && action == GLFW.GLFW_PRESS) {
// Middle mouse button pressed
isMouseWheelPressed = true;
glfwGetCursorPos(window, lastCursorX, lastCursorY);
} else if (button == GLFW.GLFW_MOUSE_BUTTON_MIDDLE && action == GLFW.GLFW_RELEASE) {
// Middle mouse button released
isMouseWheelPressed = false;
}
}
};
// Define the cursor position callback function
GLFWCursorPosCallback cursorPosCallback = new GLFWCursorPosCallback() {
@Override
public void invoke(long window, double xpos, double ypos) {
if (isMouseWheelPressed) {
// Calculate the offset
double xOffset = xpos - lastCursorX.get(0);
double yOffset = ypos - lastCursorY.get(0);
// Use xOffset and yOffset for your desired functionality
if(yOffset > 0) {
camera.decreasePitch();
} else if(yOffset < 0) {
camera.increasePitch();
}
if(xOffset > 0) {
camera.decreaseYaw();
} else if(xOffset < 0) {
camera.increaseYaw();
}
// Update the last cursor position
lastCursorX.put(0, xpos);
lastCursorY.put(0, ypos);
}
}
};
glfwSetMouseButtonCallback(window, glfwMouseButtonCallback);
glfwSetCursorPosCallback(window, cursorPosCallback);
glfwSetScrollCallback(window, glfwScrollCallback);
glfwSetKeyCallback(window, glfwKeyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
if(key == GLFW_KEY_A) {
//move camera to left
camera.moveLeft();
}
if(key == GLFW_KEY_D) {
//move camera to right
camera.moveRight();
}
if(key == GLFW_KEY_W) {
camera.moveForward();
}
if(key == GLFW_KEY_S) {
camera.moveBackward();
}
}
});
}
} }

View File

@ -33,6 +33,22 @@ public class Camera {
position.y -= 0.5f; position.y -= 0.5f;
} }
public void increasePitch() {
this.pitch += .5f;
}
public void decreasePitch() {
this.pitch -= .5f;
}
public void increaseYaw() {
this.yaw += 0.5f;
}
public void decreaseYaw() {
this.yaw -= 0.5f;
}
public Vector3f getPosition() { public Vector3f getPosition() {
return position; return position;
} }
@ -48,4 +64,16 @@ public class Camera {
public float getRoll() { public float getRoll() {
return roll; return roll;
} }
public void setPitch(float pitch) {
this.pitch += pitch;
}
public void setYaw(float yaw) {
this.yaw += yaw;
}
public void setRoll(float roll) {
this.roll += roll;
}
} }