View Full Version : [FRAGE] - Aufgabe 3a: TRANSLATE_LEFTTRANSLATE
hallo,
habe gerade in CG1Object TRANSLATE_LEFT und TRANSLATE_RIGHT implementiert und habe nun eine kleine Verständnisfrage zu TRANSLATE_LEFTTRANSLATE
ist hier nur gemeint, dass ich das ganze auf den ursprung (x=0, y=0, z=0) hin verschiebe: also zb:
// gegenwärtige Werte auslesen
x = modelMatrixPunkt.m[0][3];
y = ...
z = ...
// verschiebe zum Ursprung
modelMatrixPunkt.m[0][3] = 0;
... // bzw. über multLeft(newMatrix.setTranslation(-x,-y,-z));
und dann die Transformation durchführe und das ganze wieder auf die alten koordinaten hin verschiebe (mit multLeft(new Matrix...)) (hab ich zumindest mal so gemacht) oder ist hier zb bei der Rotation gemeint, dass ich die Inverse bilde (Buch 3. Auflage Seite 266) und dann die Transformation durchführe?
bei letzterer Methode könnte ich ja gleich von der Einheitsmatrix ausgehen, da M*M^-1 = E ist. Erstere Methode mach für mich zumindest bei der Translation wenig Sinn, da sich hierdurch nichts verändert, wohingegen bei rotationen das ergebnis bei einer drehung um den ursprung schon ein unterschied entstehen kann.
lg,
roman
Matthias
17-10-2004, 20:27
LEFTTRANSLATE sollte ungefähr so aussehen:
zum Ursprung verschieben (-posx, -posy, -posz)
dann die Operation (rotieren, translieren, skalieren)
wieder zurück verschieben (posx, posy, posz)
und dabei immer multLeft verwenden. Und ja, du hast richtig erkannt, dass das bei Translation wenig Sinn macht, dort entspricht das LEFTTRANSLATE dem normalen LEFT.
Wahrscheinlich stimmt dein Code eh. Mir iss nämlich aufgefallen, dass bei der MultLeft von der CG1Matrix4x4 in der VERGLEICHSMATRIX in der TEST() ein Fehler ist. die letzte Spalte sollte meiner Meinung nach 6 6 5 1 lauten.........
(oops. richtige antwort zur falschen frage...)
hallo,
ich glaub du hast multLeft mit multRight vertauscht. das argument bedeutet, dass die als argument übergebene matrix links oder rechts (je nach aufruf) steht. also m1.multLeft(m2) --> m2*m1, während m1.multRight(m2) --> m1*m2 ist.
wenn ich m4.multLeft(m3) rechne, dann erhalte ich:
2006
0306
0015
0001
wenn ich m3.multLeft(m4) rechne, dann erhalte ich:
2003
0302
0015
0001
wenn ich dann m3.multRight(m4) rechne passt das ergebnis mit jener der lösung auch überein.
lg,
roman
ChrisChiu
19-10-2004, 17:45
Wahrscheinlich stimmt dein Code eh. Mir iss nämlich aufgefallen, dass bei der MultLeft von der CG1Matrix4x4 in der VERGLEICHSMATRIX in der TEST() ein Fehler ist. die letzte Spalte sollte meiner Meinung nach 6 6 5 1 lauten.........
(oops. richtige antwort zur falschen frage...)
Scheint mir nicht falsch zu sein, aber ich hab's nochmal auf Papier nachgerechnet:
m3 =
| 2 0 0 0 |
| 0 3 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
d.h. setScale(2, 3, 1)
m4 =
| 1 0 0 3 |
| 0 1 0 2 |
| 0 0 1 5 |
| 0 0 0 1 |
d.h. setTranslate(3, 2, 5)
m3.multLeft(m4), d.h.
m4 * m3 =
| 2 0 0 3 |
| 0 3 0 2 |
| 0 0 1 5 |
| 0 0 0 1 |
Die ganz rechte Spalte ergibt sich ja aus:
1 * 0 + 0 * 0 + 0 * 0 + 3 * 1 = 3
(also 1. Zeilenvektor von m4 = [1 0 0 3] mit rechtem Spaltenvektor von m3 = [0 0 0 1])
0 * 0 + 1 * 0 + 0 * 0 + 2 * 1 = 2
(also 2. Zeilenvektor von m4 = [0 1 0 2] mit rechtem Spaltenvektor von m3 = [0 0 0 1])
0 * 0 + 0 * 0 + 1 * 0 + 5 * 1 = 5
(also 3. Zeilenvektor von m4 = [0 0 1 5] mit rechtem Spaltenvektor von m3 = [0 0 0 1])
0 * 0 + 0 * 0 + 0 * 0 + 1 * 1 = 1
(also 4. Zeilenvektor von m4 = [0 0 0 1] mit rechtem Spaltenvektor von m3 = [0 0 0 1])
Ich wüsst nicht wie hier etwas anderes rauskommen könnte, außer man hat multLeft falsch implementiert.
soo .. hab das mal implementiert ... ich will jetzt nur wissen ob das verhalten richtig ist:
links: transformation wird nach allen anderen transformationen gemacht
rechts: transformation wird vor allen anderen transformationen gemacht
translinks: transformation wird nach allen anderen transformationen auf dem objektnullpunkt gemacht.
Matthias
19-10-2004, 20:58
soo .. hab das mal implementiert ... ich will jetzt nur wissen ob das verhalten richtig ist:
links: transformation wird nach allen anderen transformationen gemacht
rechts: transformation wird vor allen anderen transformationen gemacht
translinks: transformation wird nach allen anderen transformationen auf dem objektnullpunkt gemacht.
ja, sollte passen.
NightHaG
21-10-2004, 14:35
[edit] Hat sich erübrigt.
hallo,
also setTranslate sowie setRotateX(Y u. Z) sowie setScale beziehen sich hier auf das objekt im weltkoordinatensystem und verändern dessen position und größe dementsprechend. CG1Object.translate() überführt dahingegen die vertices des Objektes von den lokalen Koordinaten (wie sie im .atoff definiert sind) in ein Device-Koordinatensystem, damit es am bildschirm ausgegeben werden kann. Hierzu rechnest du nach möglichkeit solange wie möglich mit den matrizen und nimmst erst die projektionsmatrix her um die punkte zu transformieren und anschließend in der canvas.getDeviceCoordinates()-Methode in Bildschirmkoordinaten zu wandeln
lg,
roman
NightHaG
21-10-2004, 15:03
Ähm....
Ich habs so verstanden setTranslate() formt mir meine Matrix so um, dass es eine Translationsmatrix ist. Diese muss ich dann einfach mit der Transformationsmatrix multiplizieren um die Translation in die Transformationsmatrix "einzuspeichern".
Wie dem auch sei ich hab eine andere Frage. Wie kann ich denn testen ob meine Implementierung funktioniert?
ach ja, nochwas ... bei den normalvektoren ist translate_lefttranslate/translate_left doch ein und das selbe ? bei einem vektor ist es doch egal wo ich ihn drehe oder skaliere ...
Matthias
21-10-2004, 22:32
ach ja, nochwas ... bei den normalvektoren ist translate_lefttranslate/translate_left doch ein und das selbe ? bei einem vektor ist es doch egal wo ich ihn drehe oder skaliere ...
ja, beim vektor ist TRANSFORMATION_LEFT und TRANSFORMATION_LEFTTRANSLATE das selbe.
Matthias
21-10-2004, 22:40
Wie dem auch sei ich hab eine andere Frage. Wie kann ich denn testen ob meine Implementierung funktioniert?
Das kannst du wohl erst nachdem du das ganze 3. Beispiel implementiert hast. Dann sieht man leicht die Unterschiede der 3 Transformationsarten indem man sich ein bißchen herumspielt.
z.B. den Würfel laden, auf der y Achse nach oben verschieben.
Dann eine Rotation um die x-Achse:
bei LEFT rotiert das Objekt um die x-Achse der "Welt".
bei RIGHT um die x-Achse von sich selbst
LEFTTRANSLATE sieht, wenn man das Objekt um keine andere Achse rotiert hat, wie RIGHT aus. Daher testweise auch ein Stück um die y-Achse rotieren und dann eine x-Achsen Rotation mit LEFTTRANSLATE machen. Dann sieht man auch dort wie es sich von RIGHT unterscheidet.
Natürlich kann man das ganze auch händisch nachrechnen um zu sehen, ob es stimmt.
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.