{"id":2852,"date":"2015-06-14T08:37:28","date_gmt":"2015-06-14T08:37:28","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=2852"},"modified":"2017-07-31T18:06:47","modified_gmt":"2017-07-31T18:06:47","slug":"rotation-a-partir-dun-un-axe-quelconque","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=2852","title":{"rendered":"Rotation autour d&rsquo;un axe quelconque"},"content":{"rendered":"<p><strong>Intro :<\/strong><\/p>\n<p>Voici les matrices de <strong>rotation <\/strong>des axes X, Y et Z :<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/matrix_rotation1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-2862\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/06\/matrix_rotation1.png\" alt=\"matrix_rotation\" width=\"232\" height=\"285\" \/><\/a><\/p>\n<p>Nous savons comment faire une rotation autour des axes X, Y, et Z, mais comment faire une rotation \u00e0 partir d&rsquo;un <strong>axe quelconque<\/strong> <strong>diff\u00e9rent<\/strong> des pr\u00e9c\u00e9dents ?<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir ce qu&rsquo;est une <em>matrice<\/em><\/p>\n<p>&#8211; Savoir ce qu&rsquo;est une <em>transformation de rep\u00e8re<\/em><\/p>\n<p>&#8211; Savoir utiliser les objets et fonctions math\u00e9matiques de la <em>librairie D3DX<\/em><\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Nous allons pr\u00e9senter deux m\u00e9thodes : la <strong>formule de Rodrigues<\/strong> en deux variantes et une fonction correspondante de la <strong>librairie D3DX<\/strong>.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>La <strong>formule de Rodrigues<\/strong> suivante permet de calculer la position <strong>d&rsquo;un point<\/strong> subissant une rotation autour\u00a0<strong>d&rsquo;un axe<\/strong> quelconque.<\/p>\n<p>Les variables sont : <img src='https:\/\/s0.wp.com\/latex.php?latex=%7Bv%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='{v} ' title='{v} ' class='latex' \/> la position d&rsquo;un point qui subit la rotation ;\u00a0<img src='https:\/\/s0.wp.com\/latex.php?latex=%7B%5Ctheta%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='{\\theta} ' title='{\\theta} ' class='latex' \/> un angle de rotation ; <img src='https:\/\/s0.wp.com\/latex.php?latex=%7Bk%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='{k} ' title='{k} ' class='latex' \/> vecteur d&rsquo;unit\u00e9 1 qui joue le r\u00f4le d&rsquo;axis de rotation.<\/p>\n<img src='https:\/\/s0.wp.com\/latex.php?latex=%7Bv%7D_%5Cmathrm%7Brot%7D+%3D+%7Bv%7D+%5Ccos%5Ctheta+%2B+%28%7Bk%7D+%5Ctimes+%7Bv%7D%29%5Csin%5Ctheta+%2B+%7Bk%7D+%28%7Bk%7D+%5Ccdot+%7Bv%7D%29+%281+-+%5Ccos%5Ctheta%29+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='{v}_\\mathrm{rot} = {v} \\cos\\theta + ({k} \\times {v})\\sin\\theta + {k} ({k} \\cdot {v}) (1 - \\cos\\theta) ' title='{v}_\\mathrm{rot} = {v} \\cos\\theta + ({k} \\times {v})\\sin\\theta + {k} ({k} \\cdot {v}) (1 - \\cos\\theta) ' class='latex' \/>\n<p>&nbsp;<\/p>\n<p>Voici l&rsquo;impl\u00e9mentation de cette formule en <strong>C++<\/strong> :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nD3DXVECTOR3 MatrixRotationAxis(D3DXVECTOR3&amp; axis, D3DXVECTOR3&amp; v, float fAngle)\r\n{\r\n\u00a0\u00a0\u00a0 D3DXVec3Normalize(&amp;axis, &amp;axis);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 vect1 = v * cos(fAngle);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 vect2;\r\n\u00a0\u00a0 \u00a0D3DXVec3Cross(&amp;vect2, &amp;axis, &amp;v);\r\n\r\n\u00a0\u00a0 \u00a0vect2 *= sin(fAngle);\r\n\r\n\u00a0\u00a0 \u00a0float fDotProduct = D3DXVec3Dot(&amp;axis, &amp;v);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR3 vect3 = axis * fDotProduct * (1 - cos(fAngle));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0return vect1 + vect2 + vect3;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Une autre <strong>formule de Rodrigues<\/strong> permet de calculer rapidement la <strong>matrice de r\u00e9volution<\/strong> autour d&rsquo;un axe et d&rsquo;un angle quelconques.<\/p>\n<p>Les variables sont : la matrice de rotation <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cmathbf%7BR%7D_%7B%5Cmathbf%7BK%7D%7D%28%5Ctheta%29+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\mathbf{R}_{\\mathbf{K}}(\\theta) ' title='\\mathbf{R}_{\\mathbf{K}}(\\theta) ' class='latex' \/> autour d&rsquo;un axe <img src='https:\/\/s0.wp.com\/latex.php?latex=%7Bk%7D+%3D+%28+k_%7B1%7D%2C+k_%7B2%7D%2C+k_%7B3%7D+%29+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='{k} = ( k_{1}, k_{2}, k_{3} ) ' title='{k} = ( k_{1}, k_{2}, k_{3} ) ' class='latex' \/> d&rsquo;unit\u00e9 1 et d&rsquo;angle <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Ctheta+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\theta ' title='\\theta ' class='latex' \/> ; <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cmathbf%7BI%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\mathbf{I} ' title='\\mathbf{I} ' class='latex' \/> \u00e9tant la matrice identit\u00e9 ;<\/p>\n<p>et la matrice <img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cmathbf%7BK%7D+%3D+%5Cleft%5B%5Cbegin%7Barray%7D%7Bccc%7D+0+%26+-k_3+%26+k_2+%5C%5C+k_3+%26+0+%26+-k_1+%5C%5C+-k_2+%26+k_1+%26+0+%5Cend%7Barray%7D%5Cright%5D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\mathbf{K} = \\left[\\begin{array}{ccc} 0 &amp; -k_3 &amp; k_2 \\\\ k_3 &amp; 0 &amp; -k_1 \\\\ -k_2 &amp; k_1 &amp; 0 \\end{array}\\right] ' title='\\mathbf{K} = \\left[\\begin{array}{ccc} 0 &amp; -k_3 &amp; k_2 \\\\ k_3 &amp; 0 &amp; -k_1 \\\\ -k_2 &amp; k_1 &amp; 0 \\end{array}\\right] ' class='latex' \/><\/p>\n<p>&nbsp;<\/p>\n<img src='https:\/\/s0.wp.com\/latex.php?latex=%5Cmathbf%7BR%7D_%7B%5Cmathbf%7BK%7D%7D%28%5Ctheta%29+%3D+%5Cmathbf%7BI%7D+%2B+%28%5Csin%5Ctheta%29+%5Cmathbf%7BK%7D%2B+%281-%5Ccos%5Ctheta%29%5Cmathbf%7BK%7D%7B%5E2%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=2' alt='\\mathbf{R}_{\\mathbf{K}}(\\theta) = \\mathbf{I} + (\\sin\\theta) \\mathbf{K}+ (1-\\cos\\theta)\\mathbf{K}{^2} ' title='\\mathbf{R}_{\\mathbf{K}}(\\theta) = \\mathbf{I} + (\\sin\\theta) \\mathbf{K}+ (1-\\cos\\theta)\\mathbf{K}{^2} ' class='latex' \/>\n<p>&nbsp;<\/p>\n<p>Voici l\u2019impl\u00e9mentation de cette formule en <strong>C++<\/strong> :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nD3DXMATRIX D3D10Renderer::MatrixRotationAxis(D3DXVECTOR3&amp; axis, float fAngle)\r\n{\r\n    \/\/ Il faut convertir le vecteur d'axis en unit\u00e9 1 sinon cela\r\n    \/\/ ne fonctionne pas\r\n    D3DXVec3Normalize(&amp;axis, &amp;axis);\r\n\r\n\u00a0\u00a0\u00a0 D3DXMATRIX K;\r\n\u00a0\u00a0\u00a0 D3DXMatrixIdentity(&amp;K);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 K._11 = 0;\r\n\u00a0\u00a0\u00a0 K._12 = -axis.z;\r\n\u00a0\u00a0\u00a0 K._13 = axis.y;\r\n\u00a0\r\n\u00a0\u00a0\u00a0 K._21 = axis.z;\r\n\u00a0\u00a0\u00a0 K._22 = 0.0f;\r\n\u00a0\u00a0\u00a0 K._23 = -axis.x;\r\n\u00a0\r\n\u00a0\u00a0\u00a0 K._31 = -axis.y;\r\n\u00a0\u00a0\u00a0 K._32 = axis.x;\r\n\u00a0\u00a0\u00a0 K._33 = 0;\r\n\u00a0\r\n    \/\/ Pour \u00e9viter que ce champ soit multipli\u00e9\r\n    \/\/ par les scalaires, on le met \u00e0 0\r\n\u00a0\u00a0\u00a0 K._44 = 0;\r\n\u00a0\r\n\u00a0\u00a0\u00a0 D3DXMATRIX identity;\r\n\u00a0\u00a0\u00a0 D3DXMatrixIdentity(&amp;identity);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 D3DXMATRIX squared;\r\n\u00a0\u00a0\u00a0 D3DXMatrixMultiply(&amp;squared, &amp;K, &amp;K);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 D3DXMATRIX rot = identity + K * sin(fAngle) + squared * (1 - cos(fAngle));\r\n\u00a0\r\n\u00a0\u00a0\u00a0 return rot;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>D&rsquo;autre part, on peut aussi se servir de la fonction\u00a0<strong>D3DXMatrixRotationAxis<\/strong> \u00e9quivalente \u00e0 la pr\u00e9c\u00e9dente formule de Rodrigues :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;d3dx10math.h&gt;\r\n\r\nD3DXMATRIX worldMatrix;\r\nD3DXMatrixIdentity(&amp;worldMatrix);\r\n\r\nstatic float r = 0.0f;\r\nr += fTimeSinceLastFrame;\r\nD3DXVECTOR3 axis(1.0f, -1.0f, 0.0f);\r\n\r\nD3DXMatrixRotationAxis(&amp;worldMatrix, &amp;axis, r);\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons appris deux m\u00e9thodes qui permet de faire la rotation d&rsquo;un point.<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; https:\/\/en.wikipedia.org\/wiki\/Rodrigues%27_rotation_formula<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Voici les matrices de rotation des axes X, Y et Z : Nous savons comment faire une rotation autour des axes X, Y, et Z, mais comment faire une rotation \u00e0 partir d&rsquo;un axe quelconque diff\u00e9rent des pr\u00e9c\u00e9dents ? Pr\u00e9requis : &#8211; Savoir ce qu&rsquo;est une matrice &#8211; Savoir ce qu&rsquo;est une transformation [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2852"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2852"}],"version-history":[{"count":103,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2852\/revisions"}],"predecessor-version":[{"id":2854,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2852\/revisions\/2854"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}