Computergrafik

Linmath-Daten Rechnen

linmath.h ist eine Alternative zu GLM, die mit reinem C Code auskommt (statt C++). Dementsprechend ist die Syntax weniger nah an den Mathematischen Ausdrücken und an GLSL ‘dran.

Gleiche Datentypen wie in Shadern:

  • float
  • vec3
  • vec4
  • mat4×4

Aber deutlich andere Nutzung (C, nicht GLSL…)

  • vec3, vec4
    Entsprechen C-Array (3 bzw. 4 floats)
  • mat4×4
    Entspricht 2-dimensionalen 4×4 Array (16 floats)
    Achtung: Entgegen normaler Gewohnheit in column-major Ordnung, d.h. Zugriff auf einzelne Elemente über matrix[spalte][zeile] (nicht anders herum, wie gewohnt)!
    Nochmal Achtung: Bei einer direkten Initialisierung ist das besonders spannend:
    mat4x4 m = { {  0,  1,  2,  3 },
                 {  4,  5,  6,  7 },
                 {  8,  9, 10, 11 },
                 { 12, 13, 14, 15 } };
    erzeugt die Matrix $\left( \begin{array}{cccc}0 & 4 & 8 & 12 \\1 & 5 & 9 & 13 \\2 & 6 & 10 & 14 \\3 & 7 & 11 & 15 \end{array} \right)$

Initialisierung:

vec4 vertex = { 1, 0, 2, 1 }, nocheinvertex = { 0, 1, 1, 0 };
vec4 result;
float skalar;

Addition:

vec4_add (result, vertex, nocheinvertex); // ditto: _sub()

Multiplikation:

vec4_scale (result, vertex, 2.0);         // Achtung: alle(!) Komponenten, auch w
skalar = vec4_mul_inner (vertex, nocheinvertex);
vec4_mul_cross (result, vertex, nocheinvertex);

Länge, Normierung:

skalar = vec4_len (vertex);
vec4_norm (result, vertex);

Matrizen:

mat4x4 m_left, m_right, m_res;
mat4x4_identity (m_left);
mat4x4_dup      (m_right, m_left);
mat4x4_add      (m_res, m_left, m_right); // ditto: _sub
mat4x4_scale    (m_res, m_left, 2.0);     // Achtung: alle(!) Komponenten
mat4x4_mul      (m_res, m_left, m_right);
mat4x4_invert   (m_res, m_left);

Matrix-Vektor-Multiplikation:

mat4x4_mul_vec4 (result, m_left, vertex);

Options: