06 — Coordonnées sphériques et repères locaux
Ce que tu vas apprendre
- Décrire une direction par deux angles : les coordonnées sphériques
- Passer des angles aux coordonnées cartésiennes (et inversement)
- Construire un repère local (base orthonormée) à partir d'une normale
- Pourquoi c'est indispensable au shading et à l'échantillonnage
Prérequis
- Le produit vectoriel et les repères
Jusqu'ici, une direction, c'était trois nombres (x, y, z). Mais parfois, penser en angles est bien plus naturel : « 30° au-dessus de l'horizon, orienté plein est ». C'est tout l'intérêt des coordonnées sphériques. Et une fois qu'on sait fabriquer des directions, on a souvent besoin de tout un repère local autour d'un point — par exemple pour raisonner autour d'une normale de surface.
Les coordonnées sphériques
Une direction dans l'espace peut se décrire par deux angles (et un rayon si on veut une position, pas juste une direction) :
- θ (thêta), l'angle polaire ou d'inclinaison, mesuré depuis un axe de référence (souvent le « haut », y ou z) ;
- φ (phi), l'angle azimutal, la rotation autour de cet axe.
Le passage des angles aux coordonnées cartésiennes se fait par la trigonométrie. Avec l'axe vertical en y, un rayon r :
x = r · sin(θ) · cos(φ)
y = r · cos(θ)
z = r · sin(θ) · sin(φ)
C'est exactement ce qui sert à placer une caméra « en orbite » autour d'un objet (deux curseurs d'angle), à positionner un soleil dans un ciel, ou à échantillonner des directions sur l'hémisphère au-dessus d'une surface — l'opération de base de l'éclairage global et du path tracing. Penser en angles rend ces problèmes triviaux ; les exprimer directement en (x, y, z) serait un cauchemar.
Fabriquer un repère local
Voici un besoin omniprésent en rendu : on a une seule direction privilégiée — typiquement la normale d'une surface — et on veut un repère complet autour d'elle (trois axes perpendiculaires, unitaires : une base orthonormée). Pourquoi ? Parce que beaucoup de calculs d'éclairage s'expriment simplement « dans le repère de la surface », où la normale est l'axe vertical.
Le produit vectoriel (article 02) fait tout le travail. À partir de la normale N :
- Choisir un vecteur
Tquelconque non parallèle àN(par exemple l'axe du monde le moins aligné avecN). tangente = normalize(cross(T, N))— perpendiculaire àN.bitangente = cross(N, tangente)— perpendiculaire aux deux, et déjà unitaire siNet la tangente le sont.
N (normale)
|
| bitangente
+————————→
/
/ tangente
On a maintenant trois axes orthonormés (tangente, bitangente, N). Rangés dans une matrice, ils forment une matrice d'orientation qui transforme n'importe quelle direction du repère local vers le repère monde, et vice versa. C'est exactement ce mécanisme qui permet d'appliquer une normal map en texturing, ou d'orienter les rayons échantillonnés autour d'une normale.
Le piège du vecteur de référence
Une subtilité : à l'étape 1, si le vecteur T choisi est (presque) parallèle à N, le produit vectoriel donne un vecteur quasi nul, et le repère s'effondre. La parade habituelle consiste à choisir T en fonction de N — par exemple, si la composante la plus petite de N est x, prendre T = (1, 0, 0), sinon un autre axe — pour garantir qu'ils ne sont jamais alignés. C'est le même type de cas-limite que celui qui guette la fonction LookAt (article 10), où la direction de visée peut s'aligner avec le « haut ».
L'article suivant traite l'exception promise depuis le début : pourquoi une normale ne se transforme pas avec la matrice de l'objet, et quelle matrice utiliser à la place.
Sources
- Scratchapixel. Geometry — Spherical Coordinates et Creating an Orientation Matrix or Local Coordinate System. scratchapixel.com
- Pharr, M., Jakob, W., & Humphreys, G. (2023). Physically Based Rendering (4ᵉ éd.), section « Coordinate System from a Vector » et « Spherical Geometry ». pbr-book.org
- Marschner, S., & Shirley, P. (2021). Fundamentals of Computer Graphics (5ᵉ éd.). CRC Press.