home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------*)
- (* ROT3D.PAS *)
- (* Grafikserie: Erstellung der Transformationsmatrix, um *)
- (* Objekte um eine "schraege" Rotationsachse *)
- (* zu drehen. *)
- (*-------------------------------------------------------------*)
-
- PROCEDURE Rot3D(VAR Matrix : tMatrix;
- x1, y1, z1, (* Zwei Punkte auf der *)
- x2, y2, z2 : REAL; (* Drehachse. *)
- Phi : REAL );(* Drehwinkel(Grad). *)
-
- CONST Pi_durch_180 = 17.453292e-3;
-
- VAR Temp, Dreh : tMatrix;
- u, v, w, r, r2 : REAL;
-
- BEGIN
- Phi := Phi*Pi_durch_180;
- (*--- Relativ-Vektor berechnen ---*)
- u := x2 - x1; v := y2 - y1; w := z2 - z1;
- (*--- Verschiebung in den Ursprung durchfuehren ---*)
- EinheitsMatrix(Temp);
- Translation(Temp,-x1,-y1,-z1);
- (*--- Erste Rotation durchfuehren ---*)
- r := Sqrt(v*v+w*w);
- EinheitsMatrix(Dreh);
- Dreh[2,2] := w/r;
- Dreh[2,3] := v/r;
- Dreh[3,2] := -Dreh[2,3];
- Dreh[3,3] := Dreh[2,2];
- MatMult(Temp,Dreh,Temp);
- (*--- Zweite Rotation durchfuehren ---*)
- r2 := Sqrt(u*u+r*r);
- EinheitsMatrix(Dreh);
- Dreh[1,1] := r/r2;
- Dreh[1,3] := u/r2;
- Dreh[3,1] := -Dreh[1,3];
- Dreh[3,3] := Dreh[1,1];
- MatMult(Temp,Dreh,Temp);
- (*--- Nun die gewuenschte Rotation um die Drehachse ---*)
- z_Rotation(Temp,Phi);
- (*=== Ab hier wieder rueck-transformieren ===*)
- (*--- Zweite Drehung rueckwärts ---*)
- EinheitsMatrix(Dreh);
- Dreh[1,1] := r/r2;
- Dreh[1,3] := u/r2;
- Dreh[3,1] := Dreh[1,3];
- Dreh[3,3] := Dreh[1,1];
- MatMult(Temp,Dreh,Temp);
- (*--- Erste Drehung rueckwärts ---*)
- EinheitsMatrix(Dreh);
- Dreh[2,2] := w/r;
- Dreh[2,3] := -r;
- Dreh[3,2] := -Dreh[2,3];
- Dreh[3,3] := Dreh[2,2];
- MatMult(Temp,Dreh,Temp);
- (*--- Wieder zurueck schieben ---*)
- Translation(Temp,x1,y1,z1);
- (*=== Endgueltige Matrix berechnen ===*)
- MatMult(Matrix,Temp,Matrix);
- END;
-