home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------*)
- (* OBJ3D.PAS *)
- (* Darstellung von dreidimensionalen grafischen Objekten *)
-
- PROCEDURE Objekt3D(Objekt : LinienObjekt; n : INTEGER;
- NV, SV, BRP, PZ : tVektor;
- F, B, WinU1, WinV1, WinU2, WinV2 : REAL;
- loeschen : BOOLEAN );
-
- VAR i : INTEGER;
- AltFarbe : Sys_Colors;
- x1, y1, x2, y2, MinDist : REAL;
- U,V, BRPStrich, Zentrum, PStrich1, PStrich2 : tVektor;
- Blickmat, Temp, SkInv : tMatrix;
- zeichnen : BOOLEAN;
-
- BEGIN
- (*-- Initialisierung --*)
- NV[4] := 1; SV[4] := 1; BRP[4] := 1; PZ[4] := 1;
- Einheitsmatrix(Blickmat);
- (*-- U-V-NV-Koordinatensystem konstruieren --*)
- UVNV(NV,SV,U,V);
- Translation(Blickmat,-(BRP[1]+PZ[1]),
- -(BRP[2]+PZ[2]),-(BRP[3]+PZ[3]));
- RotMat(U,V,NV,Temp);
- MatMult(Blickmat,Temp,Blickmat);
- (*-- BRP' berechnen --*)
- BRPStrich := BRP;
- VektorTrans(BRPStrich,Blickmat);
- (*-- Fensterzentrum berechnen --*)
- Zentrum[1] := BRPStrich[1] + 0.5*(WinU2+WinU1);
- Zentrum[2] := BRPStrich[2] + 0.5*(WinV2+WinV1);
- Zentrum[3] := BRPStrich[3];
- Zentrum[4] := 1;
- (*-- Scherungsmatrix aufstellen --*)
- Z_Scherung(Temp,-Zentrum[1]/Zentrum[3],-Zentrum[2]/Zentrum[3]);
- MatMult(Blickmat,Temp,Blickmat);
- (*-- Skalierungsmatrix fuer Clipping --*)
- Skalierung(Temp,
- 2.0*BRPStrich[3]/((WinU2-WinU1)*(BRPStrich[3]+B)),
- 2.0*BRPStrich[3]/((WinV2-WinV1)*(BRPStrich[3]+B)),
- 1.0/(BRPStrich[3]+B) );
- (*-- Inverse Skalierung --*)
- SkInv := Temp;
- SkInv[1,1] := 1.0/Temp[1,1];
- SkInv[2,2] := 1.0/Temp[2,2];
- SkInv[3,3] := 1.0/Temp[3,3];
- MatMult(Blickmat,Temp,Blickmat);
- (*-- Konkrete Transformationen --*)
- MinDist := (BRPStrich[3] + F)/(BRPStrich[3] + B);
- FOR i := 1 TO n DO
- WITH Objekt[i] DO BEGIN
- PStrich1 := Vektor1;
- VektorTrans(PStrich1,Blickmat);
- PStrich2 := Vektor2;
- VektorTrans(PStrich2,Blickmat);
- Clip3DLine(PStrich1,PStrich2,MinDist,zeichnen);
- IF zeichnen THEN BEGIN
- VektorTrans(PStrich1,SkInv);
- VektorTrans(PStrich2,SkInv);
- x1 := BRPStrich[3]*PStrich1[1]/PStrich1[3];
- y1 := BRPStrich[3]*PStrich1[2]/PStrich1[3];
- x2 := BRPStrich[3]*PStrich2[1]/PStrich2[3];
- y2 := BRPStrich[3]*PStrich2[2]/PStrich2[3];
- IF loeschen THEN BEGIN
- AltFarbe := Pen_Color;
- Set_Pen_Color(First_Color_Value);
- END;
- linew(x1,y1,x2,y2);
- IF loeschen THEN
- Set_Pen_Color(AltFarbe);
- END;
- END;
- END;
- (*-------------------------------------------------------------*)
- (* Ende OBJ3D.PAS *)