\documentclass{article} \usepackage{pstricks-add,pst-solides3d} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[garamond]{mathdesign} \renewcommand{\ttdefault}{lmtt} \usepackage[colorlinks=true]{hyperref} \usepackage[a4paper]{geometry} \usepackage{showexpl} \usepackage[french]{babel} \makeatletter \newdimen\pssizeStar \def\psset@sizeStar#1{\pssetlength\pssizeStar{#1}} \psset@sizeStar{1pt} %% adapté de \psRandom du package pstricks-add %% pour rendre aléatoire la taille des étoiles \def\psRandomStar{\pst@object{psRandomStar}}% \def\psRandomStar@i{\@ifnextchar({\psRandomStar@ii}{\psRandomStar@iii(0,0)(1,1)}} \def\psRandomStar@ii(#1){\@ifnextchar({\psRandomStar@iii(#1)}{\psRandomStar@iii(0,0)(#1)}} \def\psRandomStar@iii(#1)(#2)#3{% \def\pst@tempA{#3}% \ifx\pst@tempA\pst@empty\psclip{\psframe(#2)}\else\psclip{#3}\fi \pst@getcoor{#1}\pst@tempA \pst@getcoor{#2}\pst@tempB \begin@SpecialObj \addto@pscode{ \pst@tempA\space /yMin exch def /xMin exch def \pst@tempB\space /yMax exch def /xMax exch def /dy yMax yMin sub def /dx xMax xMin sub def rrand srand % initializes the random generator /getRandReal { rand 2147483647 div } def \psk@randomPoints { /DS \pst@number\pssizeStar\space getRandReal mul def \@nameuse{psds@\psk@dotstyle} \ifPst@color getRandReal 1 1 sethsbcolor \fi getRandReal dx mul xMin add getRandReal dy mul yMin add Dot \ifx\psk@fillstyle\psfs@solid fill \fi stroke } repeat }% \end@SpecialObj \endpsclip \ignorespaces } \makeatother \newcommand\Cadre[1]{\psframebox[fillstyle=solid,fillcolor=yellow,linecolor={[cmyk]{0,0,1,0.1}}]{\texttt{#1}}} \newcommand\encadre[1]{\begin{center} \psframebox[fillstyle=solid,fillcolor=green!33,linecolor=green,linewidth=0.5mm]{ \begin{minipage}{0.95\textwidth} {#1} \end{minipage}} \end{center}} \title{Dessiner la fusée de Tintin avec\\ \texttt{pst-solides3d}} \date{\today } \begin{document} \maketitle \tableofcontents \newpage \section{Présentation} Ce document décrit la méthode que j'ai employée pour dessiner avec \texttt{pst-solides3d}, la célèbre fusée à damier qui emporta pour un voyage aller-retour sur la Lune Tintin, ses inséparables compagnons : le capitaine Haddock, le professeur Tournesol et bien sûr Milou avec aussi, rappelons-le, l'ingénieur Franck Wolff et comme passagers imprévus : les deux Dupondt et le méchant colonel Jorgen, mais je n'insiste pas, les amateurs de Tintin connaissent l'histoire. \section{Le plan de la fusée} Le plan de la fusée est détaillé à la page 35 du premier album \textit{Objectif Lune}. C'est à partir de ce plan et en posant un quadrillage sur celui-ci que j'ai relevé les coordonnées des points du contour de la fusée. Le voici en réduction : \begin{LTXexample}[width=5cm] \psscalebox{0.5}{ \begin{pspicture}(-5,0)(5,24) \rput(-0.17,11.8){\includegraphics[scale=1.1]{plan.eps}} \psgrid(-5,0)(5,24) \end{pspicture}} \end{LTXexample} \section{La construction du corps de la fusée} \subsection{Le corps de la fusée} Le profil (la section) du corps de la fusée ayant été déterminé dans l'étape précédente, dans \verb+\psSolid+, c'est l'objet anneau qui va servir a déterminer toutes les caractéristiques du corps de la fusée grâce aux options \texttt{file} et \texttt{writesolid} : \begin{verbatim} \newcommand\SectionRocket{ %y z 0 5 -0.8 4.6 -0.85 5.6 -0.95 6.6 -1.05 7.6 -1.1 8.6 -1.2 9.6 -1.25 10.6 -1.3 11.6 -1.35 12.6 -1.4 13.6 -1.4 14.6 -1.375 15.6 -1.27 16.6 -1.2 17.6 -1.05 18.6 -0.85 19.6 -0.65 20.6 -0.35 21.6 -0.1 22.2 -0.1 23.75 0 23.75 } \begin{pspicture}(-5,0)(5,24) \psSolid[object=anneau,section=\SectionRocket,file=corps-fusee,action=writesolid] \end{pspicture} \end{verbatim} La séquence suivante \Cadre{LaTeX fichier.tex->dvips->GSview (Windows)ou gv (Linux)} va créer 4 fichiers : \begin{itemize} \item \texttt{corps-fusee-couleurs.dat} -> les couleurs des faces ; \item \texttt{corps-fusee-faces.dat} -> la liste des faces ; \item \texttt{corps-fusee-sommets.dat} -> la liste des sommets ; \item \texttt{corps-fusee-io.dat} -> le nombre de faces. \end{itemize} \encadre{Par défaut, sous Windows et Linux, la protection des fichiers du disque dur est activée et ne permet donc pas l'écriture sur le disque. Pour désactiver cette protection, tout au moins temporairement, voici les deux procédures correspondantes : \begin{description} \item[Linux : ] le conseil de Jean-Michel Sarlat : le plus simple est donc d'utiliser ghostscript directement, en console. Comme il n'y a rien attendre comme image : \textsf{\$> gs -dNOSAFER fichier.ps quit.ps} \item[Windows : ] dans le menu \textsf{Options}, l'option \textsf{`Protection des fichiers'} ne doit pas être cochée. \end{description}} \subsection{Le coloriage du damier rouge et blanc} Il faut intervenir directement dans les données du fichier \texttt{corps-fusee-couleurs.dat}. Dans un premier temps il faut numéroter les facettes grâce à l'option \texttt{numfaces=all}. On lit donc les fichiers précédents et on affiche la fusée avec ses faces numérotées. \begin{verbatim} \begin{pspicture}(-5,0)(5,24) \psframe(-5,0)(5,24) \psset{SphericalCoor,viewpoint=1000 250 0,Decran=1000} \psset{fontsize=5,numfaces=all} \psSolid[object=datfile,file=corps-fusee,grid](0,0,0) \end{pspicture} \end{verbatim} Il suffit maintenant dans le fichier \texttt{corps-fusee-couleurs.dat} de changer la couleur des facettes concernées de blanc en rouge : \texttt{(1 1 1 setrgbcolor)}-->\texttt{(1 0 0 setrgbcolor)} et d'enregistrer à nouveau le fichier. Le corps de la fusée avec le célèbre damier rouge et blanc est prêt ! \section{Amortisseurs, supports et empennages} Un amortisseur est constitué d'une hémisphère et le carénage des supports est un cône arrondi dont le profil de la section est un arc de cercle. Les deux vont ensemble et c'est encore l'anneau qui va permettre de tracer cet ensemble. Pour changer, le calcul se fera directement dans le \verb+\codejps+. \begin{verbatim} /ammortisseur_carenage {[ -90 10 0 { % for /angle exch def angle cos angle sin 1 add } for 0 2 22{ /angle exch def angle cos 11.78 mul -10.78 add angle sin 11.78 mul 1 add } for 0 5.75 ] 24 newanneau dup (rouge) outputcolors {0 -5 0 translatepoint3d} solidtransform \end{verbatim} Le profil de l'empennage est relevé sur le plan et il est considéré comme un objet plat à double face : \begin{verbatim} /empennage { 2 dict begin /F [ [5 6 4] % 0 [4 6 7] % 1 [4 7 3] % 2 [3 7 8] % 3 [3 8 2] % 4 [2 8 1] % 5 [1 8 0] % 6 [0 8 10] % 7 [10 8 11] % 8 [11 8 12] % 9 [12 8 16] % 10 [12 14 13] % 11 [12 15 14] % 12 [12 16 15] % 13 [8 17 16] % 14 [8 18 17] % 15 [8 9 18] % 16 % arrière [6 5 4] % 0 [4 7 6] % 1 [7 4 3] % 2 [7 3 8] % 3 [8 3 2] % 4 [8 2 1] % 5 [8 1 0] % 6 [8 0 10] % 7 [8 10 11] % 8 [8 11 12] % 9 [8 12 16] % 10 [14 12 13] % 11 [15 12 14] % 12 [16 12 15] % 13 [17 8 16] % 14 [18 8 17] % 15 [9 8 18] % 16 ] def %% tableau des sommets /S [ 0 -0.8 4.6 % 0 0 -0.85 5.6 % 1 0 -0.95 6.6 % 2 0 -1.05 7.6 % 3 0 -1.1 8.6 % 4 0 -1.2 9.6 % 5 0 -2 9.2 % 6 0 -3 8.3 % 7 0 -4 7.2 % 8 0 -5 5.75 % 9 0 -1.6 4 % 10 0 -2.5 3 % 11 0 -3.2 2.2 % 12 0 -4 1 % 13 0 -4.0072 1.4111 % 14 0 -4.0645 2.2313 % 15 0 -4.1789 3.0456 % 16 0 -4.35 3.8498 % 17 0 -4.5765 4.6402 % 18 ] def S F generesolid } def \end{verbatim} Ensuite empennage, carénage et amortisseur sont réunis pour ne faire qu'un objet : \begin{verbatim} /aile_pied1 {empennage ammortisseur_carenage solidfuz} def \end{verbatim} Avant dernière étape : on crée par rotation de $+120$ et $-120^{\mathrm{o}}$ les deux autres pieds et on fusionne l'ensemble. \begin{verbatim} /aile_pied2 { aile_pied1 {0 0 120 rotateOpoint3d } solidtransform } def /aile_pied3 { aile_pied1 {0 0 -120 rotateOpoint3d } solidtransform } def aile_pied1 aile_pied2 solidfuz aile_pied3 solidfuz (base-fusee) writesolidfile \end{verbatim} La dernière ligne va écrire quatre fichiers contenant toutes les caractéristiques de la base de la fusée. \section{La fusée entière} Pour enregistrer les caractéristiques complètes de la fusée il reste à fusionner le corps de la fusée avec sa base et à écrire sur le disque les fichiers : \begin{verbatim} \documentclass{article} \usepackage{pst-solides3d} \begin{document} %% pour enregistrer les caractéristiques %% complètes de la fusée \codejps{ (base-fusee) readsolidfile (corps-fusee) readsolidfile solidfuz (fusee-lunaire) writesolidfile } \composeSolid \end{document} \end{verbatim} \section{Utilisation des données des fichiers obtenus : fusée de base} \begin{LTXexample}[width=8cm] \psset{unit=0.2} \begin{pspicture}(-5,0)(5,20) \psset{lightsrc=100 20 20} \psset[pst-solides3d]{SphericalCoor,viewpoint=1000 20 20,Decran=800} \psSolid[object=grille,base=-10 10 -10 10,ngrid=5](0,0,0) \psSolid[object=datfile,file=fusee-lunaire,grid](0,0,0) \psSolid[object=parallelepiped, a=20,b=20,c=25,action=draw](0,0,12.5) \end{pspicture} \end{LTXexample} \section{Utilisation des données de la fusée de base pour d'autres situations} Pour représenter la fusée dans d'autres positions on peut être tenté d'utiliser les paramètres classiques \texttt{RotX, RotY et RotZ} et le résultat obtenu, qui sera bien sûr conforme aux paramètres choisis, sera obtenu après un temps de calcul plus ou moins long. Pour remédier à cet inconvénient il est préférable de faire calculer tous les paramètres de la fusée dans la position souhaitée. Par exemple, la séquence suivante : \begin{verbatim} \documentclass{article} \usepackage{pst-solides3d} \begin{document} \begin{pspicture}(-5,-5)(7,10) \codejps{ (fusee-lunaire) readsolidfile {0 60 30 rotateOpoint3d} solidtransform (fusee1) writesolidfile } \composeSolid \end{pspicture} \end{document} \end{verbatim} calcule toutes les caractéristiques de la fusée affichée ci-dessous : \begin{LTXexample}[width=8cm] \definecolor{BlueDark}{cmyk}{1,1,0,0.5} \psset{unit=0.5} \psset[pst-solides3d]{SphericalCoor,viewpoint=1000 0 20,Decran=300} \begin{pspicture}(-5,-5)(5,5) \pscircle*[linecolor=BlueDark]{5} \psRandomStar[linecolor=yellow!50,randomPoints=200](-5,-5)(5,5){\pscircle[linestyle=none]{5}} \psset{lightsrc=100 20 100} \psSolid[object=datfile,file=fusee1,grid](0,0,0) \end{pspicture} \end{LTXexample} \section{Conclusion} Les quelques vignettes qui illustrent cet article ainsi que les images de la page : \centerline{\url{http://melusine.eu.org/lab/bpst/pst-solides3d/tintin}} sont inspirées de quelques cases de l'album de Hergé \textit{\textsf{``Objectif Lune''}}. Si vous souhaitez illustrer quelques cases du deuxième album \textit{\textsf{``On a marché sur la Lune''}}, faites-moi signe\ldots \end{document}