Итак, я пытаюсь сделать игру с 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;
}