Koordinatensysteme
-
Hi Leute,
also ich bräuchte Hilfe bei DirectX in sachen Koordinatensystemen. Meine Szene besteht aus 10 Würfeln die zufällig im Raum verteilt sind. Ich habe eine Projektions- Welt- und Kameramatrix. Ich kapiere mittlerweile das die Vertices jedes einzelnen Würfels relativ zu seinem Mittelpunkt angeordnet sind.
Wie siehts aber mit den Koordinaten der Kamera aus. Hat die auch ihr eigenes System oder richtet sie sich nach den Koordinaten der Welt? Und wenn ich die Welt, also die Weltmatrix, manipuliere, wie siehts dann aus?
Ich weis einfach nicht woran ich mich beim jeweiligen Objekt orientieren soll!
-
aaalso:
jeder würfel hat seinen lokalen mittelpunkt bei 0/0/0 (denk ich jetzt mal) und die ecken dann um den mittelpunkt drum rum. An der Projektionsmatrix brauchst du erstmal nichts drehen, die setzt du einmal und gut is.
Zur Weltmatrix: Mit ihr kannst du deinen Würfel bewegen. Jeder Würfel hat ne eigene weltmatrix die bestimmt, wie er gedreht is, skaliert is und wo er liegt. Also setzt du die Weltmatrix, renderst Würfel 1, setzt eine neue Weltmatrix und renderst Würfel 2 usw.
Kamera: Stell dir vor du bist die Kamera, also da wo die kamera is, sind deine augen. Du brauchst dann drei Angaben: 1) Wo bist du, also die Position. die Ist absolut und wird nicht durch die weltmatrix transformiert. Also wenn die Kamera bei 8/0/0 is und die weltmatrix aber um 0/0/8 verschiebt, ist deine kamera trotzdem noch bei 8/0/0. Weiterhin musst du als Beobachter wissen, wo oben is. das ist meist in Richtung 0/1/0 relativ! zur Kameraposition. Und zu letzt musst du noch wissen, wohin du gucken willst. Diese Angabe ist ebenfalls absolut und wird nihct durch die weltmatrix transformiert, und die is auch nicht! realtiv zur kameraposition.
Hoffe konnte helfen...
-
Eine eigene matrixklasse kann meiner meinung nach das leben sehr erleichtern. Vor allem sind dann funktionen nützlich, die grad die Koordinatensysteme-transformationsmatrizen erstellen. Wenn man die geschichte mit skalierung weglässt (wer ein modell skalieren will, solls gleich tun, und koordinatensysteme in ruhe lassen), kann man ein koordinatensystem mit vier vektoren wunderbar beschreiben: ein positionsvektor und drei normierte achsen-richtungsvektoren, die eigenlich alle orthogonal aufeinander stehen, normalerweise...
Dann kann man zwei funktionen schreiben:Eine rechnet die Globalen Koordinaten eines punktes in lokale koordinaten um (zB: Ein betrachter befindet sich im punkt 3|4|10 und guggt nach rects und eine granate befindet sich grade auf der position 3|6|9, wo befindet sich die granate relativ zum beobachter? ) Da braucht ma so eine matrix:
1 0 0 0 xx yx zx 0 GlobToLoc= 0 1 0 0 X xy yy zy 0 0 0 1 0 xz yz zz 0 -px -py -pz 1 0 0 0 1vobei vektor "p" die position des lokalen koordinatensystems (3,4,10)
und "x" "y" und "z" die achsenverktoren sind (0,1,0) (-1,0,0) (0,0,1)Nichts anderes macht auch die kameramatrix: globalen koordinaten werden in die lokalen kordinaten der kamera transformiert und dann projeziert.
Andersrum musst du bei ecken des würfels die lokale position der ecke in die globale koordinaten umrechnen, das geht mit dieser matrix:
xx xy xz 0 1 0 0 0 LocToGlob= yx yy yz 0 X 0 1 0 0 zx zy zz 0 0 0 1 0 0 0 0 1 px py pz 1Hoffe, dass es dir irgendetwas bringt :p
Naja, wenn man einmal verstanden hat, was welche matrizen machen, kann man die beliebig kombinieren, das ist ja grad das tollste dran, man konnte zum beispiel mit einer kameramatrix irgendetwas auf einen virtuellen Überwachungsanlage-Bildschirm abbilden, und dann mit einer zweiten kameramatrix diesen bildschirm in eine szene rendern, die den raum mit diesen bildschirmen und wachleuten darstellt, man kann also nich sagen, dass kameramatrizen niemals mit weltmatrizen transformiert werden können. Ich bin mir nicht mehr sicher, aber so etwas in der art wurde glaub ich in Quake III arena mit den teleporter-portalen gemacht, da könnte man so... durchschauen, und da wurde ein anderer bereich der arena mit einer anderen kameramatrix dargestellt, und dann obendrauf gedreht, auf das portal projeziert, und erst dann mit der normalen kameramatrix auf den echten hardware-bildschirm abgebildet... hm... möglicherweise wurde es auch zuerst in eine textur gerendert, dann draufgeklebt... nja, egal, ich muss eh noch laaange üben bis ich sowas wie das portal rendern kann...

-
Hi, danke erstmal für die Hilfe, echt Klasse!
Hab da aber noch Fragen!@Maxi:
Wieso mehrere Weltmatrizen? Ich dachte man setzt immer nur eine, welche sozusagen den ganzen Raum (also die Welt) darstellt. Ich bewege meine Würfel mit Translationsmatrizen, manipuliere die Posotion des Würfels und multipliziere diese dann, eben, mit der einen Weltmatrix.
Hab ich da was falsch verstanden? Ich rendere nämlich alle meine Würfel auf einmal.@Andrey:
Was heist absolut? An was orientieren sich absolute Koordinaten, also wo liegt deren Ursprung?
-
zu der frage 1) an maxi:
Die translationsmatrizen, die du für jeden würfel einsetzst, sind ja grade die "weltmatrizen" für jeden einzelnen würfel.
es ist in etwa so:
-du hast ein würfel mit lokalen eckpunkten, zB bei (1,1,1) (1,1,-1) (1,-1,-1) usw...
-diese lokalen koordinaten rechnest du mit deiner Weltmatrix (hier einfache translationsmatrix) in globale koordinaten um: wenn dein würfel um (2,3,7) verschoben ist, musst du jeden eck-vertex auch um (2,3,7) verschieben, aus (1,1,1) wird dann zb (3,4,7). ( Würfel-LOKAL -> GLOBAL)
-Jetzt weisst du di gloablen koordinaten der einzelnen ecken, und die globalen koordinaten der kamera, bzw ihre ausrichtung im globalen raum. Jetzt willst du aber wissen, wie es von der kamera aus aussieht. Deswegen rechnest du die Globalen Eckpunktkoordinaten ins lokale koordinatensystem der kamera um
( GLOBAL -> Kamera-LOKAL)
-Dann projezierst du das ganze mit deiner projektionsmatrix, wie auch immer die aussiehtzu der 2. frage: Nun ja, die frage ist etwas komisch, "absolute" oder "globale" koordinaten heisst (für mich zumindest...) einfach:
Ursprung bei (0,0,0) Achsenvektoren: x=(1,0,0) y=(0,1,0) z=(0,0,1)Und darauf baust du halt deine ganze welt auf. Kannst zum beispiel auf deinem globalen ursprung eine virtuelle stadt gründen. Oder grad den mittelpunkt einer map plazieren. Und n AK47 hinschmeissen, damit die leut sich n bissl freuen. Die spieler, bzw die beobachter haben ihre koordinaten dann ebenfalls in diesem globalen koordinatensystem, zb kann ein spieler im punkt (1,0,1) stehen (da ist dann sein kopf oder so) und auf das ak47 guggn: seine Koordinatensystemachsen wären dann zB so geneigt, dass seine zAchse genau auf das ak47 zeigt, und die yAchse möglichst nach "unten" zeigt (Da bin ich auch immer noch ein bisschen verwirrt, eigentlich heisst es 'Nach Oben Vektor' , aber ich verstehs nich, die yAchse auf dem bildschirm zeigt doch nach unten, aber naja, egal..., lässt sich alles mit einem einzigen '-' wieder ausbeulen)
Die stadt kann auch 128.956 einheiten unter dem ursprung liegen, ist eigentlich egal, solangs nicht in einer anderen galaxie liegt, denn ansonsten würds zu overflow errors bei float-werten kommen, und überhaupt... soll schon irgendeinen sinn haben, wie du deine welt relativ zum ursprung ausrichtest. Achsen sollt man nicht unbedingt neigen, wenn man später nicht feststellen will, dass die leute auf den wänden herumkriechen, anstatt normal auf dem boden zu laufen.. njo...
