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