Проблема, с которой я столкнулся, началась, когда я создал камеру от третьего лица в своем проекте.Я использовал LWJGL 2 без проблем, поэтому я пошел по тому же пути с LWJGL 3 и скорректировал изменения между версиями.Проблемы, с которыми я сталкиваюсь:
- При вращении вокруг моего объекта вращение прерывистое и происходит очень быстро.Я должен перетащить мышь за экран, чтобы повернуть в обратном направлении.
- При вращении моя модель не видна из камеры (однако модель по-прежнему находится в центральной точке, вокруг которой она вращается).
- Когда я увеличиваю или уменьшаю масштаб, он непрерывно увеличивается.без остановки.(уверен, что сам смогу решить эту проблему с помощью нескольких твиков).
Я думаю, что некоторые из этих проблем связаны с различиями в версиях.в качестве примера, в LWJGL 2 я бы использовал Mouse.getDWheel ();Однако для LWJGL 3 я использовал GLFW scrollCallback для получения значения Y-прокрутки.Я заметил, что при прокрутке вверх он возвращает 1.0-5.0 (он может пойти выше, но 5 - самый высокий показатель, который я видел), а отрицательные значения - вниз.
Ниже приведен класс моей камеры:
package entities;
import org.joml.Vector3f;
import org.lwjgl.glfw.GLFW;
import input.Input;
public class Camera {
private float distanceFromPlayer = 50;
private float angleAroundPlayer = 0;
private Vector3f position = new Vector3f(0,0,0);
private float pitch = 20;
private float yaw;
private float roll;
private Player player;
public Camera(Player player) {
this.player = player;
}
public void move(Input input) {
calculateZoom(input);
calculatePitch(input);
calculateAngleAroundPlayer(input);
float horizontalDistance = calculateHorizontalDistance();
float verticalDistance = calculateVerticalDistance();
calculateCameraPosition(horizontalDistance, verticalDistance);
}
public Vector3f getPosition() {
return position;
}
public float getPitch() {
return pitch;
}
public float getYaw() {
return yaw;
}
public float getRoll() {
return roll;
}
private void calculateCameraPosition(float horizDistance, float verticDistance) {
float theta = player.getRotY() + angleAroundPlayer;
float offsetX = (float) (horizDistance * Math.sin(Math.toRadians(theta)));
float offsetZ = (float) (horizDistance * Math.cos(Math.toRadians(theta)));
position.x = player.getPosition().x - offsetX;
position.z = player.getPosition().z - offsetZ;
position.y = player.getPosition().y + verticDistance;
this.yaw = 180 - (player.getRotY() + angleAroundPlayer);
}
private float calculateHorizontalDistance() {
return (float) (distanceFromPlayer * Math.cos(Math.toRadians(pitch)));
}
private float calculateVerticalDistance() {
return (float) (distanceFromPlayer * Math.sin(Math.toRadians(pitch)));
}
private void calculateZoom(Input input) {
float zoomLevel = input.getMouseWheelVelocity() * 0.1f;
distanceFromPlayer -= zoomLevel;
}
private void calculatePitch(Input input) {
if(input.isMouseDown(GLFW.GLFW_MOUSE_BUTTON_1)) {
//possible issue
float pitchChange = (float) (input.getMouseY() * 0.01f);
pitch -= pitchChange;
}
}
private void calculateAngleAroundPlayer(Input input) {
if(input.isMouseDown(GLFW.GLFW_MOUSE_BUTTON_2)) {
float angleChange = (float) (input.getMouseX() * 0.01f);
angleAroundPlayer -= angleChange;
}
}
}
Это мой класс ввода, где я получаю скорость вращения моего мыши:
package input;
import java.nio.DoubleBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.opengl.GL11;
import renderEngine.Window;
public class Input {
private long window;
private boolean[] keys = new boolean[GLFW.GLFW_KEY_LAST];
private boolean[] mouseButtons = new boolean[GLFW.GLFW_MOUSE_BUTTON_LAST];
private float mouseWheelVelocity = 0;
public Input(Window win) {
super();
this.window = win.getID();
}
public void init() {
GLFW.glfwSetScrollCallback(window, (long win, double dx, double dy) -> {
System.out.println(dy);
setMouseWheelVelocity((float) dy);
});
}
public boolean isKeyDown(int keyCode) {
return GLFW.glfwGetKey(window, keyCode) == 1;
}
public boolean isMouseDown(int mouseButton) {
return GLFW.glfwGetMouseButton(window, mouseButton) == 1;
}
public boolean isKeyPressed(int keyCode) {
return isKeyDown(keyCode) && !keys[keyCode];
}
public boolean isKeyReleased(int keyCode) {
return !isKeyDown(keyCode) && keys[keyCode];
}
public boolean isMousePressed(int mouseButton) {
return isMouseDown(mouseButton) && !mouseButtons[mouseButton];
}
public boolean isMouseReleased(int mouseButton) {
return !isMouseDown(mouseButton) && mouseButtons[mouseButton];
}
public double getMouseX() {
DoubleBuffer buffer = BufferUtils.createDoubleBuffer(1);
GLFW.glfwGetCursorPos(window, buffer, null);
return buffer.get(0);
}
public double getMouseY() {
DoubleBuffer buffer = BufferUtils.createDoubleBuffer(1);
GLFW.glfwGetCursorPos(window, null, buffer);
return buffer.get(0);
}
public float getMouseWheelVelocity() {
return mouseWheelVelocity;
}
public void setMouseWheelVelocity(float mouseWheelVelocity) {
this.mouseWheelVelocity = mouseWheelVelocity;
}
public void updateInput() {
for (int i = 0; i < GLFW.GLFW_KEY_LAST; i++) {
keys[i] = isKeyDown(i);
}
for (int i = 0; i < GLFW.GLFW_MOUSE_BUTTON_LAST; i++) {
mouseButtons[i] = isMouseDown(i);
}
}
public void currentKeyBind() {
if(isKeyPressed(GLFW.GLFW_KEY_Q)) {
GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
}
if(isKeyReleased(GLFW.GLFW_KEY_Q)) {
GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
}
}
}
Просто некоторые данные о том, что может быть не так, и направление, в котором я должен идти, чтобы исправить это, будетотличный.Я посмотрел учебники и документацию для glfw и LWJGL, чтобы найти ответы, я не могу найти их без полной перестройки большей части моего проекта.