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

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

1

02.08.2008, 20:24

Dimensionswirrwarr bei Vektoren und Matrizen

Hallo,
weil ich mich zur Zeit auf 3D konzentrieren möchte und vortransformierte Vertizes und 2D-Vektoren da nicht mehr so wirklich weiterhelfen, wollte ich (auch des Verständnisses wegen) meine eigene Vektor- und auch Matrix-Klasse schreiben. Doch offenbar gibt es da ganz verschiedene Ansätze:

Persönlich habe ich dabei an ein perfektes Einsatzgebiet für Templates gedacht, denn so könnte man sowohl Datentyp, als auch Dimension variabel lassen. Außerdem kann man so z.B. die Multiplikation auch wunderbar mit verschachtelten Schleifen mit nur einer einzigen Funktion lösen, die dann für alle Dimensionen gilt.

In Davids Buch hingegen werden spezialisierte Klassen verwendet und hier wird recht plausibel erläutert, dass die universellere Schleifen-Variante eventuell langsamer ist.

Dazu kommt ja noch, dass Direct3D sich offenbar in einem Punkt überhaupt nicht um mathematische Korrektheit kümmert: Egal, ob nun 3D-Vektoren oder 2D-Texturkoordinaten transformiert werden sollen, es wird immer eine 4x4 Matrix verwendet, bei der dann anscheinend je nach Fall die entsprechenden Zeilen/Spalten einfach nicht berücksichtigt werden. Das spricht zumindest eindeutig gegen meine Templateklasse (und widerspricht meinen bisherigen mathematischen Kenntnissen vollkommen. Auch Wikipedia sagt: "Damit zwei Matrizen multipliziert werden können, müssen die Einträge einem Ring entstammen und die Spaltenanzahl der linken mit der Zeilenanzahl der rechten Matrix übereinstimmen."). Wozu sollte man Matrizen beliebiger Größe erstellen wollen, wenn Direct3D sowieso immer 4x4 erwartet?

Der letzte Punkt, den ich noch entdecken konnte: Die Funktion D3DXVec2Transform liefert (wie alle anderen Funktionen der Form D3DXVecXTransform) einen Vektor mit 4 Dimensionen, das Äquivalent aus der Tribase-Engine (tbVector2TransformCoords) hingegen einen mit zweien (was ich persönlich auch logischer finde).

Ich weiß gerade wirklich überhaupt nicht weiter. :? Sollte ich nun den *-Operator der Matrixklasse für Vektoren verschiedener Dimensionen überladen? Wie löst ihr persönlich dieses Problem? Es würde mir mit Sicherheit weiterhelfen, wenn mir einzelne Personen ihre Vorgehensweisen erläutern würden, damit ich ein wenig vergleichen kann. :)

Gruß,
ph4nt0m

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

03.08.2008, 10:24

DirectX hab ich etwas länger nicht verwendet, aber wenn du sagst, dass DirectX immer (auch bei Texturtransformationen, etc) 4x4 Matrizen nimmst, dann würde ich den Grund dafür vermutlich in der Hardware sehen.

Es ist einfacher die Grafikhardware auf 4x4 Matrixoperationen zu optimieren, als zusätzlich 3x3 oder 2x2 anzubieten. (Grob analog zu RISC vc CISC. Optimiert man die G/CPU auf wenige aber schnelle Operationen oder implementiert man viele Operationen in Hardware und nimmt dafür komplexere Hardware in kauf)

Letztenendes musst du den "Rest" der Matrixelemente einfach als Redundant ansehen. Sie werden berechnet, aber das du kannst die Werte getrost ignorieren.

Auf der CPU zusätzlich 2x2 oder 3x3 Matrizen z.B. für Physikberechnungen anzubieten macht jedoch wieder Sinn, weil dort Matrixoperationen doch sehr langsam sind, und man so einiges an Rechenoperationen sparen kann.

Grüße,
xardias

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

3

04.08.2008, 14:41

Zitat von »"xardias"«

Auf der CPU zusätzlich 2x2 oder 3x3 Matrizen z.B. für Physikberechnungen anzubieten macht jedoch wieder Sinn, weil dort Matrixoperationen doch sehr langsam sind, und man so einiges an Rechenoperationen sparen kann.

Und genau das hatte ich sogar vor :? Wenn man also letztendlich doch 2D, 3D und 4D Vektoren, sowie 2x2, 3x3 und 4x4 Matrizen braucht, würde sich doch eigentlich eine Template-Variante anbieten. Aber irgendwie habe ich das Gefühl, dass (wie David in dem genannten Thread schon schreibt) eine generische Lösung mit Schleifen nicht die gleiche Performance erreicht, wie eine "hardcode" Lösung.

Wäre es in diesem Fall besser, auf Templates zu verzichten und tatsächlich drei separate Vektor- und drei Matrixklassen zu erstellen?

Gruß,
ph4nt0m

4

04.08.2008, 15:59

Mach dir mal nicht ueber low-level-Kram Gedanken. Der Grund, warum 4x4 Matrizen genutzt werden ist: Rotation und Translation in 3D koennen als Matrixoperation in einer Matrix zusammengefasst werden. Gluecklicherweise ist 2D ein Unterraum von 3D und die entsprechenden Stellen werden durch eine Einheitsmatrix/Vektor ausgefuellt. Die 4x4 for-Schleife per Hand aufzuloesen macht auch recht wenig Sinn, da sie nicht wirklich schneller ist.

Willst du eine allgemeine Matrixbibliothek schreiben, so machen Templates durchaus Sinn. Wenn du willst, kannst du auch die for-Schleife dann auch so schreiben, dass sie bei der Templateinstanziierung automatisch aufgeloest wird.

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

5

04.08.2008, 18:12

Ein Nachteil, wenn du mit Templates schreibst ist auch, dass du keine SIMD-Optimierungen anwenden kannst.
http://de.wikipedia.org/wiki/SIMD

ph4nt0m

Frischling

  • »ph4nt0m« ist der Autor dieses Themas

Beiträge: 81

Beruf: Student

  • Private Nachricht senden

6

05.08.2008, 22:18

Ok, danke für eure Antworten. Ich habe mich entschieden, hier auf die generische Version zu verzichten. Letztendlich würde ich mir ja wirklich nur ein bisschen Programmierarbeit sparen, aber da das meiste ohnehin copy&paste ist (Vector3 hat halt nur eine Dimension mehr als Vector2), ich aber so besser optimieren kann, lasse ich es lieber. Es gibt ja noch genügeng weitere Situationen, in denen Templates erste Wahl sind.

Gruß,
ph4nt0m

Werbeanzeige