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: type TMatrix = array[0..3, 0..3] of GLfloat; procedure TMatrixModif.Rotate(var Matrix: TMatrix; Winkel, x, y, z: GLfloat); var c, s: GLfloat; // Funktionierts ????? m: TMatrix; begin c := cos(Winkel); s := sin(Winkel); m:=self.EinheitsMatrix; m[0, 0] := x * x * (1 - c) + c; m[1, 0] := x * y * (1 - c) - z * s; m[2, 0] := x * z * (1 - c) + y * s; m[0, 1] := y * x * (1 - c) + z * s; m[1, 1] := y * y * (1 - c) + c; m[2, 1] := y * z * (1 - c) - x * s; m[0, 2] := x * z * (1 - c) - y * s; m[1, 2] := y * z * (1 - c) + x * s; m[2, 2] := z * z * (1 - c) + c; Matrix := self.MultiplyMatrices(Matrix,m); end; //procedure TMatrixModif.Rotate(var Matrix: TMatrix; Winkel, x, y, z: GLfloat); //var // c, s: GLfloat; // Funktionierts ????? //begin // c := cos(Winkel); // s := sin(Winkel); // Matrix[0, 0] := x * x * (1 - c) + c; // Matrix[1, 0] := x * y * (1 - c) - z * s; // Matrix[2, 0] := x * z * (1 - c) + y * s; // Matrix[0, 1] := y * x * (1 - c) + z * s; // Matrix[1, 1] := y * y * (1 - c) + c; // Matrix[2, 1] := y * z * (1 - c) - x * s; // Matrix[0, 2] := x * z * (1 - c) - y * s; // Matrix[1, 2] := y * z * (1 - c) + x * s; // Matrix[2, 2] := z * z * (1 - c) + c; //end; procedure TMatrixModif.Translate(var Matrix: TMatrix; x, y, z: GLfloat); inline; begin Matrix[3, 0] := Matrix[3, 0] + x; Matrix[3, 1] := Matrix[3, 1] + y; Matrix[3, 2] := Matrix[3, 2] + z; end; procedure TMatrixModif.RotateX(var Matrix: TMatrix; Winkel: GLfloat); var i: integer; y, z, c, s: GLfloat; begin c := cos(Winkel); s := sin(Winkel); for i := 0 to 2 do begin y := Matrix[i, 1]; z := Matrix[i, 2]; Matrix[i, 1] := y * c - z * s; Matrix[i, 2] := y * s + z * c; end; end; procedure TMatrixModif.RotateY(var Matrix: TMatrix; Winkel: GLfloat); var i: integer; x, z, c, s: GLfloat; begin c := cos(Winkel); s := sin(Winkel); for i := 0 to 2 do begin x := Matrix[i, 0]; z := Matrix[i, 2]; Matrix[i, 0] := x * c - z * s; Matrix[i, 2] := x * s + z * c; end; end; procedure TMatrixModif.RotateZ(var Matrix: TMatrix; Winkel: GLfloat); var i: integer; x, y, c, s: GLfloat; begin c := cos(Winkel); s := sin(Winkel); for i := 0 to 2 do begin x := Matrix[i, 0]; y := Matrix[i, 1]; Matrix[i, 0] := x * c - y * s; Matrix[i, 1] := x * s + y * c; end; end; procedure TMatrixModif.Scale(var Matrix: TMatrix; Faktor: GLfloat); var x, y: integer; begin for x := 0 to 2 do begin for y := 0 to 2 do begin Matrix[x, y] := Matrix[x, y] * Faktor; end; end; end; procedure TMatrixModif.Scale(var Matrix: TMatrix; FaktorX, FaktorY, FaktorZ: GLfloat); var i: integer; begin for i := 0 to 3 do begin Matrix[i, 0] := Matrix[i, 0] * FaktorX; Matrix[i, 1] := Matrix[i, 1] * FaktorY; Matrix[i, 2] := Matrix[i, 2] * FaktorZ; end; end; function TMatrixModif.MultiplyMatrices(m1, m2: TMatrix): TMatrix; var i, j, k: integer; begin for i := 0 to 3 do begin for j := 0 to 3 do begin Result[i, j] := 0; for k := 0 to 3 do begin Result[i, j] := Result[i, j] + m2[i, k] * m1[k, j]; end; end; end; end; procedure TMatrixModif.WriteMatrix(var Matrix: TMatrix); var x, y: integer; begin for y := 0 to 3 do begin for x := 0 to 3 do begin Write(FormatFloat('###0.0000', Matrix[x, y])); end; Writeln; end; end;
|