<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">  <HTML>  <HEAD>  <LINK href="../povdocfr_style.css" rel="stylesheet" type="text/css">  <TITLE>matrix - documentation francophone de POV-Ray</TITLE> </HEAD>  <BODY>  <P><A href="../index.htm">vers l'index g&eacute;n&eacute;ral de l'aide</A></P>  <H1>matrix</H1>   <P>Rien &agrave; voir avec le c&eacute;l&egrave;bre navet new-age, rassurez-vous...</P>  <H2>objectif</H2>  <P>Appliquer des transformations spatiales de type rotate, scale, translate, aux     objets et &eacute;l&eacute;ments de textures, &agrave; l'aide d'une matrice de valeurs, avec     une petite possibilit&eacute; en plus, le biaisage ("shearing").</P>  <H2>explication</H2> <P>Lorsque POV-Ray interpr&egrave;te une s&eacute;rie de transformations successives, il    stocke la transformation dans une matrice de 4 x 4 valeurs, d&eacute;crivant    le d&eacute;placement des points dans l'espace.  Le mot cl&eacute; <STRONG>matrix</STRONG>    vous permet d'acc&eacute;der directement &agrave; cette matrice.  Nous allons voir dans    quels cas il est utile d'y recourir.</P>  <H2>syntaxe</H2>  <PRE> matrix &lt;A1, A2, A3,          B1, B2, B3,          C1, C2, C3,          D1, D2, D3&gt; </PRE> <P> Plus haut, nous avons parl&eacute; de 4 x 4 valeurs, alors que la syntaxe n'en comporte que 3 x 4 !  Il y a en fait une quatri&egrave;me colonne, implicite, dont les valeurs sont constantes. Le tableau suivant est donc la repr&eacute;sentation "interne" de la matrice :</P> <P> <TABLE border=1>   <TR><TD>A1</TD><TD>A2</TD><TD>A3</TD><TD style="background-color: yellow">0</TD></TR>  <TR><TD>B1</TD><TD>B2</TD><TD>B3</TD><TD style="background-color: yellow">0</TD></TR>  <TR><TD>C1</TD><TD>C2</TD><TD>C3</TD><TD style="background-color: yellow">0</TD></TR>  <TR><TD>D1</TD> <TD>D2</TD> <TD>D3</TD> <TD style="background-color: yellow">1</TD></TR> </TABLE> </P> <P>La transformation d'un point se fait suivant le processus suivant.  Pour tout point :</P>    <P><I>P = &lt;px,py,pz&gt;</I></P> <P>...le point r&eacute;sultant apr&egrave;s transformation sera :</P>    <P><I>Q = &lt;qx,qy,qz&gt;</I></P> <P>...d&eacute;termin&eacute; par les formules suivantes :</P> <P class="noindent"><I> qx = A1 * px + B1 * py + C1 * pz + D1 <BR> qy = A2 * px + B2 * py + C2 * pz + D2 <BR> qz = A3 * px + B3 * py + C3 * pz + D3  </P></I>  <H2>transformations "classiques"</H2> <P>Voici, &agrave; titre d'exemple, l'&eacute;quivalent matriciel des transformations courantes de    POV-Ray.</P> <H3>scale</H3> <PRE> scale &lt;Sx,Sy,Sz&gt;   donne : matrix &lt;Sx,  0,  0,          0, Sy,  0,          0,  0, Sz,          0,  0,  0 &gt; </PRE> <H3>translate</H3> <PRE> translate &lt;Tx,Ty,Tz&gt;   donne : matrix &lt;1,  0,  0,         0,  1,  0,         0,  0,  1,        Tx, Ty, Tz&gt; </PRE> <P>Notez qu'il est relativement facile de combiner les op&eacute;rations de <STRONG>scale</STRONG>  et <STRONG>translate</STRONG> dans une m&ecirc;me matrice, puisque leurs valeurs de contr&ocirc;le sont  distinctes.</P> <H3>rotate</H3> <P>L&agrave;, &ccedil;a se corse, car il faut effectuer des transformations trigonom&eacute;triques    pr&eacute;alables !</P> <PRE> rotate x*Angle  donne : #declare As = sin (radians(Angle)); #declare Ac = cos (radians(Angle));   matrix &lt;  1,  0,  0,             0,  Ac, As,             0, -As, Ac,             0,  0,  0 &gt;  rotate y*Angle  donne : #declare As = sin (radians(Angle)); #declare Ac = cos (radians(Angle));     matrix &lt;  Ac,  0, -As,              0,  1,  0,              As, 0,  Ac,              0,  0,  0 &gt;  rotate z*Angle  donne : #declare As = sin (radians(Angle)); #declare Ac = cos (radians(Angle));     matrix &lt;  Ac,  As,  0,             -As,  Ac,  0,              0,  0,  1,              0,  0,  0 &gt; </PRE> <P>Ici, la combinaison devient beaucoup plus difficile, et implique l'usage des op&eacute;rations    sur les matrices, que nous n'aborderons pas ici !  Allez voir vos vieux livres de maths,    &ccedil;a devrait s'y trouver.</P>  <H2>biaisage</H2> <P>La seule transformation que seule la matrice permet, c'est de biaiser les objets, c'est    &agrave; dire leur appliquer une torsion suivant les axes.  La torsion est exprim&eacute;e en rapport    du d&eacute;placement sur deux axes, pour chaque unit&eacute; sur le troisi&egrave;me axe.</P> <PRE> <H3>torsion sur X et Y</H3>    matrix &lt; 1,  0,  0,             0,  1,  0,            Gx, Gy,  1,             0,  0,  0 &gt; </PRE> <P>Par exemple, un d&eacute;placement de 0.2 unit&eacute;s le long de X et de 0.5 unit&eacute;s le long de Y,    pour chaque unit&eacute; en Z :</P> <PRE>    matrix &lt; 1,  0,  0,             0,  1,  0,            .2, .5,  1,             0,  0,  0 &gt; </PRE> <IMG src="shear01.png" border=2 alt=""> <IMG src="shear02.png" border=2 alt=""> <H3>torsion sur X et Z</H3> <PRE>    matrix &lt;  1,  0,  0,             Gx,  1, Gz,              0,  0,  1,              0,  0,  0 &gt; </PRE> <H3>torsion sur Y et Z</H3> <PRE>    matrix &lt;  1, Gy, Gz,              0,  1,  0,              0,  0,  1,              0,  0,  0 &gt; </PRE> <H2>remarques</H2> <P>Puisque, en interne, POV-Ray finit toujours par traduire toutes les transformations    successives en une matrice unique, il n'y a aucun int&eacute;r&ecirc;t technique &agrave; les employer    pour remplacer scale, rotate et translate.  Il n'y a que deux cas de figure ou leur    utilisation est n&eacute;cessaire/souhaitable :</P> <P>- pour effectuer un "biaisage".</P> <P>- lorsque, gr&acirc;ce &agrave; votre livre de maths, vous &ecirc;tes en mesure de produire, &agrave; l'aide      d'une matrice, une &eacute;criture plus &eacute;l&eacute;gante qu'une s&eacute;rie &eacute;quivalente de transformations      classiques.</P>  <P><I>R&eacute;dacteur: Fabien Mosen</I></P>  </BODY>  </HTML> 
