Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

06.08.2015, 22:57

GaussianLib & GeometronLib

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

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

2

07.08.2015, 08:33

Ich habe auch mal angefangen so etwas zu machen:
https://github.com/amecky/math
Ich würde mir das mit den Vector Headern noch mal überlegen. Du hast hier sehr viel redundanten Code. Das läßt sich deutlich zusammenfassen.
Schau Dir mal meinen Vector.h an:
https://github.com/amecky/math/blob/master/Vector.h

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

07.08.2015, 09:45

An spezialisierte Templates habe ich auch schon gedacht, aber ich wollte es diesmal einfacher halten.
Aber prinzipiell keine schlechte Idee, werde ich vielleicht auch noch so machen.

Mit den Unions hatte ich in Zusammenhang von templates mal Schwierigkeiten gehabt.
Wenn ich jetzt noch r, g, b, a Member drin habe, müsste ich natürlich auch den Swizzle Operator erweitern.

EDIT:
Deine anonymen structs in "Vector" scheinen aber nicht ganz dem ISO C++ Standard zu entsprechen:
iso c++ prohibits anonymous structs
Anonymous Union / Struct Weirdness

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (07.08.2015, 09:55)


buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

4

07.08.2015, 14:32

Hier ist ein guter Artikel zu dem Thema:
http://www.reedbeta.com/blog/2013/12/28/…math-libraries/

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

5

07.08.2015, 16:42

Es ist richtig, dass anonyme Strukturen nicht Teil des C++ Standards sind. Nichtsdestotrotz werden Sie auf allen Platformen die ich kenne unterstützt.
Sie sind Teil von C11 und ein C++ Compiler unterstützt in der Regel auch C. Sie werden sogar auf Windows vom MSVC unterstützt, wo es bezüglich mit C Unterstützung im Compiler sonst eher sehr sehr düster aussieht.

Ich würde dir eine generische Klasse auch empfehlen und habe gute Erfahrungen damit gemacht. Es spart einfach viel Redundanz. Wenn du ganz sicher gehn willst, könntest du auch eine Methode in der Basisklasse einführen, die ein Array zurückliefert(bzw. einen Zeiger zu X).
Ich denke aber, man darf Portabilität nicht mit Standardkonformität verwechseln.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

6

07.08.2015, 20:18

Habe eben mal schnell die Vektoren auf eine generalisierte Klasse umgesetellt.
Vector2, 3 und 4 gibt's jetzt als spezialisierte Templates.
Viel redundanten Code hatte ich zuvor allerdings auch schon nicht, da ich das meiste in globale Funktionen wie "Dot", "Cross", "Normalize" etc. gepackt habe.

Werbeanzeige