Wie auch im Bachelor Kurs werden wir uns eine eigene Mathe Bibliothek bauen. Sie dient dazu, dass wir die mathematischen Formeln die wir brauche zumindest einmal selbst implementiert haben.

Anmerkung: Einige der Funktionen die wir hier implementieren, unterstützt die OpenGL API auch selbst. Für andere Funktionen würde es sich anbieten auf eine speziell dafür entworfene und auf Geschwindigkeit optimierte Mathe Bibliothek zurückzugreifen. Trotzdem werden wir alle Funktionen die wir für diese Veranstaltung brauchen, selber implementieren. Unser Ziel ist dabei nicht, besonders effizient zu programmieren sondern besonders lesbar. So sind wir am Ende des Semesters in der Lage, genau zu verstehen was unser Programm tut und können die einzelnen Schritte auch von Hand nachrechnen.

Matritzen

Für dieses Kapitel benötigen wir lediglich eine Translationsmatrix. Wir erstellen daher die nötige Datenstruktur Matrix und eine Funktion zum Erzeugen einer Tranlationsmatrix. Lesen Sie sich in die Thematik zur Translationsmatrix ein. Außerdem sollten Sie das Konzept von Unions in C++ sowie das #pragma once Statement verstehen.

cgmath.h

#pragma once
#include <math.h>

union Matrix {
    struct {
        float m11;
        float m12;
        float m13;
        float m14;
        float m21;
        float m22;
        float m23;
        float m24;
        float m31;
        float m32;
        float m33;
        float m34;
        float m41;
        float m42;
        float m43;
        float m44;
    };
    float v[16];
};

inline Matrix matrixTranslate(float x, float y, float z)
{
    Matrix m;
    m.m11 = 1;  m.m21 = 0;  m.m31 = 0;  m.m41 = x;
    m.m12 = 0;  m.m22 = 1;  m.m32 = 0;  m.m42 = y;
    m.m13 = 0;  m.m23 = 0;  m.m33 = 1;  m.m43 = z;
    m.m14 = 0;  m.m24 = 0;  m.m34 = 0;  m.m44 = 1;
    return m;
}

Unterschiede zum Bachelor Kurs

In diesem Kurs werden wir versuchen alle Funktionen direkt in der Header (.h) Datei zu implementieren. Damit das klappt markieren wir allen Funktionen als inline. Auf diese Weise wird der Compiler keine eigene Unit erzeugen sondern die jeweils benötigten Funktionen werden direkt an den Stellen integriert, wo sie benötigt werden.