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

1

15.12.2013, 17:05

Vector3 Frage - Umwandel in 4-dimensionalen Vektor

Hallo liebe spieleprogrammierer.de Gemeinde!

Ich habe eine Frage, zu der beschriebenen Vorgehensweise*, der Umwandlung eines Vector3-Objekts, in einen -für die Multiplikation mit den Matrizen erforderlichen- 4-dimensionalen Vektor.
Und zwar kommt ja bei einem 4-dimensionalen Vektor eine weiter Koordinate (W) hinzu, die jedoch nicht aus den Daten des Vector3-Objekts gewonnen werden kann. Nun wird diese Koordinate im Buch ja standardmäßig auf 1 gesetzt, wenn man ein Vector3-Objekt in einen 4-dimensionalen Vektor "umwandelt", was man auf den ersten Blick natürlich so hinnehmen kann, aber auf den zweiten Blick etwas unlogisch wirk:

Nehmen wir an wir hätten einen 2-dimensionalen Vektor (5|3), so zeigt dieser 5 Einheiten in x- und 3 Einheiten in y-Richtung. Wenn ich diesen Vektor nun in ein 3-dimensionales Koordinatensystem übertragen soll, so würde ich ihn ja eigentlich folgendermaßen schreiben (5|3|0), da er immer noch gleichermaßen in beide Richtungen zeigt und auch nicht in z-Richtung ausgedehnt ist. Aber nach der Methode die im Buch verwendet wird, müsste der Vektor (5|3) im 3-dimensionalen Raum (5|3|1) sein, was mir unlogisch erscheint, da sich mir nicht erschließt, warum sich einmal die Länge des Vektors verändern sollte, nur weil er in einen höherdimensionalen Raum "verschoben" wird und zweitens, warum er genau eine Einheit in eine Richtung zeigt, die vorher nicht existiert hat.

Ich würde mich sehr über eure Antworten freuen und bedanke mich jetzt schon mal für diese :) .

Grüße Benjamin

*3D-Spieleprogrammierung mit DirectX 9 und C++, Dritte Auflage, Seite 68, Vektoren transformieren

2

15.12.2013, 18:46

Die vierte Koordinate dient hauptsächlich nur dazu, Vektoren (also Richtungsangaben und Punktdifferenzen) und Punkte zu unterscheiden und somit Translationen als affine Abbildungen mit Matrizen realisieren zu können (siehe z.B. http://de.wikipedia.org/wiki/Homogene_Ko…mogene_Matrizen )
w = 1 identifiziert einen Punkt, w = 0 einen Vektor. Die Länge des entstehenden 4-dimensionalen (oder in deinem Beispiel 3-dimensionalen) Objektes ist dann nicht mehr interessant. Beziehungsweise, für Vektoren bleibt die Länge erhalten, da w gleich 0 ist. Für einen Punkt ist w zwar gleich 1, aber die Frage nach der "Länge" eines Punktes ist ohnehin nicht sinnvoll.

Wenn es sich also bei deinem Beispiel tatsächlich um einen Vektor (5|3) handelt, so würde dieser mit erweiterten Koordinaten zu (5|3|0) und behält seine Länge.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »lumip« (15.12.2013, 18:52) aus folgendem Grund: Wikipediareferenz hinzugefügt..


3

15.12.2013, 20:25

Vielen dank für Deine Antwort :thumbsup: !

Also ist quasi der Wert von W ein Indiz dafür, ob es sich um einen Vektor im Sinne einer z.B. Geschwindigkeit (W = 0) oder eine Ortsangabe (W != 0) handelt?
Der Link verwirrt mich nur ein bisschen...
Also erst mal scheint es mir so, als ob man eine 4x4-Matrix "nur" dafür verwendet, um auch eine Translation entlang einem bestimmten 3D-Vektor zu ermöglichen (das selbe was Du auch geschrieben hast), aber die W-Koordinate scheint mir hier noch nicht wirklich von Bedeutung, da diese hier sowieso immer 1 bleibt, bzw. 0, wenn man auch eine Ortsangabe mit 0 als W-Koordinate versieht.
So wie ich das in dem Link verstehe, ist die W-Koordinate im Endeffekt auch nur dafür gut, um die 3D-Koordinaten z.B. auf einen 2D-(PC-)Bildschirm projizieren zu können oder habe ich da etwas falsch verstanden?
Es scheint auch keine genaue Erklärung zu geben, warum man nun bei "homogenen Koordinaten" die 1 als Standardwert für W nimmt, sondern die "Begründung" viel mehr die Funktionalität des ganzen zu sein scheint... Aber warum ist es denn nicht möglich einen Ortsvektor nur anhand seiner X-,Y- und Z-Koordinaten auf eine 2D-Oberfläche zu projizieren... Das will nicht so recht in meinen Kopf rein ^^ .

Grüße Benjamin :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

15.12.2013, 20:44

Einen Vektor zu projizieren macht übrigens nicht sehr viel Sinn. Sondern nur einen Punkt oder eine Fläche.
Die Funktionalität der homogenen Matrizen ist genau die Erklärung des Ganzen. Denn so kann man *alle* Operationen über Matrizen-Multiplikation vereinheitlichen und zusammenfassen. Das ist ein ziemlich guter Grund das genau so zu machen, wie man es macht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

15.12.2013, 22:27

Ok, auch dir erst mal vielen Dank :thumbsup: !
Ja, allerdings benutze ich Vektor, sowohl als Richtungsangabe, als auch als Koordinatenangabe, synonym, denn für mich ist ein Vektor erst mal eine "Sammlung" von Zahlen, die dann dem Kontext nach ausgewertet werden muss... Aber um das Ganze mal etwas übersichtlicher und verständlicher zu machen, spreche ich dann jetzt erst mal von Richtungsvektoren und Punkten ;) .
Ok, also sind die "homogenen Koordinaten" im Endeffekt eine Optimierung und Verallgemeinerung, um alle Punktveränderungen in eine Matrix "packen" zu können, was natürlich sinnvoll für laufzeitkritische Anwendungen ist.
Aber sollte ich nun den Konvertierungsoperator (eine sehr allgemeine Vektorklasse, nicht nur für (3D-)Spiele gedacht) eines 3D-Punkts in einen 4D-Punkt wirklich so gestalten, dass dieser mir den Punkt so zurückliefert, wie ich ihn für die Benutzung in diesem Spezialfall benötige (mit W = 1) oder so wie man ihn ja eigentlich erwarten würde (mit W = 0)? Mir scheint nämlich aus allgemeiner Mathematischer Sicht sinnvoller, aber ich lasse mich natürlich auch gerne belehren ;) !

Danke :)

6

15.12.2013, 22:53

Aber sollte ich nun den Konvertierungsoperator (eine sehr allgemeine Vektorklasse, nicht nur für (3D-)Spiele gedacht) eines 3D-Punkts in einen 4D-Punkt wirklich so gestalten, dass dieser mir den Punkt so zurückliefert, wie ich ihn für die Benutzung in diesem Spezialfall benötige (mit W = 1) oder so wie man ihn ja eigentlich erwarten würde (mit W = 0)? Mir scheint nämlich aus allgemeiner Mathematischer Sicht sinnvoller, aber ich lasse mich natürlich auch gerne belehren ;) !
Ich bin mir nicht sicher, ob es hier eine allgemeinere mathematischer Sicht gibt. Wenn du ein Element aus dem R^3 ins R^4 überträgst, dann gibt es da nicht "die" Methode für. Wie das w gesetzt wird ist zunächst mehr oder weniger willkürlich.
Für den konkreten Fall der 3D-Grafik ist aber, aus den genannten Gründen der vereinfachten Darstellbarkeit der benötigten Transformationen als Matrix, eigentlich der einzig sinnvolle Weg, w nunmal für Punkte auf den Wert 1 und für (Richtungs-)Vektoren auf 0 zu setzen.
W = 0 erwartest du hier eigentlich nur, weil du für dich forderst, dass die Länge des R^3-Elements auch im R^4 beibehalten wird. Das ist, wie bereits gesagt, für Punkte nicht erforderlich. ;)

7

16.12.2013, 13:09

Ja, da hast du natürlich Recht :) ...
Allerdings finde ich es etwas merkwürdig, den Punkt dann um eins in W-Richtung zu verschieben. Wie gesagt, wenn ich im R^2 einen Punkt bei z.B. (2|3) hab', dann würde ich ihn eigentlich so aus'm Bauch raus im R^3 auf (2|3|0) setzten. Naja, dann mach ich des im Konvertierungsoperator mal mit 0 und bastel mir dann noch 'ne Funktion dazu, bei der man das W selber festlegen kann, ist glaub ich das universellste ;) .

Aber nochmal Danke für eure Antworten, ihr Beiden :thumbsup: :thumbup: !


Grüße Benjamin :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

16.12.2013, 15:30

Die Vektoren, mit denen wir arbeiten sind Koordinatenvektoren. Ein solcher Vektor identifiziert einen Punkt relativ zu einem bestimmten Koordinatensystem, der Vektor ist aber nicht der Punkt selbst. Ich kann z.B. auf alle möglichen Arten drei Koordinatenachsen festlegen; ein und der selbe Punkt wird dann immer durch jeweils andere Koordinaten bestimmt.

Homogene Koordinaten beschreiben Punkte in einem sog. projektiven Raum; diese vierdimensionalen Vektoren hier sind nicht einfach nur Koordinaten von Punkten im §\mathbb R^4§. Vielmehr gibt es in einem projektiven Raum Punkte, die es im euklidischen Raum gar nicht gibt (z.B. Fernpunkte). Allerdings ist der dreidimensionale euklidische Raum im Prinzip eine Untermenge des dreidimensionalen projektiven Raums (in welchem Punkte z.B. durch vierdimensionale homogene Koordinaten beschrieben werden). Und zwar genau die Untermenge der Punkte für die §w = 1§ ist... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (16.12.2013, 15:36)


9

16.12.2013, 21:06

Ok, ich versteh erst mal nur Bahnhof :D .
Aber werd' mich nochmal intensiver in das Thema reinlesen, schadet ja auch nie 'n bisschen Hintergrundwissen ;).
Aber echt nochmal danke für eure Antworten :) !
Wenn dann noch was unklar is' meld' ich mich hier nochmal ;) .

Grüße Benjamin :)

10

16.12.2013, 23:51

Naja, für die meisten Sachen ist das auch gar nicht so wichtig. 4-dimensionale Vektoren brauchst du eigentlich nur, wenn du sie mit Matrizen multiplizieren willst, und dann benutzt du als w-Komponente immer nur 0 oder 1. Du solltest wissen, wann du was benutzen musst und auch am besten anhand der Matrizenmultiplikation nachvollzogen haben, was genau dabei passiert.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige