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

Aktuelle Zeit: Mi Mär 20, 2019 06:36

Foren-Übersicht » Sonstiges » Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Matrix Modifikationen in Pascal
BeitragVerfasst: Do Mär 13, 2014 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1203
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wie im Forum gewünscht stelle ich meinen Matrix-Funktione zur Verfügung.

Wen jemand ein Fehler entdeck, bitte melden.
Bis auf die Procedure TMatrixModif.Rotate(var Matrix: TMatrix; Winkel, x, y, z: GLfloat); arbeitet die Bibliothek nach meine wünschen.

Diskussions-Thread hier


Code:
  1. type
  2.     TMatrix = array[0..3, 0..3] of GLfloat;
  3.  
  4. procedure TMatrixModif.Rotate(var Matrix: TMatrix; Winkel, x, y, z: GLfloat);
  5. var
  6.   c, s: GLfloat;      // Funktionierts ?????
  7.   m: TMatrix;
  8. begin
  9.   c := cos(Winkel);
  10.   s := sin(Winkel);
  11.  
  12.   m:=self.EinheitsMatrix;
  13.  
  14.   m[0, 0] := x * x * (1 - c) + c;
  15.   m[1, 0] := x * y * (1 - c) - z * s;
  16.   m[2, 0] := x * z * (1 - c) + y * s;
  17.  
  18.   m[0, 1] := y * x * (1 - c) + z * s;
  19.   m[1, 1] := y * y * (1 - c) + c;
  20.   m[2, 1] := y * z * (1 - c) - x * s;
  21.  
  22.   m[0, 2] := x * z * (1 - c) - y * s;
  23.   m[1, 2] := y * z * (1 - c) + x * s;
  24.   m[2, 2] := z * z * (1 - c) + c;
  25.   Matrix := self.MultiplyMatrices(Matrix,m);
  26. end;
  27.  
  28. //procedure TMatrixModif.Rotate(var Matrix: TMatrix; Winkel, x, y, z: GLfloat);
  29. //var
  30. //  c, s: GLfloat;      // Funktionierts ?????
  31. //begin
  32. //  c := cos(Winkel);
  33. //  s := sin(Winkel);
  34.  
  35. //  Matrix[0, 0] := x * x * (1 - c) + c;
  36. //  Matrix[1, 0] := x * y * (1 - c) - z * s;
  37. //  Matrix[2, 0] := x * z * (1 - c) + y * s;
  38.  
  39. //  Matrix[0, 1] := y * x * (1 - c) + z * s;
  40. //  Matrix[1, 1] := y * y * (1 - c) + c;
  41. //  Matrix[2, 1] := y * z * (1 - c) - x * s;
  42.  
  43. //  Matrix[0, 2] := x * z * (1 - c) - y * s;
  44. //  Matrix[1, 2] := y * z * (1 - c) + x * s;
  45. //  Matrix[2, 2] := z * z * (1 - c) + c;
  46. //end;
  47.  
  48.  
  49. procedure TMatrixModif.Translate(var Matrix: TMatrix; x, y, z: GLfloat); inline;
  50. begin
  51.   Matrix[3, 0] := Matrix[3, 0] + x;
  52.   Matrix[3, 1] := Matrix[3, 1] + y;
  53.   Matrix[3, 2] := Matrix[3, 2] + z;
  54. end;
  55.  
  56.  
  57. procedure TMatrixModif.RotateX(var Matrix: TMatrix; Winkel: GLfloat);
  58. var
  59.   i: integer;
  60.   y, z, c, s: GLfloat;
  61. begin
  62.   c := cos(Winkel);
  63.   s := sin(Winkel);
  64.   for i := 0 to 2 do begin
  65.     y := Matrix[i, 1];
  66.     z := Matrix[i, 2];
  67.     Matrix[i, 1] := y * c - z * s;
  68.     Matrix[i, 2] := y * s + z * c;
  69.   end;
  70. end;
  71.  
  72.  
  73. procedure TMatrixModif.RotateY(var Matrix: TMatrix; Winkel: GLfloat);
  74. var
  75.   i: integer;
  76.   x, z, c, s: GLfloat;
  77. begin
  78.   c := cos(Winkel);
  79.   s := sin(Winkel);
  80.   for i := 0 to 2 do begin
  81.     x := Matrix[i, 0];
  82.     z := Matrix[i, 2];
  83.     Matrix[i, 0] := x * c - z * s;
  84.     Matrix[i, 2] := x * s + z * c;
  85.   end;
  86. end;
  87.  
  88.  
  89. procedure TMatrixModif.RotateZ(var Matrix: TMatrix; Winkel: GLfloat);
  90. var
  91.   i: integer;
  92.   x, y, c, s: GLfloat;
  93. begin
  94.   c := cos(Winkel);
  95.   s := sin(Winkel);
  96.   for i := 0 to 2 do begin
  97.     x := Matrix[i, 0];
  98.     y := Matrix[i, 1];
  99.     Matrix[i, 0] := x * c - y * s;
  100.     Matrix[i, 1] := x * s + y * c;
  101.   end;
  102. end;
  103.  
  104.  
  105. procedure TMatrixModif.Scale(var Matrix: TMatrix; Faktor: GLfloat);
  106. var
  107.   x, y: integer;
  108. begin
  109.   for x := 0 to 2 do begin
  110.     for y := 0 to 2 do begin
  111.       Matrix[x, y] := Matrix[x, y] * Faktor;
  112.     end;
  113.   end;
  114. end;
  115.  
  116. procedure TMatrixModif.Scale(var Matrix: TMatrix; FaktorX, FaktorY, FaktorZ: GLfloat);
  117. var
  118.   i: integer;
  119. begin
  120.   for i := 0 to 3 do begin
  121.     Matrix[i, 0] := Matrix[i, 0] * FaktorX;
  122.     Matrix[i, 1] := Matrix[i, 1] * FaktorY;
  123.     Matrix[i, 2] := Matrix[i, 2] * FaktorZ;
  124.   end;
  125. end;
  126.  
  127. function TMatrixModif.MultiplyMatrices(m1, m2: TMatrix): TMatrix;
  128. var
  129.   i, j, k: integer;
  130. begin
  131.   for i := 0 to 3 do begin
  132.     for j := 0 to 3 do begin
  133.       Result[i, j] := 0;
  134.       for k := 0 to 3 do begin
  135.         Result[i, j] := Result[i, j] + m2[i, k] * m1[k, j];
  136.       end;
  137.     end;
  138.   end;
  139. end;
  140.  
  141. procedure TMatrixModif.WriteMatrix(var Matrix: TMatrix);
  142. var
  143.   x, y: integer;
  144. begin
  145.   for y := 0 to 3 do begin
  146.     for x := 0 to 3 do begin
  147.       Write(FormatFloat('###0.0000', Matrix[x, y]));
  148.     end;
  149.     Writeln;
  150.   end;
  151. end;  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix Modifikationen in Pascal
BeitragVerfasst: Do Apr 03, 2014 21:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1203
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Eine kleine Erweiterung.

Matrixmultiplikation einfach gemacht:
Code:
  1. operator * (const m1, m2: TMatrix) res: TMatrix;
  2. var
  3.   i, j, k: integer;
  4. begin
  5.   for i := 0 to 3 do begin
  6.     for j := 0 to 3 do begin
  7.       Res[i, j] := 0;
  8.       for k := 0 to 3 do begin
  9.         Res[i, j] := Res[i, j] + m2[i, k] * m1[k, j];
  10.       end;
  11.     end;
  12.   end;
  13. end;  

Somit kann man Matrixen gleich einfach multiplizieren wie im Shader.
Code:
  1.  
  2. var
  3.   m : TMatrix;
  4. .....
  5.         m := FrustumMatrix * CameraMatrix * Matrix;
  6.         glUniformMatrix4fv(Matrix_id, 1, False, @m);
  7.  

Auch gibt es einen Frustum, dies wurde im Forum gewünscht:
Code:
  1. procedure SetFrustum(left, right, bottom, top, znear, zfar: glFloat);
  2. begin
  3.   FrustumMatrix := EinheitsMatrix;
  4.   FrustumMatrix[0, 0] := 2 * znear / (right - left);
  5.   FrustumMatrix[1, 1] := 2 * znear / (top - bottom);
  6.   FrustumMatrix[2, 0] := (right + left) / (right - left);
  7.   FrustumMatrix[2, 1] := (top + bottom) / (top - bottom);
  8.   FrustumMatrix[2, 2] := -(zfar + znear) / (zfar - znear);
  9.   FrustumMatrix[2, 3] := -1;
  10.   FrustumMatrix[3, 2] := -2 * zfar * znear / (zfar - znear);
  11.   FrustumMatrix[3, 3] := 0;
  12. end;  


Bei InitScene kommt folgendes,
Code:
  1.   SetFrustum(-1.0, 1.0, -1.0, 1.0, 10, 70.0);
  2.   Translate(CameraMatrix, 0, 0, -15);

Bei RenderScene muss der Frustum nur noch mit multipliziert werden.
Code:
  1.   m := FrustumMatrix * CameraMatrix * Matrix;
  2.   glUniformMatrix4fv(Matrix_id, 1, False, @m);
  3.  

Wen der Wunsch besteht, kann ich den ganzen Quellcode für die Frustum Demonstration posten.

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.058s | 15 Queries | GZIP : On ]