PDA

View Full Version : [Frage] Bsp. 3A In den Ursprung verschieben (woher Fixpunkt)


Boromir
09-11-2004, 14:49
Eigentlich steht meine Frage eh schon im Title.

Woher bekomm ich den Punkt von dem aus ich mein Objekt in den Ursprung verschiebe?? Ich muss ja einen Fixpunkt (an)nehmen, von dem aus in den Ursprung translieren und dann wieder zurücktranslieren.

Bitte um Hilfe.

Jeff_Mills
09-11-2004, 15:03
Also ich denke den Fixpunkt ist ein freier Parameter. Du kannst den punkt im ursprung annehmen, dann waere die Translation der Nullvektor.
Ich habe die UE vor 2 jahren gemacht also bin ich mir nicht mehr sicher.

ChrisChiu
09-11-2004, 18:52
Eigentlich steht meine Frage eh schon im Title.

Woher bekomm ich den Punkt von dem aus ich mein Objekt in den Ursprung verschiebe?? Ich muss ja einen Fixpunkt (an)nehmen, von dem aus in den Ursprung translieren und dann wieder zurücktranslieren.

Bitte um Hilfe.

In der aktuellen Transformationsmatrix nimmst du die Komponenten, die die Translation darstellen, und zwar sind das die obersten drei Zeilen der letzten Spalte.

NightHaG
09-11-2004, 22:54
Wenn du damit die modelMatrixPoint meinst, die wird doch als Einheitsmatrix initialisiert, oder? Weil mein code sieht derzeit so aus

fixpoint.x = modelMatrixPoint [0][3] usw. also wie du es sagtest
wenn transformationmode = translate lefttranslate (also die byte variable "2" ist)
modelMatrixPoint.multleft(neue 4x4matrix.settranslate(-fixpoint.x,-fixpoint.y,-fixpoint.z));
gewünschte transformation mit multleft in die modelMatrixPoint multiplizieren und dann wieder multleft(neue 4x4matrix.settranslate(fixpoint.x, fixpoint.y, fixpoint.z))


so das müsste in den ursprung zurückverschieben die Transformation durchführen und wieder zurückverschieben. Tut es aber nicht und ich versteh nicht wieso. Wenn ich in dem Modus "T" zb. (Uniform)Skaliere dann wird zum Ursprung hinskaliert und nicht so, dass das Objekt am Punkt grösser bzw. kleiner wird.

ChrisChiu
09-11-2004, 23:23
Wenn du damit die modelMatrixPoint meinst, die wird doch als Einheitsmatrix initialisiert, oder? Weil mein code sieht derzeit so aus


modelMatrixPoint sammelt mit der Zeit die Transformationen, die auf das Objekt einwirken. Am Anfang ist das Objekt im Ursprung, daher ist die Translations-Komponente der modelMatrixPoint 0, 0, 0 (= letzte Spalte, oberste 3 Elemente). Wendest du jetzt eine Transformation an, ändert sich die modelMatrixPoint.

Wenn du translatest, ändern sich in der modelMatrixPoint auch die Elemente, die für Translation zuständig sind. Somit hast du da genau die Koordinaten, um die du bei rotate und scale im TRANSFORMATION_LEFT_TRANSLATE Modus zurückverschieben mußt.


fixpoint.x = modelMatrixPoint [0][3] usw. also wie du es sagtest
wenn transformationmode = translate lefttranslate (also die byte variable "2" ist)
modelMatrixPoint.multleft(neue 4x4matrix.settranslate(-fixpoint.x,-fixpoint.y,-fixpoint.z));
gewünschte transformation mit multleft in die modelMatrixPoint multiplizieren und dann wieder multleft(neue 4x4matrix.settranslate(fixpoint.x, fixpoint.y, fixpoint.z))


Das müsste eigentlich so passen.


so das müsste in den ursprung zurückverschieben die Transformation durchführen und wieder zurückverschieben. Tut es aber nicht und ich versteh nicht wieso. Wenn ich in dem Modus "T" zb. (Uniform)Skaliere dann wird zum Ursprung hinskaliert und nicht so, dass das Objekt am Punkt grösser bzw. kleiner wird.

Könnte der Fehler nicht woanders liegen?

NightHaG
10-11-2004, 11:28
Vielleicht hab ich vergessen zu erwähnen, dass die Transformationen bis jetzt nur bei 2D Objekten wirken, weil meine Viewing Pipeline noch nicht ganz fertig ist. Aber sollte es da nicht auch wie gewünscht funktionieren?

ChrisChiu
10-11-2004, 15:53
Vielleicht hab ich vergessen zu erwähnen, dass die Transformationen bis jetzt nur bei 2D Objekten wirken, weil meine Viewing Pipeline noch nicht ganz fertig ist. Aber sollte es da nicht auch wie gewünscht funktionieren?

Wie in der Angabe erwähnt, funktioniert das ganze erst, wenn die komplette Viewing Pipeline implementiert ist.

Shodan
12-11-2004, 11:22
Also ich nehm den Fixpunkt als Objektmittelpunkt an. Da ich ja die Variablen minX( bis minZ) und maxX (bis maxZ) habe, kann ich mir den Objektmittelpunkt ausrechnen. Den nehm ich dann als Fixpunkt und verschieb das Teil so dass dieser Punkt im Ursprung liegt.

Lieg ich damit vollkommen richtig, teilweise richtig, teilweise falsch oder völlig falsch?:D

ChrisChiu
12-11-2004, 11:43
Also ich nehm den Fixpunkt als Objektmittelpunkt an. Da ich ja die Variablen minX( bis minZ) und maxX (bis maxZ) habe, kann ich mir den Objektmittelpunkt ausrechnen. Den nehm ich dann als Fixpunkt und verschieb das Teil so dass dieser Punkt im Ursprung liegt.

Lieg ich damit vollkommen richtig, teilweise richtig, teilweise falsch oder völlig falsch?:D

Das ist leider nicht richtig. Der "Fixpunkt" ist der Ursprung (also 0, 0, 0) im Objekt-lokalen Koordinatensystem. Das kann das Zentrum des Objekts sein, muß es aber nicht.

Ich würde übrigens von der Fixpunkt-Semantik loskommen - durch die ist die Gefahr groß, dass man Denkfehler macht.

Kurz gesagt: Ein Objekt hat ein lokales Koordinatensystem (das sind genau jene Koordinaten, in denen die Punkte gespeichert sind, so wie man sie aus den atoff-Files liest). Die Objektposition und -orientierung im Raum dagegen wird durch die modelMatrixPoint (also die Modelling Matrix) angegeben, und nicht durch einen "Fixpunkt" oder ähnliches.

Die Modelling Matrix gibt also quasi vereinfacht gesagt an, um wieviel das Objektkoordinatensystem verschoben, rotiert, skaliert wird gegenüber dem Weltkoordinatensystem, und damit, um wieviel das Objekt selbst vom Weltkoordinatenursprung verschoben, rotiert, skaliert wird.

Ich halte es für besser, statt mit "Fixpunkten" lieber mit Koordinatensystemen (objekt-lokal, Weltkoordinatensystem, View-Koordinatensystem, usw.) zu denken.

Der Punkt, um den man verschieben muß ist jedenfalls nicht gespeichert in den Vertizes des Objekts, noch wird er daraus errechnet. Der Punkt, um den man verschieben muß ist in der Modelling Matrix enthalten und wartet nur darauf, extrahiert zu werden.

Sanchez
12-11-2004, 13:37
Klingt logisch. Denn die lokalen Punkte eines Objekts sind ja unabhängig von ihrer tatsächlichen Position in Weltkoordinaten.


Eine Frage hätte ich dabei allerdings noch:

Wenn der Punkt, um den verschoben wird, in der Modelling Matrix steht und nur darauf wartet extrahiert zu werden, frage ich mich nun wie er da überhaupt rein kommt?
Steht der in den atoff-Datein irgendwo? Woher kommen diese Koordinaten in modelMatrixPoint?

NightHaG
12-11-2004, 17:32
Sobald du irgendwann mal eine translation in die Matrix hineinmultiplizierst befindet sich das Objekt woanders. Wenn du um den Vektor wieder zurückverschiebst stehst du im Ursprung.

Ich hätte noch eine Frage.

Ich hab Fehler beim anwenden der Transformationen.
Es geht alles viel zu schnell. Ich drück einmal kurz auf Rotate und das Objekt rotiert blitzschnell in eine unkenntliche Form. Oder noch besseres Beispiel. Beim translieren bewegt sich das Objekt zwar in die richtige Richtung aber sobald ich die Richtung ändere (zb. von +x auf -x) bewegt sich das Objekt kurz noch in die vorherige Richtung weiter und dann in die gewünschte Richtung.

Woran könnte das liegen?

[edit]
gut den Fehler hab ich schon gelöst (hab vergessen die modelMatrixPoint nach der umwandlung in weltkoordinaten wieder auf die einheitsmatrix zu setzen) aber das führt zum nächsten fehler. Die Kamera, in der Fragestunde viel diskutiert immer noch voller Probleme. Meine Kameradistance weist nämlich einen ähnlichen Fehler auf, nur dass der Pixelhaufen sich immer weiter von der Kamera wegbewegt, wenn ich den Cameradistanceregler verschiebe.

ChrisChiu
12-11-2004, 21:05
Klingt logisch. Denn die lokalen Punkte eines Objekts sind ja unabhängig von ihrer tatsächlichen Position in Weltkoordinaten.


Eine Frage hätte ich dabei allerdings noch:

Wenn der Punkt, um den verschoben wird, in der Modelling Matrix steht und nur darauf wartet extrahiert zu werden, frage ich mich nun wie er da überhaupt rein kommt?
Steht der in den atoff-Datein irgendwo? Woher kommen diese Koordinaten in modelMatrixPoint?

Naja, zuerst ist die modelMatrixPoint ja noch die Einheitsmatrix. In der rechtesten Spalte sind die obersten drei Elemente dabei der "Translationsfaktor". Bei einer Einheitsmatrix sind die natürlich 0, 0, 0, also noch ohne Translation.

Werden jetzt im Framework-Interface die Translations-Buttons rechts oben betätigt, dann verschiebt sich das Objekt, da dabei die CG1Object.translate() Methode aufgerufen wird, wo in die modelMatrixPoint eine weitere Translationsmatrix hineinmultipliziert wird (bei affinen Transformationen entspricht das Multiplizieren der Matrix ja einem Aneinanderketten dieser Transformationen). Dadurch bekommt die modelMatrixPoint ihre Translations-Elemente.