2D Point vs. 4D Vector Koordinaten
Verfasst: 02.03.2023 13:30
Es geht um die Strategie der Verwendung von 2D Point und 4D Vector-Koordinaten.
Folgende Ausgangspunkte:
1. Die VectorDrawing Befehle von PureBasic verwenden als Koordinaten bereits Double-Float!
Bei der 2D Drawing Library gibt es dazu keine Angeben, daher gehe ich davon aus, dass es Integer-Werte sind
2. Sobald man ob 2D oder 3D Objekte verwendet und diese Zoomen, drehen ... möchte, arbeitet man am besten mit allgemeinen Vektor, Matrix Operationen, die das alles beinhalten. Für die allgemeine Form dieser Vektor, Matrix Operationen benötigt man für die Berechnung immer eine
zusätzliche virtuelle Dimension. für 2D also (x,y,w), für 3D (x,y,z,w)
Ich gehe jetzt mal nur von moderen Intel/AMD CPUs aus, welche alle MMX/SSE/AVX 256-Bit beherrschen:
hier macht es meiner Ansicht nach wenig Sinn, noch zwischen 2D und 3D Koordinaten zu trennen, da
die SSE/AVX Einheit 4D Koordinaten als single oder double Float in einer Operation berechnen kann.
Meine Überlegung für zukünftige Software:
Immer alles mit gleich mit 4D Double Koordinaten ansetzen, Bei 2D eben z=0
Erwartete Vorteile:
- das sollte mit SSE/AVX sogar schneller sein, als 2D Koordinaten einzeln über die Standardregister zu berechnen
- man hat ein universelles System für 2D und 3D und kann immer die gleichen Funktionen benutzen.
- 2D nach 3D Koordinaten irgendwie transformieren/kopieren entfällt!
- man kann aus 2D Formen direkt 3D-Formen extrudieren, indem man die 2D Form einfach kopiert und mit einer Z-Koordinate versieht.
Damit wäre man wohl schon fast bei einer Mini-CAD-Engine!
(wie man das dann. gezeichnet bekommt ist noch eine offen Frage! Evtl. Umwandlung in Mesh oder vielleicht direkt über irgendwelche OpenGl Funktionen!?)
Nachteil:
- mehr Speicher benötigt (bei den heute üblichen GB Speichern wohl kein echtes Problem)
- so wie ich das bisher sehe, ist davon nichts in PB implementiert. Ausser der Vector4-Typ als single Float. Es ist also wahrscheinlich selber denken und machen angesagt! Das VectorModul für single und double Floats hab ich weitgehend implementiert. Damit kann man aber noch nicht wirklich was anfangen, solange man keine Funktionen für eine allegemeine 2D/3D Objekt-Darstellung und die Umsetzung der Zeichenfunktion hat.
Hat dazu jemand Erfahrung? Liege ich in meiner Einschätzung da richtig? Macht das evtl. schon jemand so?
Folgende Ausgangspunkte:
1. Die VectorDrawing Befehle von PureBasic verwenden als Koordinaten bereits Double-Float!
Bei der 2D Drawing Library gibt es dazu keine Angeben, daher gehe ich davon aus, dass es Integer-Werte sind
2. Sobald man ob 2D oder 3D Objekte verwendet und diese Zoomen, drehen ... möchte, arbeitet man am besten mit allgemeinen Vektor, Matrix Operationen, die das alles beinhalten. Für die allgemeine Form dieser Vektor, Matrix Operationen benötigt man für die Berechnung immer eine
zusätzliche virtuelle Dimension. für 2D also (x,y,w), für 3D (x,y,z,w)
Ich gehe jetzt mal nur von moderen Intel/AMD CPUs aus, welche alle MMX/SSE/AVX 256-Bit beherrschen:
hier macht es meiner Ansicht nach wenig Sinn, noch zwischen 2D und 3D Koordinaten zu trennen, da
die SSE/AVX Einheit 4D Koordinaten als single oder double Float in einer Operation berechnen kann.
Meine Überlegung für zukünftige Software:
Immer alles mit gleich mit 4D Double Koordinaten ansetzen, Bei 2D eben z=0
Erwartete Vorteile:
- das sollte mit SSE/AVX sogar schneller sein, als 2D Koordinaten einzeln über die Standardregister zu berechnen
- man hat ein universelles System für 2D und 3D und kann immer die gleichen Funktionen benutzen.
- 2D nach 3D Koordinaten irgendwie transformieren/kopieren entfällt!
- man kann aus 2D Formen direkt 3D-Formen extrudieren, indem man die 2D Form einfach kopiert und mit einer Z-Koordinate versieht.
Damit wäre man wohl schon fast bei einer Mini-CAD-Engine!
(wie man das dann. gezeichnet bekommt ist noch eine offen Frage! Evtl. Umwandlung in Mesh oder vielleicht direkt über irgendwelche OpenGl Funktionen!?)
Nachteil:
- mehr Speicher benötigt (bei den heute üblichen GB Speichern wohl kein echtes Problem)
- so wie ich das bisher sehe, ist davon nichts in PB implementiert. Ausser der Vector4-Typ als single Float. Es ist also wahrscheinlich selber denken und machen angesagt! Das VectorModul für single und double Floats hab ich weitgehend implementiert. Damit kann man aber noch nicht wirklich was anfangen, solange man keine Funktionen für eine allegemeine 2D/3D Objekt-Darstellung und die Umsetzung der Zeichenfunktion hat.
Hat dazu jemand Erfahrung? Liege ich in meiner Einschätzung da richtig? Macht das evtl. schon jemand so?