Как мне повернуть камеру вокруг объекта? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытался изучить OpenGL, LWJGL с нуля. В настоящее время у меня есть демонстрационная версия камеры, смотрящей на мир, сделанный из травы, в центре которого я изменил текстуру на булыжник, чтобы она выделялась. Я пытаюсь реализовать функцию в своем классе камеры, которая позволит мне просто пропустить угол и повернуть его вокруг точки.

У моего рендерера есть 3 матричных преобразования, одно для перевода объекта в мир. пробел, другое - это трансформация перспективы, и последнее - это трансформация моего вида, которая представляет собой камеру.

Я установил камеру на x: 3, y: 3, z: 3, шаг: 45deg, yaw : 45 градусов, чтобы получить изометрию c взгляда на мир.

Но что бы я ни пытался, я не могу понять, как повернуть камеру вокруг положения в мировом пространстве?

Класс камеры

import org.joml.Vector3f;

public class Camera {
    private Vector3f position;
    private float pitch;
    private float yaw;
    private float roll;

    public Camera(Vector3f position, float pitch, float yaw, float roll) {
        this.position = position;
        this.pitch = pitch;
        this.yaw = yaw;
        this.roll = roll;
    }


    public Vector3f getPosition() {
        return position;
    }

    public float getPitch() {
        return pitch;
    }

    public float getYaw() {
        return yaw;
    }

    public float getRoll() {
        return roll;
    }
}

Функция, которую я использую для создания матрицы вида

public static Matrix4f createViewMatrix(Camera camera){
        Matrix4f viewMatrix = new Matrix4f();
        viewMatrix.rotate((float) Math.toRadians(camera.getPitch()), new Vector3f(1,0,0));
        viewMatrix.rotate((float) Math.toRadians(camera.getYaw()), new Vector3f(0,1,0));
        Vector3f cameraPos = camera.getPosition();
        Vector3f negativeCameraPos = new Vector3f(-cameraPos.x, -cameraPos.y, -cameraPos.z);
        viewMatrix.translate(negativeCameraPos);
        return viewMatrix;
}

код вершинного шейдера

#version 400 core

in vec3 position;
in vec2 textureCoords;

out vec2 pass_textureCoords;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;

void main(void){
    gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position, 1.0);
    pass_textureCoords = textureCoords;
}

Так устроена моя камера

camera = new Camera(new Vector3f(-3, 3, 3), 45, 45, 0);

Вот как это выглядит в данный момент при визуализации:

img

...