Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Für den Fall, dass mOffset = 0 ist, habe ich die for-Schleife in der Java-Funktion mal ausgepackt:
Code:
publicstaticvoid translateM(float[] m, float x, float y, float z)
{
m[12]+= m[0]*x + m[4]*y + m[8]*z
m[13]+= m[1]*x + m[5]*y + m[9]*z
m[14]+= m[2]*x + m[6]*y + m[10]*z
m[15]+= m[3]*x + m[7]*y + m[11]*z
}
Die Funktion rotiert also erst den Vektor (x,y,z) um die Matrix und addiert das Resultat auf die letzte Spalte.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Ich habe dies mal in mein Programm umgesetzt. Das Ergebnis kommt ganz anders.Wen ich skaliert habe, wird diese nicht mehr mitberücksichtigt. Auch der Drehpunkt für weitere Rotationen wird nicht mitverschoben.
was ist nun besser ?
Code:
procedure TMatrixModif.Translate(var Matrix: TMatrix; x, y, z: GLfloat);
var
i:integer;
begin
for i :=0to3dobegin
Matrix[3, i]:= Matrix[3, i]+ Matrix[0, i]* x + Matrix[1, i]* y + Matrix[2, i]* z;
Der konsequenteste Ansatz ist es, überhaupt nicht direkt an der Matrix herumzufummeln, sondern die Matrix einfach mit der (neuen)Translationsmatrix zu multiplizieren. Wie man eine Translationsmatrix erstellt, kann man überall im Internet oder wahlweise DGL nachlesen und die notwendige stinknormale einfache Matrizenmultiplikation auch.
Was nun "besser" ist kommt auf den Anwendungsfall an. Mathematisch am Besten ist auf jeden Fall der eben genannte Ansatz. (Wenn man die Matrixgleichungen vereinfacht, wird man dann vermutlich auf die Rechnung aus dem SDK kommen.)
Z.B. bei einem Dreieck. E Eine TriangleMatrix, als Einheitsmatrix erzeuge, dann eine DrehMatrix, diese beiden multipliziere und das Ergebniss in den Shader schreibe.
Worldspace Translation (deine alte) vs. Localspace Translation (deine neue).
Stell dir vor deine Matrix ist rotiert, mit deiner alten variante (Worldspace) verschiebst du die matrix unabhaengig von ihrer rotation. Also wenn du um 10 units auf X translatest schiebst du die matrix um 10 auf der Welt-X-Achse. Die neue variante (Localspace) hingegen verschiebt die matrix um 10 units entlang der X-Achse der Matrix (welche durch die rotation nicht mehr die gleiche sein muss wie die des Welt-Koordinaten systems).
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.