Section courante

A propos

Section administrative du site

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 :

  1. Program AnimStar;
  2.  
  3. Uses Crt,MSGraph;
  4.  
  5. Const
  6.  NofStars=50;
  7.  
  8. Type
  9.  StarRec=Record
  10.   X,Y,Z:Integer;
  11.  End;
  12.  
  13.  RGB=Record
  14.   R:Byte;  { (R)ouge ((R)ed) }
  15.   G:Byte;  { (V)ert ((G)reen) }
  16.   B:Byte;  { (B)leu ((B)lue) }
  17.  End;
  18.  
  19.  StarPos=Array[0..NofStars]of StarRec;
  20.  StarSpd=Array[0..NofStars]of Word;
  21.  
  22. Var
  23.  NumXPixels,NumYPixels,GX1,GY1:Word;
  24.  Stars:StarPos;
  25.  Speed:StarSpd;
  26.  Xc,Yc,ZFactor:Word;
  27.  
  28. Procedure WaitRetrace;Begin
  29.  Delay(10);
  30. End;
  31.  
  32.  
  33. Function RGB2Color(R,G,B:Byte):LongInt;
  34. Var
  35.  Value:LongInt;
  36.  X:RGB Absolute Value;
  37. Begin
  38.  Value:=0;
  39.  X.R:=R shr 2;
  40.  X.G:=G shr 2;
  41.  X.B:=B shr 2;
  42.  RGB2Color:=value;
  43. End;
  44.  
  45. Procedure Initialization;
  46. Var
  47.  vc:_VideoConfig;
  48.  I:Integer;
  49. Begin
  50.  _GetVideoConfig(vc);
  51.  For I:=0to 50do If _RemapPalette(I,RGB2Color(I shl 4,I shl 4,I shl 4))=0Then;
  52.  NumXPixels:=vc.NumXPixels;
  53.  NumYPixels:=vc.NumYPixels;
  54.  Xc:=NumXPixels shr 1;Yc:=NumYPixels shr 1;
  55.  If(NumXPixels>NumYPixels)Then ZFactor:=65280 div NumXPixels
  56.   Else ZFactor:=65280 div NumYPixels;
  57.  Randomize;
  58.  For I:=0to(NofStars)do Begin
  59.   Stars[I].X:=Random(100)-50;
  60.   Stars[I].Y:=Random(100)-50;
  61.   Stars[I].Z:=Random(900)+200;
  62.   Speed[I]:=0;
  63.  End;
  64. End;
  65.  
  66. Procedure Animation;
  67. Var
  68.  X,Y,I:Integer;
  69.  Color:Byte;
  70.  
  71.  Procedure NewStar(Num:Byte);
  72.  Var
  73.   X,Y:Integer;
  74.  Begin
  75.   X:=Xc+Round(Stars[Num].X*Stars[Num].Z/ZFactor);
  76.   Y:=Yc+Round(Stars[Num].Y*Stars[Num].Z/ZFactor);
  77.   If(X>0)and(X<NumXPixels)and(Y>0)and(Y<NumYPixels)Then Begin
  78.    _SetColor(0);
  79.    _SetPixel(GX1+X,GY1+Y);
  80.   End;
  81.   Stars[Num].X:=Random(100)-50;
  82.   Stars[Num].Y:=Random(100)-50;
  83.   Stars[Num].Z:=Random(Yc)+NumYPixels;
  84.  End;
  85.  
  86. Begin
  87.  WaitRetrace;
  88.  {SetPalBlk(0,1);}
  89.  WaitRetrace;
  90.  For I:=0to(NofStars)do Begin
  91.   X:=Xc+round(Stars[I].X*Stars[I].Z/ZFactor);
  92.   Y:=Yc+round(Stars[I].Y*Stars[I].Z/ZFactor);
  93.   _SetColor(0);
  94.   _SetPixel(GX1+X,GY1+Y); { Efface l'etoile }
  95.   X:=Xc+Round(Stars[I].X*(Stars[I].Z+Speed[I])/ZFactor);
  96.   Y:=Yc+Round(Stars[I].Y*(Stars[I].Z+Speed[I])/ZFactor);
  97.   If(X>0)and(X<NumXPixels)and(Y>0)and(Y<NumYPixels)Then Begin
  98.    Color:=8+Stars[I].Z div 150;
  99.    If _GetPixel(GX1+X,GY1+Y)=0Then Begin
  100.     _SetColor(Color);
  101.     _SetPixel(GX1+X,GY1+Y);
  102.    End;
  103.   End
  104.    else
  105.   NewStar(I);
  106.   Inc(Stars[I].Z,Speed[I]);
  107.   If Stars[I].Z>20000Then NewStar(I);
  108.   Speed[I]:=(Stars[I].Z div 150)*(5-(Abs(Stars[I].X*Stars[I].Y)div 500));
  109.  End;
  110. End;
  111.  
  112. BEGIN
  113. If _SetVideoMode(_MRes256Color)=0 Then Begin
  114.   WriteLn('Mode video non supporte');
  115.   Halt;
  116.  End;
  117.  Initialization;
  118.  Repeat
  119.   Animation;
  120.  Until Keypressed;
  121.  If _SetVideoMode(_DefaultMode)=0 Then;
  122. END.


Dernière mise à jour : Lundi, le 3 janvier 2022