Dans les schémas 3D sous TikZ, du choix de la perspective dépendra la qualité et le réalisme de l’illustration. Je vous donne ici un moyen de garantir la propreté des projections nécessaires à l’impression de perspective.
Table des matières
Exemple
Voici ci-après un exemple de paramétrage des axes 3D, comme on le fait habituellement :
\begin{tikzpicture}[x={(-0.5 cm,-0.3 cm)},y={(0.5 cm,-0.3 cm)},z={(0,0.5 cm)}] \draw[->] (0,0,0) -- (1,0,0) node[anchor=north east]{${x}$}; \draw[->] (0,0,0) -- (0,1,0) node[anchor=north west]{${y}$}; \draw[->] (0,0,0) -- (0,0,1) node[anchor=south]{${z}$}; \end{tikzpicture} |
On obtient ainsi :
Objectif
L’objectif est donc de s’assurer que les axes soient paramétrés de façon réaliste. Sur la figure suivante, est le repère que l’on souhaite utiliser pour la représentation tandis que
est le repère par défaut. On parle ici de perspective axonométrique.

On cherche donc la transformation à appliquer au repère de référence pour aboutir au repère souhaité.
Les maths
On applique successivement les transformations suivantes (illustrées ci-après) :
- rotation d’un angle
autour de
(soit
autour de
),
- rotation d’un angle
autour de
(soit
autour de
), résultat de la transformation de
par la rotation précédente.

Soit la matrice de rotation correspondant aux précédentes transformations. On a alors :
L’objectif étant de dessiner le repère en 2D (dans le plan de la feuille…), on va projeter les composantes de cette base dans
Code LaTeX
On connaît maintenant la transformation à appliquer aux coordonnées d’un point de l’espace pour le positionner dans le repère choisi pour une valeur de
donnée.
On va donc définir un nouvel environnement (3dtikzpicture
) dans lequel appliquer la transformation.
\newenvironment{3dtikzpicture}[3][]{ \pgfmathsetmacro\xx{cos(#3)} \pgfmathsetmacro\xy{cos(#2)*sin(#3)} \pgfmathsetmacro\yx{-sin(#3)} \pgfmathsetmacro\yy{cos(#2)*cos(#3)} \pgfmathsetmacro\zy{sin(#2)} \begin{tikzpicture}[x={(\xx cm,\xy cm)},y={(\yx cm,\yy cm)},z={(0,\zy cm)},#1] }{ \end{tikzpicture} } |
Les arguments obligatoires sont l’angle et l’angle
. L’argument optionnel est passé à l’environnement tikzpicture (ex :
scale=2
, thick
etc.).
Pour la figure avec les repères de référence et repère tourné (voir plus haut), ces derniers ont été dessinés avec le code suivant :
\begin{3dtikzpicture}{0}{0} \draw[->] (0,0,0) -- (1,0,0) node[pos=1.2]{$\e{x}$}; \draw[->] (0,0,0) -- (0,1,0) node[pos=1.2]{$\e{y}$}; \draw (0,0,0) -- (0,0,1) node[anchor=north]{$\e{z}$}; \draw[red] (0.2,0,0) --(0.2,0.2,0)--(0,0.2,0)--(0,0.2,0.2)--(0,0,0.2)-- (0.2,0,0.2) --cycle; \end{3dtikzpicture} \begin{3dtikzpicture}{60}{120} \draw[->] (0,0,0) -- (1,0,0) node[pos=1.2]{$\e[1]{x}$}; \draw[->] (0,0,0) -- (0,1,0) node[pos=1.2]{$\e[1]{y}$}; \draw[->] (0,0,0) -- (0,0,1) node[pos=1.2]{$\e[1]{z}$}; \draw[red] (0.2,0,0) --(0.2,0.2,0)--(0,0.2,0)--(0,0.2,0.2)--(0,0,0.2)-- (0.2,0,0.2) --cycle; \end{3dtikzpicture} |
Pour aller plus loin
Si vous cherchez plus de possibilités de rotation (angles d’Euler par exemple), je vous invite à regarder du côté du package tikz-3dplot. Si vous souhaitez dessiner en perspective fuyante, je vous souhaite bien du courage…
Note : les figures de rotations ont été réalisées depuis mon package RotationFigure.