Ich habe vor kurzen mit zwei kleinen C++ Utility Bibliotheken begonnen die ich hier kurz vorstellen möchte.
Die erste ist auch schon fast fertig.
GaussianLib:
- Ist eine C++11 template library für rudimentäre Funktionen der linearen Algebra.
- Beinhaltet primäre Klassen für Vektor, Matrix und Quaternionen:
- Vector2, Vector3, Vector4 (mit 'Swizzle Operator'-ähnlicher Funktionalität)
- Matrix, AffineMatrix3, AffineMatrix4, ProjectionMatrix4 (Affine matrizen sind speicher- und rechen effizienter für affine Transformationen)
- Quaternion (primär für Rotationen)
- Einführung: GettingStarted.pdf
- Kompiliert mit VisualC++ 2013 und g++ 4.8.1
- Ideal zur Benutzung mit OpenGL und Direct3D Anwendungen.
- 3-Klausel BSD Lizenz und auf github verfügbar
Warum GaussianLib und nicht Eigen?
Weil Eigen u.A. die Vektor Klasse so extrem abstrahiert und templatisiert hat, dass sie sich im Release mode deutlich anders verhält als im Debug mode.
Besonders implizite Konvertierungen (bswp. mit C++11 Keyword "auto") machen hier Probleme.
Zudem vermisse ich hier die public member x, y, z, w bei den Vektor Klassen. In
Eigen muss man, wegen der hohen Abstraktion, immer auf den [] Operator zurückgreifen.
Ist unschön IMHO wenn man in 3D Anwendungen doch eigentlich nur Vector2, Vector3 und Vector4 braucht.
Lediglich die Matrix Klasse ist in
GausslibLib abstrakt als MxN Matrix gestaltet, da man hier ohnehin nicht auf public member zugreifen kann.
Außerdem bietet die
GaussianLib eine Art 'Swizzle Operator'. Wüsste nicht, dass
Eigen so was auch hat.
Code Beispiel (Projektion):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <Gauss/Gauss.h>
#include <GL/GL.h>
void SetupGLProjection(float aspectRatio, float nearPlane, float farPlane, float fieldOfView)
{
// Generate sparse projection matrix (only stores the non-zero elements)
auto proj = Gs::ProjectionMatrix4<float>::Perspective(aspectRatio, nearPlane, farPlane, fieldOfView, Gs::ProjectionFlags::OpenGLPreset);
// Convert to full 4x4 matrix
auto proj4x4 = proj.ToMatrix4();
// Load to OpenGL
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(proj4x4.Ptr());
}
/* ... */
|
Code Beispiel (Rotation):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <Gauss/Gauss.h>
#include <iostream>
int main()
{
auto a = Gs::Quaternion::EulerAngles({ Gs::pi*0.5, 0, 0 });
auto b = Gs::Quaternion::AngleAxis(Gs::Vector3(1, 1, 1).Normalized(), Gs::pi*0.25);
auto t = Gs::Real(0.25);
auto c = Gs::Slerp(a, b, t);
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
std::cout << "c = " << c << std::endl;
return 0;
}
|
GeometronLib:
- Ist eine C++11 static library für simple (und bald auch komplexe) geometrische Funktionen.
- Primäre Klassen:
- Sphere
- Plane
- Triangle (Typ derivate: Triangle2, Triangle3)
- AABB (Typ derivate: AABB2, AABB3)
- OBB (Typ derivate: OBB2, OBB3)
- Line (Typ derivate: Line2, Line3)
- Ray (Typ derivate: Ray2, Ray3)
- Spline
- ConvexHull
- Frustum
- Transform2
- Transform3
- TriangleMesh (zum dynamischen erzeugen von primitiven und komplexeren Modellen)
Würde mich freuen, wenn noch jemand anderes außer mir etwas damit anfangen kann :-)
Ich denke für 3D Prototypen, Demos, Tests etc. können diese Libs sehr nützlich sein, wenn man keine fertige 3D Engine nutzen will,
aber nicht jedes Mal diese basis Funktionen bzw. Klassen von Neuem schreiben will.
Das war zumindest mein erster Gedanke bei diesen Libs.
Gruß,
Lukas