home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 11 / grafik8 / obj3d.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-09-04  |  2.8 KB  |  77 lines

  1. (*-------------------------------------------------------------*)
  2. (*                       OBJ3D.PAS                             *)
  3. (* Darstellung von dreidimensionalen grafischen Objekten       *)
  4.  
  5. PROCEDURE Objekt3D(Objekt : LinienObjekt; n : INTEGER;
  6.                    NV, SV, BRP, PZ : tVektor;
  7.                    F, B, WinU1, WinV1, WinU2, WinV2 : REAL;
  8.                    loeschen : BOOLEAN                      );
  9.  
  10. VAR i : INTEGER;
  11.     AltFarbe : Sys_Colors;
  12.     x1, y1, x2, y2, MinDist : REAL;
  13.     U,V, BRPStrich, Zentrum, PStrich1, PStrich2 : tVektor;
  14.     Blickmat, Temp, SkInv : tMatrix;
  15.     zeichnen : BOOLEAN;
  16.  
  17. BEGIN
  18.   (*-- Initialisierung --*)
  19.   NV[4] := 1;  SV[4] := 1;  BRP[4] := 1;  PZ[4] := 1;
  20.   Einheitsmatrix(Blickmat);
  21.   (*--  U-V-NV-Koordinatensystem konstruieren --*)
  22.   UVNV(NV,SV,U,V);
  23.   Translation(Blickmat,-(BRP[1]+PZ[1]),
  24.               -(BRP[2]+PZ[2]),-(BRP[3]+PZ[3]));
  25.   RotMat(U,V,NV,Temp);
  26.   MatMult(Blickmat,Temp,Blickmat);
  27.   (*-- BRP' berechnen --*)
  28.   BRPStrich := BRP;
  29.   VektorTrans(BRPStrich,Blickmat);
  30.   (*-- Fensterzentrum berechnen --*)
  31.   Zentrum[1] := BRPStrich[1] + 0.5*(WinU2+WinU1);
  32.   Zentrum[2] := BRPStrich[2] + 0.5*(WinV2+WinV1);
  33.   Zentrum[3] := BRPStrich[3];
  34.   Zentrum[4] := 1;
  35.   (*-- Scherungsmatrix aufstellen --*)
  36.   Z_Scherung(Temp,-Zentrum[1]/Zentrum[3],-Zentrum[2]/Zentrum[3]);
  37.   MatMult(Blickmat,Temp,Blickmat);
  38.   (*-- Skalierungsmatrix fuer Clipping --*)
  39.   Skalierung(Temp,
  40.              2.0*BRPStrich[3]/((WinU2-WinU1)*(BRPStrich[3]+B)),
  41.              2.0*BRPStrich[3]/((WinV2-WinV1)*(BRPStrich[3]+B)),
  42.              1.0/(BRPStrich[3]+B)                               );
  43.   (*-- Inverse Skalierung --*)
  44.   SkInv := Temp;
  45.   SkInv[1,1] := 1.0/Temp[1,1];
  46.   SkInv[2,2] := 1.0/Temp[2,2];
  47.   SkInv[3,3] := 1.0/Temp[3,3];
  48.   MatMult(Blickmat,Temp,Blickmat);
  49.   (*-- Konkrete Transformationen --*)
  50.   MinDist := (BRPStrich[3] + F)/(BRPStrich[3] + B);
  51.   FOR i := 1 TO n DO
  52.     WITH Objekt[i] DO BEGIN
  53.       PStrich1 := Vektor1;
  54.       VektorTrans(PStrich1,Blickmat);
  55.       PStrich2 := Vektor2;
  56.       VektorTrans(PStrich2,Blickmat);
  57.       Clip3DLine(PStrich1,PStrich2,MinDist,zeichnen);
  58.       IF zeichnen THEN BEGIN
  59.         VektorTrans(PStrich1,SkInv);
  60.         VektorTrans(PStrich2,SkInv);
  61.         x1 := BRPStrich[3]*PStrich1[1]/PStrich1[3];
  62.         y1 := BRPStrich[3]*PStrich1[2]/PStrich1[3];
  63.         x2 := BRPStrich[3]*PStrich2[1]/PStrich2[3];
  64.         y2 := BRPStrich[3]*PStrich2[2]/PStrich2[3];
  65.         IF loeschen THEN BEGIN
  66.           AltFarbe := Pen_Color;
  67.           Set_Pen_Color(First_Color_Value);
  68.          END;
  69.         linew(x1,y1,x2,y2);
  70.         IF loeschen THEN
  71.           Set_Pen_Color(AltFarbe);
  72.       END;
  73.     END;
  74. END;
  75. (*-------------------------------------------------------------*)
  76. (*                      Ende OBJ3D.PAS                         *)
  77.