struct mrpt::opengl::TRenderMatrices

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 pmv_matrix;
    mrpt::math::CMatrixFloat44 mv_matrix;
    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 computeOrthoProjectionMatrix(float left, float right, float bottom, float top, float znear, float zfar);
    void computeNoProjectionMatrix(float znear, float zfar);
    void applyLookAt();

    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;
    void saveToYaml(mrpt::containers::yaml& c) const;
    void print(std::ostream& o) const;
};

Fields

mrpt::math::CMatrixFloat44 p_matrix

Projection matrix, computed by renderNormalScene() from all the parameters above.

Used in shaders.

mrpt::math::CMatrixFloat44 m_matrix

Model matrix.

mrpt::math::CMatrixFloat44 v_matrix

View matrix.

mrpt::math::CMatrixFloat44 pmv_matrix

Result of p_matrix * mv_matrix.

Used in shaders. Updated by renderSetOfObjects()

mrpt::math::CMatrixFloat44 mv_matrix

Result of v_matrix * m_matrix.

Used in shaders. Updated by renderSetOfObjects()

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 COpenGLViewport::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 computeOrthoProjectionMatrix(
    float left,
    float right,
    float bottom,
    float top,
    float znear,
    float zfar
    )

Especial case for custom parameters of Orthographic projection.

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 applyLookAt()

Updates the current p_matrix such that it “looks at” pointing, with up vector “up”.

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.