LWJGL 3 Проблемы с камерой - PullRequest
0 голосов
/ 19 ноября 2018

Проблема, с которой я столкнулся, началась, когда я создал камеру от третьего лица в своем проекте.Я использовал LWJGL 2 без проблем, поэтому я пошел по тому же пути с LWJGL 3 и скорректировал изменения между версиями.Проблемы, с которыми я сталкиваюсь:

  1. При вращении вокруг моего объекта вращение прерывистое и происходит очень быстро.Я должен перетащить мышь за экран, чтобы повернуть в обратном направлении.
  2. При вращении моя модель не видна из камеры (однако модель по-прежнему находится в центральной точке, вокруг которой она вращается).
  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, чтобы найти ответы, я не могу найти их без полной перестройки большей части моего проекта.

...