DGL
https://delphigl.com/forum/

Matrix Modifikationen in Pascal
https://delphigl.com/forum/viewtopic.php?f=13&t=11135
Seite 1 von 1

Autor:  mathias [ Do Mär 13, 2014 20:29 ]
Betreff des Beitrags:  Matrix Modifikationen in 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;  

Autor:  mathias [ Do Apr 03, 2014 21:57 ]
Betreff des Beitrags:  Re: Matrix Modifikationen in 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.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/