Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Nov 10, 2024 20:42

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Matrix Translation
BeitragVerfasst: Sa Jan 04, 2014 19:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe mir gerade den Quelltext der OpenGL SE SDK von Android angeguckt.

Code:
  1. public static void translateM(float[] m, int mOffset,  float x, float y, float z)
  2. {
  3.   for (int i=0 ; i<4 ; i++) {
  4.      int mi = mOffset + i;
  5.      m[12 + mi] += m[mi] * x + m[4 + mi] * y + m[8 + mi] * z;
  6.   }
  7. }


Und ich habe es sehr einfach in Delphi gelöst. Was mache ich falsch, das Java soviel Multiplikationen hat, abgesehen von dem mOffset ?
Code:
  1. var
  2.   TMatrix = array[0..3, 0..3] of GLfloat;  
  3.  
  4. procedure TMatrixModif.Translate(var Matrix: TMatrix; x, y, z: GLfloat);
  5. begin
  6.   Matrix[3, 0] := Matrix[3, 0] + x;
  7.   Matrix[3, 1] := Matrix[3, 1] + y;
  8.   Matrix[3, 2] := Matrix[3, 2] + z;
  9. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: Sa Jan 04, 2014 19:39 
Offline
DGL Member
Benutzeravatar

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:
  1. public static void translateM(float[] m, float x, float y, float z)
  2. {
  3.   m[12] += m[0]*x + m[4]*y + m[8]*z
  4.   m[13] += m[1]*x + m[5]*y + m[9]*z
  5.   m[14] += m[2]*x + m[6]*y + m[10]*z
  6.   m[15] += m[3]*x + m[7]*y + m[11]*z
  7. }

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: Sa Jan 04, 2014 20:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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 ? :roll:

Code:
  1. procedure TMatrixModif.Translate(var Matrix: TMatrix; x, y, z: GLfloat);
  2. var
  3.   i: integer;
  4. begin
  5.   for i := 0 to 3 do begin
  6.     Matrix[3, i] := Matrix[3, i] + Matrix[0, i] * x + Matrix[1, i] * y + Matrix[2, i] * z;
  7.   end;
  8. end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: So Jan 05, 2014 13:53 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: So Jan 05, 2014 23:11 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Verstehe ich das richtig ?

Z.B. bei einem Dreieck. E
Eine TriangleMatrix, als Einheitsmatrix erzeuge, dann eine DrehMatrix, diese beiden multipliziere und das Ergebniss in den Shader schreibe.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: Mi Jun 20, 2018 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Nun habe ich unterdessen beide Varianten zur Translation. Die NewTranslate verhält sich ähnlich wie bei einer Turtle-Grafik.
Code:
  1. procedure TMatrixHelper.Translate(v: TVector3f); inline;
  2. begin
  3.   Self[3, 0] += v[0];
  4.   Self[3, 1] += v[1];
  5.   Self[3, 2] += v[2];
  6. end;
  7.  
  8. procedure TMatrixHelper.NewTranslate(x, y, z: GLfloat);
  9. var
  10.   i: integer;
  11. begin
  12.   for i := 0 to 3 do begin
  13.     Self[3, i] += Self[0, i] * x + Self[1, i] * y + Self[2, i] * z;
  14.   end;
  15. end;

Nun zu Frage, gibt es für diese beiden Varianten Namen ?
Da NewTranslate ist ein Phantasiename von mir.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: Fr Jun 22, 2018 01:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
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).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: Fr Jun 22, 2018 20:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Worldspace Translation (deine alte) vs. Localspace Translation (deine neue).

Dies hilft mir weiter, da ich in meinem Tutorial überall Worldspace-Version habe, werde ich die 2. Variante auf Localspace umbenennen.

Schlussendlich, kommt es auf den Anwendungsfall an, welche Version man bevorzugt.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Translation
BeitragVerfasst: Sa Jul 14, 2018 19:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Muss man bei LocalSpace den W-Wert der Vektoren auch mit einbeziehen ?

Code:
  1. procedure Tmat4x4Helper.TranslateLocalspace(x, y, z: GLfloat);
  2. var
  3.   i: integer;
  4. begin
  5.   for i := 0 to 3 do begin  // Mit W
  6.     Self[3, i] += Self[0, i] * x + Self[1, i] * y + Self[2, i] * z;
  7.   end;
  8. // oder
  9.   for i := 0 to 2 do begin  // ohne W
  10.     Self[3, i] += Self[0, i] * x + Self[1, i] * y + Self[2, i] * z;
  11.   end;
  12. end;

Bei dem Java-Code ist dies der Fall, aber ob das richtig ist, weis ich nicht ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.028s | 15 Queries | GZIP : On ]