struct mrpt::opengl::TRenderMatrices

Overview

Rendering state related to the projection and model-view matrices.

Used to store matrices that will be sent to shaders.

The homogeneous coordinates of a rendered point comes from the product (from right to left) of MODEL, VIEW and PROJECTION matrices:

p = p_matrix * v_matrix * m_matrix * [x y z 1.0]’

#include <mrpt/opengl/TRenderMatrices.h>

struct TRenderMatrices
{
    // fields

    mrpt::math::CMatrixFloat44 p_matrix;
    mrpt::math::CMatrixFloat44 m_matrix;
    mrpt::math::CMatrixFloat44 v_matrix;
    mrpt::math::CMatrixFloat44 v_matrix_no_translation;
    mrpt::math::CMatrixFloat44 pmv_matrix;
    mrpt::math::CMatrixFloat44 mv_matrix;
    mrpt::math::CMatrixFloat44 light_pv;
    mrpt::math::CMatrixFloat44 light_p;
    mrpt::math::CMatrixFloat44 light_v;
    mrpt::math::CMatrixFloat44 light_pmv;
    bool is1stShadowMapPass = false;
    std::optional<mrpt::img::TCamera> pinhole_model;
    double FOV = 30.0f;
    double azimuth = .0;
    double elev = .0;
    double eyeDistance = 1.0f;
    uint32_t viewport_width = 640;
    uint32_t viewport_height = 480;
    bool initialized = false;
    bool is_projective = true;
    mrpt::math::TPoint3D eye = {0, 0, 0};
    mrpt::math::TPoint3D pointing = {0, 0, 0};
    mrpt::math::TPoint3D up = {0, 0, 0};

    // construction

    TRenderMatrices();

    // methods

    void matricesSetIdentity();
    void computeProjectionMatrix(float zmin, float zmax);
    void computeLightProjectionMatrix(float zmin, float zmax, const TLightParameters& lp);
    void computeOrthoProjectionMatrix(float left, float right, float bottom, float top, float znear, float zfar);
    void computeNoProjectionMatrix(float znear, float zfar);
    void computeViewMatrix();

    void projectPoint(
        float x,
        float y,
        float z,
        float& proj_u,
        float& proj_v,
        float& proj_z_depth
        ) const;

    void projectPointPixels(
        float x,
        float y,
        float z,
        float& proj_u_px,
        float& proj_v_px,
        float& proj_depth
        ) const;

    float getLastClipZNear() const;
    float getLastClipZFar() const;
    float getLastLightClipZNear() const;
    float getLastLightClipZFar() const;
    void saveToYaml(mrpt::containers::yaml& c) const;
    void print(std::ostream& o) const;

    static mrpt::math::CMatrixFloat44 OrthoProjectionMatrix(
        float left,
        float right,
        float bottom,
        float top,
        float znear,
        float zfar
        );

    static mrpt::math::CMatrixFloat44 LookAt(
        const mrpt::math::TVector3D& lookFrom,
        const mrpt::math::TVector3D& lookAt,
        const mrpt::math::TVector3D& up,
        mrpt::math::CMatrixFloat44* viewWithoutTranslation = nullptr
        );
};

Fields

mrpt::math::CMatrixFloat44 p_matrix

Projection matrix, computed by Viewport from camera parameters.

mrpt::math::CMatrixFloat44 m_matrix

Model matrix.

mrpt::math::CMatrixFloat44 v_matrix

View matrix.

mrpt::math::CMatrixFloat44 v_matrix_no_translation

View matrix with null translation.

mrpt::math::CMatrixFloat44 pmv_matrix

Result of p_matrix * mv_matrix (=P*V*M).

Used in shaders. Updated by Viewport::updateMatricesFromCamera()

mrpt::math::CMatrixFloat44 mv_matrix

Result of v_matrix * m_matrix.

Used in shaders. Updated by Viewport::updateMatricesFromCamera()

mrpt::math::CMatrixFloat44 light_pv

Result of p_matrix * v_matrix (=P*V) for the directional light point-of-view.

Used in shadow-generation shaders. Updated by Viewport::updateMatricesFromCamera()

std::optional<mrpt::img::TCamera> pinhole_model

Use the intrinsics (cx,cy,fx,fy) from this model instead of FOV, if defined.

double FOV = 30.0f

Vertical FOV in degrees, used only if pinhole_model is not set.

double azimuth = .0

Camera elev & azimuth, in radians.

uint32_t viewport_width = 640

In pixels.

This may be smaller than the total render window.

bool initialized = false

Is set to true by Viewport::updateMatricesFromCamera()

bool is_projective = true

true: projective, false: ortho

mrpt::math::TPoint3D eye = {0, 0, 0}

The camera is here.

mrpt::math::TPoint3D pointing = {0, 0, 0}

The camera points to here.

mrpt::math::TPoint3D up = {0, 0, 0}

Up vector of the camera.

Methods

void computeProjectionMatrix(float zmin, float zmax)

Uses is_projective , vw,vh, etc.

and computes p_matrix from either:

  • pinhole_model if set, or

  • FOV, otherwise. Replacement for obsolete: gluPerspective() and glOrtho()

void computeLightProjectionMatrix(float zmin, float zmax, const TLightParameters& lp)

Updates light_pv.

void computeOrthoProjectionMatrix(
    float left,
    float right,
    float bottom,
    float top,
    float znear,
    float zfar
    )

Especial case for custom parameters of Orthographic projection.

Equivalent to p_matrix = ortho(...);.

Replacement for obsolete: glOrtho()

void computeNoProjectionMatrix(float znear, float zfar)

Especial case: no projection, opengl coordinates are pixels from (0,0) bottom-left corner.

void computeViewMatrix()

Updates v_matrix (and v_matrix_no_translation) using the current camera position and pointing-to coordinates.

Replacement for deprecated OpenGL gluLookAt().

void projectPoint(
    float x,
    float y,
    float z,
    float& proj_u,
    float& proj_v,
    float& proj_z_depth
    ) const

Computes the normalized coordinates (range=[0,1]) on the current rendering viewport of a point with local coordinates (wrt to the current model matrix) of (x,y,z).

The output proj_z_depth is the real distance from the eye to the point.

void projectPointPixels(
    float x,
    float y,
    float z,
    float& proj_u_px,
    float& proj_v_px,
    float& proj_depth
    ) const

Projects a point from global world coordinates into (u,v) pixel coordinates.

static mrpt::math::CMatrixFloat44 OrthoProjectionMatrix(
    float left,
    float right,
    float bottom,
    float top,
    float znear,
    float zfar
    )

Computes and returns an orthographic projection matrix.

Equivalent to obsolete glOrtho() or glm::ortho().

static mrpt::math::CMatrixFloat44 LookAt(
    const mrpt::math::TVector3D& lookFrom,
    const mrpt::math::TVector3D& lookAt,
    const mrpt::math::TVector3D& up,
    mrpt::math::CMatrixFloat44* viewWithoutTranslation = nullptr
    )

Computes the view matrix from a “forward” and an “up” vector.

Equivalent to obsolete gluLookAt() or glm::lookAt().