Получение вектора вперед от поворота и положения - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть класс камеры, у него есть вращение и положение, а также метод для генерации матрицы вида из положения и поворота, и т. Д. В кадре камера отправляет матрицу вида в средство визуализации.(то же самое для матрицы проекции, но это не сильно изменится).

class Renderer;
class Camera
{
    Renderer& m_renderer;
    glm::mat4 GetViewMatrix();
public:
    glm::vec3 position;
    glm::vec3 rotation;
    float Fov;

    Camera(Renderer& renderer,float Fov, int width , int height);
    void MoveCamera(glm::vec3 direction);
    void RotateCamera(glm::vec3 direction);
    void Update();
};

, что я хочу сделать, это позвонить «MoveCamera»:

void Camera::MoveCamera(glm::vec3 direction)
{
    this->position += direction;
}

с forwardDirection*deltaTime*speed от моегоосновной циклМоя проблема заключается в создании вектора направления вперед из моего поворота и положения.Вращение - это вектор3 со степенями, которые используются для создания матрицы вида, подобной этой:

glm::mat4 Camera::GetViewMatrix()
{
    glm::mat4 matRoll = glm::mat4(1.0f);
    glm::mat4 matPitch = glm::mat4(1.0f);
    glm::mat4 matYaw = glm::mat4(1.0f);
    matRoll = glm::rotate(matRoll,glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));
    matPitch = glm::rotate(matPitch, glm::radians(rotation.x), glm::vec3(0.0f, 1.0f, 0.0f));
    matYaw = glm::rotate(matYaw, glm::radians(rotation.y), glm::vec3(1.0f, 0.0f, 0.0f));
    glm::mat4 rotate = matRoll * matPitch * matYaw;
    glm::mat4 translate = glm::mat4(1.0f);
    translate = glm::translate(translate ,-position);
    return   rotate*translate ;
}

Итак, как мне в этом случае сделать прямой вектор из моей позиции и поворота?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете извлечь ее из матрицы вида камеры.

Получив матрицу преобразования камеры в мировом пространстве, вы можете инвертировать ее, чтобы получить матрицу вида

* 1006.* Вы используете glm, который использует матрицы столбцов , так что вы можете просто взять второй столбец инвертированной матрицы и нормализовать его, чтобы получить направление.
const mat4 inverted = glm::inverse(transformationMatrix);
const vec3 forward = normalize(glm::vec3(inverted[2]));
...