OpenGL / LWJGL, как удерживать объект в центре экрана при перемещении камеры - PullRequest
0 голосов
/ 13 января 2020

Итак, я пытаюсь сделать игру с LWJGL 3 в Java. И я хочу всегда держать объект Player в центре экрана при перемещении камеры.

Но у меня возникают проблемы с этим.

Я пытался просто установить положение камеры на положение игрока, но это не очень хорошо работает. Он может перемещать плеер, когда камера движется, однако он не двигается достаточно, чтобы держать игрока в центре.

Это мой код:

public class Player extends Texture {

Camera camera;

public Player(Vector3f position, Vector3f rotation, Camera camera) {
    super("/resources/textures/entities/Player.png", position, rotation, new Vector3f(0.1f, 0.2f, 0.1f));
    this.camera = camera;
}

public void update() {
    Vector3f camPos = camera.getPosition();
    // set x and y from camera to player
    this.getGameObject().getPosition().x = camPos.x;
    this.getGameObject().getPosition().y = camPos.y;
    }
}

Мой метод обновления камеры выглядит как это:

public void update() {
    if (Input.isKeyDown(GLFW.GLFW_KEY_A)) {
        this.position.x -= movementSpeed * Engine.delta;
    }
    if (Input.isKeyDown(GLFW.GLFW_KEY_D)) {
        this.position.x += movementSpeed * Engine.delta;
    }
    if (Input.isKeyDown(GLFW.GLFW_KEY_W)) {
        this.position.y += movementSpeed * Engine.delta;
    }
    if (Input.isKeyDown(GLFW.GLFW_KEY_S)) {
        this.position.y -= movementSpeed * Engine.delta;
    }

    if (Input.isScrollingUp()) {
        this.position.z -= movementSpeed * ZOOM_MULTIPLIER * Engine.delta;
        if (this.position.z < MIN_Z) {
            this.position.z = MIN_Z;
        }
    }
    if (Input.isScrollingDown()) {
        this.position.z += movementSpeed * ZOOM_MULTIPLIER * Engine.delta;
        if (this.position.z > MAX_Z) {
            this.position.z = MAX_Z;
        }
    }
}

Я не думаю, что что-то не так с методом обновления камеры, но если это поможет ?.

Так что да, я попробовал немного больше, но это работало еще хуже пожалуйста, помогите мне, я не могу найти решение.

Редактировать:

Вот мой код для рендерера. У меня, однако, есть только смутное представление о том, как это работает, потому что я написал этот учебник , где эта часть не объяснялась, что хорошо. Исходный код для класса Matrixf4: здесь от обучающего:

public void renderObject(GameObject object, Camera camera) {
    GL30.glBindVertexArray(object.getMesh().getVAO());
    GL30.glEnableVertexAttribArray(0);
    GL30.glEnableVertexAttribArray(1);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, object.getMesh().getIBO());
    GL13.glActiveTexture(GL13.GL_TEXTURE0);
    GL13.glBindTexture(GL11.GL_TEXTURE_2D, object.getMesh().getMaterial().getTextureID());
    shader.bind();
    shader.setUniform("model", Matrix4f.transform(object.getPosition(), object.getRotation(), object.getScale()));
    shader.setUniform("view", Matrix4f.view(camera.getPosition(), camera.getRotation()));
    shader.setUniform("projection", window.getProjection());
    GL11.glDrawElements(GL11.GL_TRIANGLES, object.getMesh().getIndices().length, GL11.GL_UNSIGNED_INT, 0);
    shader.unbind();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL30.glDisableVertexAttribArray(0);
    GL30.glDisableVertexAttribArray(1);
    GL30.glBindVertexArray(0);
}

window.getProjection () просто возвращает это:

Matrix4f.projection(70.0f, (float)width / (float) height, 0.01f, 5000.0f);

Первый значение - это fov, второе - это соотношение сторон, а последние два - насколько близко и далеко может быть что-то, пока оно больше не будет визуализировано.

Редактировать 2:

Что я думаю важна переменная масштаба, потому что она масштабирует весь Me sh, чтобы он не охватывал весь экран.

Edit 3:

Обнаружил, что проблема была в масштабе.

Мне просто нужно было разделить положение камеры по шкале в классе Player:

public void update() {
    Vector3f camPos = camera.getPosition();
    this.getGameObject().getPosition().x = camPos.x / this.getGameObject().getScale().x;
    this.getGameObject().getPosition().y = camPos.y / this.getGameObject().getScale().y;
}
...