Animation d'étoile en 3 dimensions
L'animation d'étoile en 3 dimensions est l'un des algorithmes d'animation et démonstration les plus communs des années 1980. Il le retrouve également dans nombreux films de science-fiction du style Star Trek. Ce genre d'algorithme fonctionne très bien des langages de programmation évolué comme Pascal. Bien que le QuickPascal soit un langage de programmation très puissant au niveau graphique, il ne supporte pas pour autant les 3 dimensions d'affichage. Ainsi, il faut d'abord créer une perspective en 3 dimensions en utilisant des variables X, Y et Z. Ensuite, pour avoir un mouvement ayant un semblant de réalisme, il nous faut environ 50 étoiles animés pour un écran de 320 x 200 pixels en 256 couleurs, déterminé par la constante NofStars. Si vous augmentez la résolution de l'écran, par exemple, il faudrait donc environ 200 pour un écran de 640x400 pixels. Toutefois, plus vous mettez d'étoiles, plus l'animation sera lente. Ainsi, il est important de mettre le bon dosage d'étoile. Ensuite, chaque coordonnée des étoiles doivent être mémorisé afin qu'il soit possible de les retracer pour les affichés après chaque déplacement. Ainsi, l'idée est assez simple, dans 4 quadrants simulant 3 dimensions, vous déplacez chacune de vos étoiles d'un certain nombres de pixel (déterminé par la variable Speed), vous attendez un peu et vous recommencez de façon à sortir de l'intervalle de l'écran, et vous recommencez ainsi de suite. Chacune des étoiles est d'abord choisis de façon aléatoire pour donner l'impression qu'il soit éparpillé.
Voici un exemple d'animation en 3 dimensions d'étoile en QuickPascal :
- Program AnimStar;
-
- Uses Crt,MSGraph;
-
- Const
- NofStars=50;
-
- Type
- StarRec=Record
- X,Y,Z:Integer;
- End;
-
- RGB=Record
- R:Byte; { (R)ouge ((R)ed) }
- G:Byte; { (V)ert ((G)reen) }
- B:Byte; { (B)leu ((B)lue) }
- End;
-
- StarPos=Array[0..NofStars]of StarRec;
- StarSpd=Array[0..NofStars]of Word;
-
- Var
- NumXPixels,NumYPixels,GX1,GY1:Word;
- Stars:StarPos;
- Speed:StarSpd;
- Xc,Yc,ZFactor:Word;
-
- Procedure WaitRetrace;Begin
- Delay(10);
- End;
-
-
- Function RGB2Color(R,G,B:Byte):LongInt;
- Var
- Value:LongInt;
- X:RGB Absolute Value;
- Begin
- Value:=0;
- X.R:=R shr 2;
- X.G:=G shr 2;
- X.B:=B shr 2;
- RGB2Color:=value;
- End;
-
- Procedure Initialization;
- Var
- vc:_VideoConfig;
- I:Integer;
- Begin
- _GetVideoConfig(vc);
- For I:=0to 50do If _RemapPalette(I,RGB2Color(I shl 4,I shl 4,I shl 4))=0Then;
- NumXPixels:=vc.NumXPixels;
- NumYPixels:=vc.NumYPixels;
- Xc:=NumXPixels shr 1;Yc:=NumYPixels shr 1;
- If(NumXPixels>NumYPixels)Then ZFactor:=65280 div NumXPixels
- Else ZFactor:=65280 div NumYPixels;
- Randomize;
- For I:=0to(NofStars)do Begin
- Stars[I].X:=Random(100)-50;
- Stars[I].Y:=Random(100)-50;
- Stars[I].Z:=Random(900)+200;
- Speed[I]:=0;
- End;
- End;
-
- Procedure Animation;
- Var
- X,Y,I:Integer;
- Color:Byte;
-
- Procedure NewStar(Num:Byte);
- Var
- X,Y:Integer;
- Begin
- X:=Xc+Round(Stars[Num].X*Stars[Num].Z/ZFactor);
- Y:=Yc+Round(Stars[Num].Y*Stars[Num].Z/ZFactor);
- If(X>0)and(X<NumXPixels)and(Y>0)and(Y<NumYPixels)Then Begin
- _SetColor(0);
- _SetPixel(GX1+X,GY1+Y);
- End;
- Stars[Num].X:=Random(100)-50;
- Stars[Num].Y:=Random(100)-50;
- Stars[Num].Z:=Random(Yc)+NumYPixels;
- End;
-
- Begin
- WaitRetrace;
- {SetPalBlk(0,1);}
- WaitRetrace;
- For I:=0to(NofStars)do Begin
- X:=Xc+round(Stars[I].X*Stars[I].Z/ZFactor);
- Y:=Yc+round(Stars[I].Y*Stars[I].Z/ZFactor);
- _SetColor(0);
- _SetPixel(GX1+X,GY1+Y); { Efface l'etoile }
- X:=Xc+Round(Stars[I].X*(Stars[I].Z+Speed[I])/ZFactor);
- Y:=Yc+Round(Stars[I].Y*(Stars[I].Z+Speed[I])/ZFactor);
- If(X>0)and(X<NumXPixels)and(Y>0)and(Y<NumYPixels)Then Begin
- Color:=8+Stars[I].Z div 150;
- If _GetPixel(GX1+X,GY1+Y)=0Then Begin
- _SetColor(Color);
- _SetPixel(GX1+X,GY1+Y);
- End;
- End
- else
- NewStar(I);
- Inc(Stars[I].Z,Speed[I]);
- If Stars[I].Z>20000Then NewStar(I);
- Speed[I]:=(Stars[I].Z div 150)*(5-(Abs(Stars[I].X*Stars[I].Y)div 500));
- End;
- End;
-
- BEGIN
- If _SetVideoMode(_MRes256Color)=0 Then Begin
- WriteLn('Mode video non supporte');
- Halt;
- End;
- Initialization;
- Repeat
- Animation;
- Until Keypressed;
- If _SetVideoMode(_DefaultMode)=0 Then;
- END.