La base canonique

  • Base formée des vecteurs canoniques \(\hat{\mathbf{i}}, \hat{\mathbf{j}}, \hat{\mathbf{k}}\)\(\{\hat{\mathbf{i}}, \hat{\mathbf{j}}, \hat{\mathbf{k}}\} \in \mathbb{R}^n\)
  • \(\hat{\mathbf{i}} = \begin{bmatrix}1 \\ 0 \\ 0 \end{bmatrix}, \quad \hat{\mathbf{j}} = \begin{bmatrix}0 \\ 1 \\ 0 \end{bmatrix}, \quad \hat{\mathbf{k}} = \begin{bmatrix}0 \\ 0 \\ 1 \end{bmatrix}, \quad \text{(pour } \mathbb{R}^3\text{)}\)
  • Un système de coordonnée est une base plus une origine

Par exemple, le système de coordonnées cartésiennes standard est formé de la base canonique et l’orgine \(\mathbf{0} \in \mathbb{R}^n\).

Base orthogonale

  • Base formée de vecteurs orthogonaux qui ne sont pas nécessairement les vecteurs canoniques
  • La base canonique est une base orthogonale

Changement de base

  • Un vecteur ou un point est exprimé selon une base
    • Par défaut, relatif au système de coordonnées cartésiennes standard
  • Passer de coordonnées du monde à coordonnées locales implique un changement de base

Par exemple, un point \(\mathbf{p}\) exprimé selon deux systèmes de coordonnées. Les deux ont leur origine à \((0,0)\) dans le système standard. Les vecteurs de bases sont typiquement exprimé selon le système standard.

\[ \text{Base A}\\ \hat{\mathbf{i}} = \begin{bmatrix}1 \\ 0 \end{bmatrix}, \quad \hat{\mathbf{j}} = \begin{bmatrix}0 \\ 1 \end{bmatrix}, \quad \]

\[ \text{Base B}\\ \hat{\mathbf{i'}} = \begin{bmatrix}\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} \end{bmatrix}, \quad \hat{\mathbf{j'}} = \begin{bmatrix}-\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} \end{bmatrix}, \quad \]

  • Peu importe la base, les vecteurs de bases forment les axes du système de coordonnées.
  • Un vecteur ou un point est donnée par une combinaison linéaire \(\mathbf{p} = p_0\mathbf{e}_0 + p_1\mathbf{e}_1 + ... p_{n-1}\mathbf{e}_{n-1} = \sum_{i = 0}^{n-1}p_i\mathbf{e}_n\)
    • \(\mathbf{e}_n\) est un vecteur de base

\[ \begin{align*} \mathbf{p} &= p_x \cdot \mathbf{\hat{i}} + p_y \cdot \mathbf{\hat{j}}\\ &= 1 \begin{bmatrix}1 \\ 0 \end{bmatrix} + 1 \begin{bmatrix}0 \\ 1 \end{bmatrix}\\ &= \begin{bmatrix}1 \\ 1 \end{bmatrix} \end{align*} \]

Si nous voulons trouver les coordonnées du point \((1,1)\) dans la base \(B\) :

\[ \begin{align*} \mathbf{p} &= p'_x \cdot \mathbf{\hat{i'}} + p'_y \cdot \mathbf{\hat{j'}}\\ \begin{bmatrix}1 \\ 1 \end{bmatrix} &= p'_x \begin{bmatrix}\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} \end{bmatrix} + p'_y \begin{bmatrix}-\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} \end{bmatrix}\\ \begin{bmatrix}1 \\ 1 \end{bmatrix} &= \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix}\begin{bmatrix} p'_x \\ p'_y \end{bmatrix} \end{align*} \]

Nous voyons qu’une matrice formée des axes du système de coordonnée émerge. Un changement de base est une rotation qui amène les axes d’une base vers une autre. Observez que c’est une transformation sur le système de coordonnées et non les points dans un système.

Ici, le point \((1,1)\) est dans le système avec base \(A\) et \((p'_x, p'_y)\) est le même point mais exprimé dans la base \(B\).

Pour résoudre le système d’équations linéaire afin d’obtenir \((p'_x, p'_y)\) : \[ \begin{align*} \begin{bmatrix}1 \\ 1 \end{bmatrix} &= \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix} \begin{bmatrix} p'_x \\ p'_y \end{bmatrix}\\ &\quad\quad\quad\quad \downarrow \quad \\ \begin{bmatrix}p'_x \\ p'_y \end{bmatrix} &= \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix}^{-1} \begin{bmatrix}1 \\ 1 \end{bmatrix}\\ &= \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix}^{T} \begin{bmatrix}1 \\ 1 \end{bmatrix}\\ &= \begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix} \begin{bmatrix}1 \\ 1 \end{bmatrix}\\ &= \begin{bmatrix}\sqrt{2} \\ 0 \end{bmatrix} \end{align*} \]

\((1,1)\) dans la base \(A\) est \((\sqrt{2},0)\) dans la base \(B\) !

Notez comment la matrice représente une rotation de \(45^{\circ}\) (\(\circlearrowleft\)) pour passer de \(B\) à \(A\) et une rotation de \(-45^{\circ}\) (\(\circlearrowright\)) pour \(A\) à \(B\).

Construire une matrice de changement de base

Si nous connaissons les axes d’une base, nous pouvons facilement faire un changement de base en construisant une matrice à partir des axes :

\[ M_{B \to A} = \begin{bmatrix} \vert & \vert & & \vert \\ \mathbf{e}_0 & \mathbf{e}_1 & \cdots & \mathbf{e}_{n-1} \\ \vert & \vert & & \vert \end{bmatrix} = \begin{bmatrix} e_{0,0} & e_{1,0} & \cdots & e_{n-1,0} \\ e_{0,1} & e_{1,1} & \cdots & e_{n-1,1} \\ \vdots & \vdots & \ddots & \vdots \\ e_{0,n-1} & e_{1,n-1} & \cdots & e_{n-1,n-1} \end{bmatrix} \]

L’inverse d’une matrice est sa transposé lorsque la matrice est carrée et orthogonale. Une base est toujours carrée, mais pas nécessairement orthogonale. En ce qui concerne notre cours, nous allons toujours travailler avec des bases orthonormaux (orthogonale et normalisée).

\[ \begin{bmatrix} e_{0,0} & e_{1,0} & \cdots & e_{n-1,0} \\ e_{0,1} & e_{1,1} & \cdots & e_{n-1,1} \\ \vdots & \vdots & \ddots & \vdots \\ e_{0,n-1} & e_{1,n-1} & \cdots & e_{n-1,n-1} \end{bmatrix}^T = \begin{bmatrix} e_{0,0} & e_{0,1} & \cdots & e_{0,n-1} \\ e_{1,0} & e_{1,1} & \cdots & e_{1,n-1} \\ \vdots & \vdots & \ddots & \vdots \\ e_{n-1,0} & e_{n-1,1} & \cdots & e_{n-1,n-1} \end{bmatrix} \]

Système de coordonnées avec origine autre que \(\mathbf{0}\)

L’origine d’un système de coordonnée peut-être une valeur autre que \(\mathbf{0}\). Soit \(\mathbf{o}\) l’origine d’un système de coordonnées. Par exemple, un système peut avoir \(\mathbf{o} = (2,3)\). Notez que \((2,3)\) ici est forcément relatif à un autre système de coordonnées. Pour l’exemple suivant, le système avec la base \(A\) est canonique et celui avec la base \(B\) est situé à \((2,3)\) relatif à \(A\).

Effectuer une translation sur le point et système \(B\) de \(-origine = -(2,3)\) amène le systeme à l’origine \((0,0)\). Bien que le point soit maintenant à \((-1,-2)\) dans le système canonique \(A\), il est toujours aux même coordonnées relatif au système \(B\).

\[ \begin{align*} (\mathbf{p - o}) &= p'_x \cdot \mathbf{\hat{i'}} + p'_y \cdot \mathbf{\hat{j'}}\\ &= \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix}\begin{bmatrix} p'_x \\ p'_y \end{bmatrix}\\ \end{align*} \] \[\downarrow\] \[ \begin{align*} \begin{bmatrix} p'_x \\ p'_y \end{bmatrix} &= \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix}^{-1} (\mathbf{p - o})\\ &=\begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix} (\mathbf{p - o})\\ \end{align*} \] \[ \downarrow \] \[ \begin{align*} \begin{bmatrix} p'_x \\ p'_y \\ 1\end{bmatrix} &=\begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0\\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix}p_x - o_x\\p_y - o_y\\1\end{bmatrix}\\ &=\begin{bmatrix} 1 & 0 & -o_x\\ 0 & 1 & -o_y\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0\\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix}p_x\\p_y\\1\end{bmatrix}\\ &=\begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \cdot -o_x + \frac{\sqrt{2}}{2} \cdot -o_y\\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \cdot -o_x + \frac{\sqrt{2}}{2} \cdot -o_y\\ 0 & 0 & 1 \end{bmatrix}\\ &=\begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & -\mathbf{\hat{i'}} \cdot \mathbf{o} \\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & -\mathbf{\hat{j'}} \cdot \mathbf{o}\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix}p_x\\p_y\\1\end{bmatrix}\\ \end{align*} \]

Effectivement, nous appliquons une rotation autour de l’origine \(\mathbf{0}\) et après une translation dans le système de coordonnées tourné. C’est comme une \(\mathbf{TRS}\) ! Considérant que nous n’allons travaillé qu’avec des axes orthonormaux, le \(S\) ne nous intéresse pas.

\[ M_{coorA \to coorB} = \begin{bmatrix} \mathbf{R} & \mathbf{T} \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} e_{0,0} & e_{0,1} & ... & e_{0,n-1} & - \mathbf{e}_0 \cdot \mathbf{o} \\ e_{1,0} & e_{1,1} & ... & e_{1,n-1} & - \mathbf{e}_1 \cdot \mathbf{o} \\ \vdots & \vdots & \ddots & \vdots \\ e_{n-1,0} & e_{n-1,1} & ... & e_{n-1,n-1} & - \mathbf{e}_{n-1} \cdot \mathbf{o}\\ 0 & 0 & ... & 0 & 1 \end{bmatrix} \]

\[ M_{coorB \to coorA} = \begin{bmatrix} \mathbf{R}^T & -\mathbf{T} \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} e_{0,0} & e_{1,0} & ... & e_{n-1,0} & + \mathbf{e}_0 \cdot \mathbf{o} \\ e_{0,1} & e_{1,1} & ... & e_{n-1,1} & + \mathbf{e}_1 \cdot \mathbf{o} \\ \vdots & \vdots & \ddots & \vdots \\ e_{0,n-1} & e_{1,n-1} & ... & e_{n-1,n-1} & + \mathbf{e}_{n-1} \cdot \mathbf{o}\\ 0 & 0 & ... & 0 & 1 \end{bmatrix} \]

Exercice

1)

Supposons que nous avions une caméra virtuelle dans une scène 3D. La camera virtuelle est à la position \((5,-4, 1)\) dans l’espace du monde. La caméra regarde un objet à la position \((6, 7, 2)\) de sorte à avoir l’objet centré dans son image et à l’endroit.

Construisez la matrice de changement $M_{coorMonde coorCaméra} qui permetra d’exprimer la position de l’objet relatif à la caméra.

Indices :

  • Déterminer les vecteurs de bases pour le système de coordonnée de la caméra. Remarquez que son orientation est selon où elle regarde et qu’elle soit à l’endroit.
  • Le produit vectoriel pour construire une base orthogonale

2)

Supposons que nous avions une caméra virtuelle dans une scène 3D. La camera virtuelle est à la position \((5,-4, 1)\) dans l’espace du monde. La caméra regarde un objet de sorte à avoir l’objet centré dans son image et à l’endroit.

  • Le centre de l’objet est à \((0,1,0)\) dans l’espace des sommets.

  • L’objet a un \(TRS_{enfant} = \begin{bmatrix} 0 & -2 & 0 & -1 \\ 2 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}\)

  • L’objet est enfant d’un autre objet avec \(TRS_{parent} = \begin{bmatrix} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 4 \\ 0 & 0 & 1 & 2 \\ 0 & 0 & 0 & 1 \end{bmatrix}\)

  1. Construisez la matrice modèle \(M_{coorSommets \to coorMonde}\)
  2. Construisez la matrice \(M_{coorMonde \to coorCaméra}\) qui permetra d’exprimer les sommets de l’objet relatif à la caméra.

Caméra virtuelle et View Space

Nous savons comment obtenir une matrice Model \(M\) pour un objet afin de le placer et orienter dans la scène. En effet, la matrice \(M\) a le but d’aller de l’espace des sommets à l’espace du monde. Il faut ensuite une matrice View \(V\) pour simuler une partie d’une caméra virtuelle. L’idée est de prendre les sommets dans l’espace du monde et de les transformer vers l’espace de la caméra (view space/camera space). Cet espace est selon le point de vue de la caméra (selon sa position et orientation). Le view space n’est pas encore l’image 2D. C’est un espace 3D.

Soit la scène suivante :

Un plan, un cube, et une caméra sont dans la scène. La caméra est placée dans la scène comme n’importe quel autre objet (avec une matrice \(M\)).

Le repère de la caméra n’est pas le même que celui de la scène : l’origine n’est pas à \((0,0)\) et il a une orientation différente. Regardons la scène d’un autre angle pour mieux observer l’orientation de la caméra :

Finalement, d’un dernier point de vue :

Ultimement, cette caméra, en plus d’une méthode de projection que nous verrons plus tard , rend l’image suivante :

La dernière image est souvent non intuitive. Voici un autre exemple :

Prenez votre caméra et prenez une photo d’un sujet. Assurez-vous de garder votre caméra droit. Ensuite, tournez votre caméra et prenez une photo du même sujet. Notez comment l’image résultante a la rotation inverse. Si vous tournez votre caméra dans le sens horaire, le sujet observe votre caméra tourner dans le sens antihoraire !

View Space

Supposons une caméra à la position \((-10,0,0)\). Elle regarde un quad devant elle. L’origine du carré est à la position \((-10,0,10)\). Aussi, le quad repose sur un plan.

Le view space est la scène selon le point de vue de la caméra.

Notez que les sommets du carré ne sont plus autour de \((-10,0,10)\). Une transformation du world space au view space à été faite. Si la caméra est à \((-10, 0, 0)\), il faut faire une translation sur les sommets de \(-(-10,0,0)\) :

\[SommetsViewSpace = -T_{caméra} \times SommetsWorldSpace\]

Ceci place l’origine du carré à \((0,0,10)\).

Supposons maintenant que la caméra est tournée de \(25^{\circ}\) autour de l’axe \(z\) et que le carré et le plan ne changent pas. Il faut tourner les objets de \(25^{\circ}\) avant de faire la translation \(-T_{caméra}\).

Construire \(V\)

Nous savons que \(V\) doit changer l’orientation de la scène pour celle de la caméra et après faire une translation. \(V\) est construit selon la position de la caméra (eye), la position que la caméra regarde (center) et un vecteur unitaire “par en haut” (Up). Le vecteur Up est nécessaire pour définir l’orientation de la caméra.

On construit trois vecteurs orthonormaux : Front, Side, et Top. Ceci nous donne le repère caméra.

\[ \mathbf{Front} = \frac{\mathbf{center} - \mathbf{eye}}{||{\mathbf{center} - \mathbf{eye}}||}\\[15pt] \mathbf{Side} = \mathbf{Front} \times \mathbf{Up}\\[15pt] \mathbf{Top} = \mathbf{Front} \times \mathbf{Side} \]

(On calcule quand même \(Top\), car \(Up\) n’est peut-être pas orthogonale avec \(Front\))

Nous construisons \(V\) comme suit : \[ V = \begin{bmatrix} \text{Side}_x & \text{Side}_y & \text{Side}_z & -\text{Side} \cdot \mathbf{eye} \\ \text{Top}_x & \text{Top}_y & \text{Top}_z & -\text{Top} \cdot \mathbf{eye} \\ -\text{Front}_x & -\text{Front}_y & -\text{Front}_z & \text{Front} \cdot \mathbf{eye} \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

En OpenGL, l’axe z positif pointe “par en arrière”. C’est la convention d’OpenGL. Unity, par contre, a z positif comme “par en avant”. \(V\) utilise \(-Front\) pour suivre la convention OpenGL.