EddiTheHead
Messages postés
58
Date d'inscription
mercredi 16 février 2005
Statut
Membre
Dernière intervention
2 juin 2006
5 mars 2005 à 19:14
Salut,
J'avais trouvé y a fort fort longtemps un programme en basic pour C64 qui faisait tourner un cube. Je l'avais transposé en Turbo Pascal 6.0.
Tu trouveras le code un peut modifié, puisque j'ai rajouté la lettre "A" sur une face. A toi de faire le reste.
Dans l'article, il disait que c'était la manière la plus facile pour comprendre la 3D mais que ce n'était pas le meilleurs algorithme. Tu pourras constater que l'animation n'est pas rapide et que ce n'est pas avec ce code que tu vas refaire un doom-like.
Je te préviens que j'y connais rien en trigo et en 3D. Je peux afficher ce que je veux avec ce code mais faut pas me demander d'explications sur les formules de trigo. Le programme de Kenavo est plus performant et il pourra d'aider pour la théorie en 3D.
Pour vectoriser la lettre "A" :
-j'ai pris 5 points
*(3) point(1) en (100,-80,-80) (x,y,z)
point(2) en (100,-50,-20)
point(3) en (100,0,80)
*(2) *(4) point(4) en (100,50,-20)
point(5) en (100,80,-80)
*(1) *(5)
ensuite tu traces 3 lignes : points 1 et 3
points 3 et 5
points 2 et 4
Pour utiliser le mode graphique, tu dois avoir le fichier "Egavga.bgi" et l'unité "Graph".
Bonne chance,
eddithehead
----------------------------------------------------------
Program Cube;
Uses Crt, Graph;
Const PathGraph = '';
NDP = 8 + 5;
{ Nombre de points : 8 pour le cube + 5 pour la lettre A }
NDD = 12 + 3;
{ Nombre de droites : 12 pour le cube + 3 pour le A }
Fc = 300; { Focal caméra }
Cz : Word = 500; { Profondeur }
X : Array [1..NDP] Of LongInt = (-100, 100, 100, -100, -100, 100, 100, -100, 100, 100, 100, 100, 100);
Y : Array [1..NDP] Of LongInt = (-100, -100, 100, 100, -100, -100, 100, 100, -80, -50, 00, 50, 80);
Z : Array [1..NDP] Of LongInt = (-100, -100, -100, -100, 100, 100, 100, 100, -80, -20, 80, -20, -80);
P1 : Array [1..NDD] Of LongInt = (1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 9, 11, 10);
P2 : Array [1..NDD] Of LongInt = (2, 3, 4, 1, 6, 7, 8, 5, 5, 6, 7, 8, 11, 13, 12);
Var GraphDriver, GraphMode : Integer;
XMax, YMax, XMax2, YMax2 : Word;
X1, Y1, Z1, Xe, Ye : Array [1..NDP] Of LongInt;
Co, Si : Array [0..360] Of Real;
Procedure TestGraphError (GraphErr : Integer);
Var Car : Char;
Begin
If GraphErr <> GrOk Then
Begin
Writeln('Graphics error: ', GraphErrorMsg(GraphErr));
Car := ReadKey;
Halt(1);
End;
End;
Procedure Init;
Begin
{ Passer en mode graphique VGA 16 couleurs }
GraphDriver := Detect;
DetectGraph(GraphDriver, GraphMode);
TestGraphError(GraphResult);
Case GraphDriver Of
VGA : Begin
GraphDriver := VGA;
GraphMode := CGAC1;
End;
End;
InitGraph(GraphDriver, GraphMode, PathGraph);
TestGraphError(GraphResult);
XMax := GetMaxX; XMax2 := XMax Div 2;
YMax := GetMaxY; YMax2 := YMax Div 2;
End;
Procedure Action;
Var PageActive, PageVisuel : Byte;
Cpt, Ax, Ay, Az : Word;
Xx, Yy, Zz, Xx1, Yy1 : LongInt;
D : Real;
Car : Char;
Begin
PageActive := 0;
PageVisuel := 1;
SetColor(2);<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />
For Cpt := 0 To 360 Do { On ne calcule qu'un seul fois les sinus et cosinus }
Begin
Co[Cpt] := Cos(Cpt * (PI / 180));
Si[Cpt] := Sin(Cpt * (PI / 180));
End;
Ax := 360; Ay := 360; Az := 360;
Repeat
PageVisuel := (PageVisuel Mod 2) + 1; SetVisualPage(PageVisuel - 1); { Utiliser un double buffer }
PageActive := (PageActive Mod 2) + 1; SetActivePage(PageActive - 1);
Ax := (Ax Mod 360) + 1; { Compteur pour faire tourner sur axe X }
Ay := (Ay Mod 360) + 1; { Compteur pour faire tourner sur axe Y }
Az := (Az Mod 360) + 1; { Compteur pour faire tourner sur axe Z }
For Cpt := 1 To NDP Do
Begin
{ Calcul des rotation }
X1[Cpt] := X[Cpt];
Y1[Cpt] := Y[Cpt];
Z1[Cpt] := Z[Cpt];
Xx := X1[Cpt];
Yy := Trunc(Y1[Cpt] * Co[Ax] + Z1[Cpt] * Si[Ax]);
Zz := Trunc(-Y1[Cpt] * Si[Ax] + Z1[Cpt] * Co[Ax]);
X1[Cpt] := Xx; Y1[Cpt] := Yy; Z1[Cpt] := Zz;
Xx := Trunc(X1[Cpt] * Co[Ay] + Z1[Cpt] * Si[Ay]);
Yy := Y1[Cpt];
Zz := Trunc(-X1[Cpt] * Si[Ay] + Z1[Cpt] * Co[Ay]);
X1[Cpt] := Xx; Y1[Cpt] := Yy; Z1[Cpt] := Zz;
Xx := Trunc(X1[Cpt] * Co[Az] + Y1[Cpt] * Si[Az]);
Yy := Trunc(-X1[Cpt] * Si[Az] + Y1[Cpt] * Co[Az]);
Zz := Z1[Cpt];
X1[Cpt] := Xx; Y1[Cpt] := Yy; Z1[Cpt] := Zz;
{ Calcul pour afficher en 2D }
D := Sqrt(Xx*Xx + Yy*Yy + (Cz+Zz)*(Cz+Zz)); { Racine carrée de Xx²+Yy²+(Cz+Zz)² }
Xe[Cpt] := XMax2 + Trunc((Xx * Fc) / D);
Ye[Cpt] := YMax2 + Trunc((Yy * Fc) / D);
End;
ClearViewPort; { Effacer l'écran }
{ Afficher les lignes }
For Cpt := 1 To NDD Do
Begin
Xx := Xe[P1[Cpt]];
Yy := Ye[P1[Cpt]];
Xx1 := Xe[P2[Cpt]];
Yy1 := Ye[P2[Cpt]];
Line(Xx, Yy, Xx1, Yy1);
End;
Until KeyPressed;
Car := ReadKey;
End;
Begin
Init;
Action;
CloseGraph;
RestoreCrtMode;
End.