Formes géométriques 3D sous Tikz

Dans cet article, je vous donne quelques bouts de code pour tracer rapidement et simplement des formes géométriques simples en trois dimensions.

Je ne vanterai jamais assez les mérites de TikZ pour tracer des figures directement dans du code LaTeX. TikZ est bien sûr plus adapté aux figures planes qu’aux représentations tridimensionnelles. Toutefois, il est facile de donner des effets de perspective pour représenter des formes simples dans l’espace, notamment en jouant sur les dégradés.

Dans cet article, je vais vous partager quelques solutions que j’ai retenu pour tracer des formes élémentaires.. Je vous donne ici le code minimal pour quelques formes élémentaires, que vous aurez tout le loisir d’ajuster selon vos goûts et vos contraintes et d’annoter comme bon vous semblera.

Sphère

Commençons par le plus simple : une sphère. Pour que votre sphère n’apparaisse pas comme un simple cercle, c’est bien sûr l’effet d’éclairage qui va donner du relief au rendu. Cette effet est programmé par défaut dans TikZ, comme illustré ci-dessous :

Dessin d’une sphère sous Tikz
\begin{tikzpicture}
	\shade[ball color=blue,draw] (0,0) circle (1);
\end{tikzpicture}

Cube transparent

En s’inspirant de ce que j’avais déjà fait pour un cube opaque, on peut facilement dessiner un cube avec des effets de transparence en dessinant les 6 faces :

\begin{tikzpicture}[fill=blue,fill opacity=0.7,draw,scale=3,rounded corners=0.5pt]
	\def\cubecol{blue}
	\def\opacity{0.8}
	\filldraw (-0.5,-0.5,-0.5) -- ++(1,0,0) -- ++(0,1,0) -- ++(-1, 0, 0) -- cycle;
	\filldraw (-0.5,-0.5,-0.5) -- ++(1,0,0) -- ++(0,0,1) -- ++(-1, 0, 0) -- cycle;
	\filldraw (-0.5,-0.5,-0.5) -- ++(0,1,0) -- ++(0,0,1) -- ++(0, -1, 0) -- cycle;
	\filldraw[fill=blue!20] (0.5,0.5,0.5) -- ++(-1,0,0) -- ++(0,-1,0) -- ++(1, 0, 0) -- cycle;
	\filldraw[fill=blue!50!black!50] (0.5,0.5,0.5) -- ++(-1,0,0) -- ++(0,0,-1) -- ++(1, 0, 0) -- cycle;
	\filldraw[fill=blue!20!black!80] (0.5,0.5,0.5) -- ++(0,-1,0) -- ++(0,0,-1) -- ++(0, 1, 0) -- cycle;
\end{tikzpicture}
Cube avec effet de transparence

Tétrahèdre

Dans le ca d’un tétraèdre, la seule solution pour que le lecteur visualise bien les différentes face est de jouer à la fois sur l’éclairage et sur la transparence.

Tétrahèdre à base équilatérale
\begin{tikzpicture}[scale=3]
	\def\tetcol{blue}
	\def\opacity{0.8}
	\coordinate (A) at (0,0,0);
	\coordinate (B) at (1,0,0);
	\coordinate (C) at (0.5,0,0.866);
	\coordinate (D) at (0.5,0.866,0.5);
	\filldraw[fill=\tetcol!20,rounded corners=0.5pt] (A) -- (B) -- (D) -- cycle;
	\filldraw[fill=\tetcol,rounded corners=0.5pt] (A) -- (C) -- (B) -- cycle;
	\filldraw[fill=\tetcol!40,fill opacity=\opacity,rounded corners=0.5pt] (B) -- (C) -- (D) -- cycle;
	\filldraw[fill=\tetcol!60,fill opacity=\opacity,rounded corners=0.5pt] (A) -- (C) -- (D) -- cycle;
\end{tikzpicture}

Cylindre

L’impression de perspective du cylindre réside bien sûr dans le choix du dégradé. Le rendu est le plus réaliste quand on donne l’impression d’une source lumineuse sur un côté du cylindre.

Le plus dur est ici le traitement de l’ellipse et de la demi-ellipse inférieure.

Cylindre plein
\begin{tikzpicture}
	\pgfmathsetmacro{\persp}{0.2};
	\pgfmathsetmacro{\R}{2}
	\pgfmathsetmacro{\H}{5.5}
	\def\cycol{blue}
	\filldraw[fill=\cycol!70] (0,\H) ellipse ({\R} and \R*\persp);
	\shade[left color=\cycol!20!black!80, right color=\cycol!20, middle color=\cycol,draw] (\R,0) arc (0:-180:{\R} and \R*\persp) --(-\R,\H) arc (-180:0:{\R} and \R*\persp) --cycle;
\end{tikzpicture}

Demi-cylindre

Le cas du demi-cylindre s’inspire largement du cylindre complet puisqu’il suffit d’ajouter les deux portions de plan de coupe.

Demi-cylindre
\begin{tikzpicture}
	\pgfmathsetmacro{\persp}{0.5};
	\pgfmathsetmacro{\Ri}{1.5}
	\pgfmathsetmacro{\Re}{2}
	\pgfmathsetmacro{\H}{5.5}
	\def\cycol{blue}
	\shade[right color=\cycol!20!black!80, left color=\cycol!20, middle color=\cycol,draw,rounded corners=0.5pt] (\Ri,0) arc (0:180:{\Ri} and \Ri*\persp) --++ (0,\H) arc (180:0:{\Ri} and \Ri*\persp)-- cycle;
	\filldraw[fill=blue!10] (\Ri,0) -- (\Ri,\H) -- (\Re,\H) -- (\Re,0) -- cycle;
	\filldraw[fill=blue!10] (-\Ri,0) -- (-\Ri,\H) -- (-\Re,\H) -- (-\Re,0) -- cycle;
	\filldraw[fill=blue!20] (\Re,\H) arc (0:180:{\Re} and \Re*\persp) -- (-\Ri,\H)  arc (180:0:{\Ri} and \Ri*\persp) -- cycle;
\end{tikzpicture}

Cylindre creux

Ici encore, on s’inspire du cylindre complet. Il faut juste jongler un peu entre les demi-ellipses visibles (traits continus) et les demi-ellipses cachées (pointillés).

\begin{tikzpicture}
	\pgfmathsetmacro{\persp}{0.2};
	\pgfmathsetmacro{\Ri}{1.5}
	\pgfmathsetmacro{\Re}{2}
	\pgfmathsetmacro{\H}{5.5}
	\pgfmathsetmacro{\e}{0.5}
	\draw (\Re,\H-\e) arc (0:-180:{\Re} and \Re*\persp);
	\draw (0,\H) ellipse ({\Re} and \Re*\persp);
	\draw (\Re,\e) arc (0:-180:{\Re} and \Re*\persp);
	\draw (\Re,0) arc (0:-180:{\Re} and \Re*\persp);
	\draw[dashed] (0,\H-\e) ellipse ({\Ri} and \Ri*\persp);
	\draw[dashed] (\Re,\H-\e) arc (0:180:{\Re} and \Re*\persp);
	\draw[dashed] (\Re,\e) arc (0:180:{\Re} and \Re*\persp);
	\draw[dashed] (0,\e) ellipse ({\Ri} and \Ri*\persp);
	\draw (-\Re,0)--++(0,\H);
	\draw (\Re,0)--++(0,\H);
	\draw[dashed] (-\Ri,\e)--++(0,\H-2*\e);
	\draw[dashed] (\Ri,\e)--++(0,\H-2*\e);
	\draw[dashed] (\Re,0) arc (0:180:{\Re} and \Re*\persp);
\end{tikzpicture}