3D Vector Mathematik

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

3D Vector Mathematik

Beitrag von SMaag »

Für den 3D Sch... braucht man ganz schön viel drum rum.
PureBasic bietet zwar mittlerweile die vordefinierten Vektortypen .Vector3 und .Vector4. Dies sind aber nur Defintionen als Float .f
Wenn man das ausweitet benötigt man früher oder später Vectoren als Double oder Integer.
Ich hab jedoch keine Zusammenstellung der ganzen Vectormathematik gefunden. Vor allem nicht mit Optimierungen für Prozessoren mit MMX/SSE Extention.

Die erste Version der Float-Vector Library zu Diskussion. Ich hab die Library schon mal vorgetestet und dazu
die Vecf-Library in das 3DDraw-Demo von Stargate eingebaut.
(die orginal 3dDraw von STARGATE hier: https://www.purebasic.fr/german/viewtop ... 3d#p305196)
Hat etwas gedauert bis das funktioniert hat!

hier die Vecf-Library für single Float
https://github.com/Maagic7/PureBasicFra ... VECTORf.pb

hier für double Float (ist aber nocht nicht so gut geteset!)
https://github.com/Maagic7/PureBasicFra ... VECTORd.pb
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 3D Vector Mathematik

Beitrag von STARGÅTE »

Hallo SMaag,

das Include lässt sich nicht kompilieren.
Im Code und in den Beispielen sind viele Fehler:
  • Es verwendet falsche Konstanten: CPU::#CPU_APPx32_SSE statt CPU::#APPx32_SSE wie es in PbFw_Module_CPU.pb definiert ist.
  • In Vector_Add steht das Macro mac_Vector4_ADD was es gar nicht gibt. (da ist die 4 zu viel).
  • Gleiches bei Sub, Mul, Div ...
  • Vector_MinMax stimmt irgendwie überhaupt nicht. Du verwendest da das mac_Vector_MinMax-Macro, gibst aber nur drei Argumente über (wo auch noch ein Komma fehlt) obwohl das Macro vier möchte. Außerdem heißt das Macro mac_VectorMinMax
  • In Vector_Swap verwendest du *Vec obwohl das gar kein Procedure-Parameter ist. und gibst *OUT aus, was gar keine Änderung erfahren hat.
  • In Macro mac_Vector_CrossProduct schreibst du *In1 und *In2 obwohl du sicher die Macro-Argumente IN1 und IN2 meinst. Außerdem wird später mac_VectorCrossProduct aufgerunden und nicht mac_Vector_CrossProduct
  • In Vector_X_Matrix schriebst du mac_Vextor_X_Matrix
  • In Vector_Max wird überall auf die Macros mit Min verwiesen und in Vector_Min wird bei CompilerDefault auf Max verwiesen.
  • In den Beispielen lässt du mac_Debug_Result(sC, sA, sA) ausgeben, obwohl du sicher sB im letzten Argument meinst.
Fehler und Bugs können jedem passieren, aber bitte vorher zumindest alle Kompilierungs-Fälle mal testen ob sie überhaupt kompilieren. Ansonsten kannst du dir diese Fallunterscheidung auch sparen, wenn die Nutzer die Version ohne SSE eh nicht nutzen können.

Des Weiteren solltest du das gesamte Module noch mal bezüglich Überschreibungen prüfen, wenn als OUT-Variable eine IN-Variable verwendet wird. Im Kreuzprodukt würde das dann zu einer Fehlerhaften Berechnung führen, weil OUT\x überschrieben wird, obwohl es als IN\x später noch benötigt wird. Das gleiche bei der Matrixmultiplikation.
Bei meinem Drawing3D war das nicht berücksichtigt, weil es dort der Ausgang nie ein Eingang war. Für ein allgemeines Module, wie es deins werden soll, solltest du diesen Fall aber absichern.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: 3D Vector Mathematik

Beitrag von SMaag »

Erst mal vielen Dank für die Analyse! Ich kann in jedem Punkt nur zustimmen!

Einige der beschrieben Fehler dachte ich, hätte ich schon behoben. Ich schau mir das im Detail demnächst nochmal an.

Hier eine kurze Erklärung warum ich das so mache, wie ich das hier gemacht habe!

Für mich ist das alles im Moment noch ein Freizeitprojekt, mit dem Hintergrund, das später auch professionell einzusetzen!
Ich habe also eine grobe Vorstellung, von dem was ich brauchen werden - und das ist ziemlich viel!
(Ich will PureBasic bei Tools für Industrieanlagen einsetzen, da ich PureBasic dafür als ausgezeichnetes Werkzeug sehe)
Ich veröffentliche absichtlich die frühen Entwicklungsstände, damit man sieht in welche Richtung es geht.

Jetzt sollt ihr hier nicht meine Arbeit machen, aber bei der Menge von neuem Code, den ich im Moment in der 'Freizeit' schreibe, würde
das ewig dauern, bis ich das alles richtig ausgetestet habe und könnte das erst in 1-2 Jahren zur Verfügung stellen.
(ich kann das auch nur im Winter machen! Im Sommer wird das wieder eingestellt!)

Wenn da aber was dabei ist, was andere auch gebrauchen können, dann lässt sich das mit der Rückmeldung hier viel
schneller erledigen und der Fokus wird auf die Dinge gelegt, die sonst auch noch gebraucht werden.

Ich verweise überall extra darauf, dass es sich um eine Entwicklerversion handelt und nicht für den live Einsatz ist.
Also nur für Leute, die das verstehen können!


Ich hab im Moment noch einige Testproblematiken:

1. Ich hab nur die 32-Bit-Version im Einsatz, da die x64 Version parallel dazu bei mir einfach nicht ging!
Damit muss ich mich nochmals beschäftigen

2. Wie ich das schaffe, mit dem C-Backend zu compilieren, hab ich auch noch nicht raus.

3. Auf dem RASPI läuft zwar die IDE, es gab aber bei mir zu viele Probleme, wo code einfach wegen fehlender
Bibliotheken nicht compilierbar war. Verstanden hab ich das auf die Schnelle nicht und das deswegen wieder
hinten angestellt.

Im PureBasic Forum ist zwar im Vergleich zu anderen Foren relativ wenig los. Aber die Qualtiät ist 1A, da hier fast nur Profi-Programmier am Werk sind, die naturgemäß relativ wenig Unterstützung brauchen!

Nochmals mein Dank an dich und andere hier, die sich damit auseinandersetzen!
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: 3D Vector Mathematik

Beitrag von SMaag »

So, das hatte mir keine Ruhe gelassen! Modul ist überarbeitet!
Und x64 PureBasic hab ich auch im Griff, man muss nur die Compilervorwahl ausschalten und schon geht's!

Hab die DEMO mit dem Vector-Modul für die Allgemeinheit fertig gemacht und gerade nochmal durchlaufen lassen!
Die DEMO basiert auf dem Drawing3D Modul von STARGATE. Dort hab ich die integrierten Vector-Funktionen durch die
aus dem Vector Modul ersetzt. Sieht im Ergebnis genau aus wie das orginal! Bingo!

https://github.com/Maagic7/PureBasicFra ... main/Demos

Was im Vector-Modul noch fehlt ist die Optimierung für das C-Backend.
Da müsste man wahrscheinlich den C-Code mit den Intrinsics für SSE einfügen.
Leider bin ich da nicht fit genug!
Wenn das jemand kann und machen möchte, wäre super!
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: 3D Vector Mathematik

Beitrag von SMaag »

Des Weiteren solltest du das gesamte Module noch mal bezüglich Überschreibungen prüfen, wenn als OUT-Variable eine IN-Variable verwendet wird. Im Kreuzprodukt würde das dann zu einer Fehlerhaften Berechnung führen, weil OUT\x überschrieben wird, obwohl es als IN\x später noch benötigt wird. Das gleiche bei der Matrixmultiplikation.
Bei meinem Drawing3D war das nicht berücksichtigt, weil es dort der Ausgang nie ein Eingang war. Für ein allgemeines Module, wie es deins werden soll, solltest du diesen Fall aber absichern.
Oh ja, das könnte Probleme geben! Da alles Pointer sind, kann man auch den OUT doppelt übergeben. Das wird früher oder später passieren
statt (OUT, IN1, IN2) - (OUT, OUT, IN) - das wäre wohl auch meine Intention, dass so zu machen -> und schon ist das Ergebnis falsch, ohne
dass man das unbedingt gleich mitbekommt!

Was mir jetzt dazu einfällt, wär zu prüfen, ob *OUT identisch mit einem der beiden *IN ist!
Antworten