CoolMathLibrary

 Posted by on 2011/03/26 at 13:44
 

Die CoolMathLibrary (CML) ist eine einfache C++ Mathebibliothek die diverse nützliche Klassen und Funktionen bereitstellt. Eine Nutzung im Zusammenhang mit OpenGL ist vorgesehen, aber natürlich kann CML auch in anderen Bereichen genutzt werden. CML steht unter der GNU General Public License (Version 2). Eine ältere Java-Version dieser Library zur Nutzung mit dem GoogleWebToolkit ist in WGT integriert.

Features

  • Unterstützung für Zeilenvektoren (2,3,4,N) und Matrizen (3×3, 4×4, MxN).
  • Unterstützung für Quaterions und Frames (ein Frame ist ein Quaternion kombiniert mit einem Translationsvektor)
  • BoundingBox und Plane Klasse.
  • Zugriff auf die Daten direkt über Attribute (z.B. vector.x) oder den Array-Operator (z.B. vector[0]). Auf die Elemente einer Matrix kann über den zweistelligen ()-operator zugriffen werden, also z.B. matrix(2,3).
  • Viele Operationen sind in der aktuellen Beta mit Hilfe von Schleifen implementiert. Der Compiler entscheidet ob er lieber Rechenoperationen einspart (Schleifenindices) oder die stattdessen die Größe des compilierten Codes optimiert. Die Verwendungen von inline ist mit bedacht gewählt.
  • überladene Outputstream-Operatoren
  • Alle Klassen sind als Templates realisiert. Eine Nutzung mit den Typen float oder double ist vorgesehen. Vektoren können auch mit int32_t oder uint32_t benutzt werden. Weitere Typen sind möglich, solange die entsprechenden Operatoren sinnvoll implementiert sind. Benutze die vordefinierten Typen, z.B. Vector3f, Vector3d oder Vector3i.
  • Verwendung von statischen Assertions (C++0x) zum testen der Template-Parameter. Diese können über ein Makro abgeschaltet oder z.B. durch Laufzeit-Assertions ersetzt werden.

Download

Benutzung

Einfach coolmath/coolmath.h inkludieren. Alle Klassen und Funktionen befinden sich im Namespace CML. Operatoren sind größtenteils sinnvoll überladen um die Handhabung zu erleichtern.

using namespace CML;

Vector3f position(0,0,-3);
Vector3f velocity(0,4,1);
float timeElapsed = 1.0f/100.0f;

// Vektor-Addition und Skalar-Vektor-Multiplikation
position += timeElapsed * velocity;

// dot-Produkt
Vector3f direction(1,2,3);
float f = dot(position, direction);

// Ray-Plane-Intersection
Planef plane(A,B,C);
plane.normalize();
Vector3f intersection = plane.rayIntersect(position, direction);

// Rotation um X-Achse
Matrix44f matrix = Matrix44f::rotationX(0.5f*PI); 

// Zugriff auf mehrere Matrix-Elemente gleichzeitig, in diesem Fall den
// Translations-Teil
matrix.setW(position);

// Matrix-Multiplikation, Matrix44f::lookAt is äquivalent zu gluLookAt
matrix *= Matrix44f::lookAt(Vector3f(3,0,0), Vector3f(0,0,0), Vector3f(0,1,0));

// Übergabe der Matrix an OpenGL
glMatrixMode(GL_MODELVIEW);
matrix.glLoadMatrix();

// Transformation eines Punktes, 3D-Vektor wird zu (x,y,z,1) erweitert, beim
// Ergebnis wird w-Komponente ignoriert.
Vector3f point(42, 3, -6);
point = matrix.transform(point);

// Transformation eines Punktes, 3D-Vektor wird zu (x,y,z,1) erweitert. Es wird
// eine perspektivische Division ausgeführt.
point = matrix.project(point);

// BoundingBox berechnen
BoundingBox3f box(FLOAT_MAX, FLOAT_MIN);
std::vector<Vector3f>::const_iterator itr = points.begin(), end = points.end();
for ( ; itr != end; ++itr) {
    box.include(*itr);
}