K
ich versuchs kurz zu machen:
crabbe schrieb:
Ich glaube du hast das Prinzip des "Bewegens" in einer 3D-Umgebung noch nicht verstanden. Es wird immer die ganze Welt bewegt und nicht die Kamera bzw. der Bildschirm. Wenn du dein Auto jetzt bewegen willst, z.b. nach vorne, so verschiebtst du die Welt nach "hinten", also in diesem Fall näher an den Bildschirm. Korrigiert mich bitte, wenn ich mich irre.
hast du es denn verstanden? wahrscheinlich schon aber du hast es seltsam formuliert.
@FrauBolaIstDumm
in einer 3d-szene gibt es normalerweise immer sowas wie objekte (autos, bäume,...) und eine kamera. wenn sich nun ein objekt bewegt, dann bewegt sich das objekt und nicht die kamera! wenn sich die kamera bewegt, dann bewegt sich die kamera und nicht das objekt. in directx gibt es dafür spezielle matritzen. eine für die objekte, eine für die kameraposition und eine für die kameraprojektion:
//setzt die matrix für das aktuelle objekt
Device->SetTransform(D3DTS_WORLD,&matrix);
//setzt die matrix für die aktuelle kameraposition
Device->GraphicDevice->SetTransform(D3DTS_VIEW,&matrix)
//setzt die matrix für die aktuelle kameraprojektion
Device->SetTransform(D3DTS_PROJECTION,&matrix)
jedes objekt hat nun eine eigene transformationsmatrix, die das objekt "in die welt hineintransformiert", da jedes objekt zuerst einmal sein eigenes koordinatensystem hat. mit hilfe dieser matrix wird es dann in die welt "hinein" gesetzt. dabei ist wichtig zu wissen, das man verschiedene transformationen, wie z.b. rotationen, translationen oder skalierungen, hintereinanderausführen kann, bzw. "zusammenaddieren" kann, so das am schluss eine einzige "endtransformation" herauskommt. das ist in etwa dasd gleiche wie
x+(4+6-3+4) ist das selbe wie x+(11)
oder
objekt rotieren*skalieren*translieren ist das selbe wie objekt transformieren
das wird nun mit hilfe von matritzen und matritzenmultiplikation gemacht.
matrix.CreateIdentity
matrix.MultiplyWithRotationMatrix
matrix.MultiplyWithTranslationMatrix
zuerst mal wird eine einheitsmatrix erstellt, die nichts macht, dann wird diese matrix mit einer matrix multipliziert, die eine rotation beschreibt, und dann wird die selbe matrix mit einer matrix multipliziert, die eine translation beschreibt, die endmatrix ist eine matrix, die beides gleichzeitig macht, und diese muss mann dann in directx als WORLD matrix setzen.
das selbe gilt für die kameraposition, nur das hier alles rückwärts gemacht wird. will man also die kamera um 10 einheiten nach vorne bewegen, dann muss man eine bewegung um 10 einheiten nach hinten machen (gleiches gilt für rotationen)
die kameraprojektion ist eigentlich egal, da sie normalerweise (ohne zoom) immer gleich ist. dafür gibt es standardfunktionen (CreateProjectionLH(),...).
in der directx 9 sdk doku steht das alles sehr ausführlich beschrieben...
wenn du nun dein auto genauso wie eine kamera bewegen willst, dann musst du eine matrix erzeugen, die entsprechenden transformationen miteinander multiplizieren und dann die "endmatrix" setzen. das gleiche für die kamera.
sorry für die schlechten formulierungen, aber habe gerade keine zeit für eine ausfürhliche und gute beschreibung.