La multiplication des coordonnées d'un point par la matrice de projection de WebGL produit des coordonnées de clipping .
Comment en déduire les coordonnées du pixel dans le canvas ? A l'inverse, comment retrouver les coordonnées du point à partir des coordonnées du pixel ?
Reportez-vous à cet article pour comprendre comment former la matrice de projection de WebGL.
La projection
La multiplication des coordonnées d'un point dans l'espace produit les coordonnées de clipping . La question est : comment passer de aux coordonnées d'un pixel dans la surface de projection de dimensions par à l'écran ?
On sait qu'il faut diviser les coordonnées de clipping par pour trouver les coordonnées de projection , et que c'est à partir de ces dernières coordonnées qu'il est possible de trouver .
Reste à savoir comment.
Pour passer de à , il faut considérer :
- que sont données dans une surface de par qui correspond directement à la surface de projection de par (NB : la prise en compte des aspect ratios dans la matrice de projection fait que cette correspondance est directe). En effet, le volume de clipping s'étend de à , si bien que chacune de ses faces fait par , notamment la face avant qui sert de surface de projection ;
- que l'axe des ordonnées à l'écran est inversé par rapport à l'axe des ordonnées dans l'espace.
Par conséquent :
xp = xc / wc yp = yc / wc zp = zc / wc wp = wc / wc
Finalement :
xs = (xp + 1.0) * width / 2.0 ys = (1.0 - yp) * height / 2.0
La rétroprojection
Le problème est donc l'inverse : retrouver les coordonnées du point qui correspond au pixel en sur la surface de projection de dimensions par à l'écran.
Pour commencer, il faut retrouver les coordonnées de la projection . Ce sont des coordonnées normalisées, c'est-à-dire comprises entre et :
- et sont exprimées dans le repère de la face avant du volume de clipping. Les dimensions de cette face sont par . Si pour simplifier on pose que et , l'origine de son repère se trouve au centre de la face. Enfin, la face correspond directement à la surface de projection de par , du fait de la prise en compte des aspect ratios dans la matrice de projection.
- correspond à la version normalisée de la profondeur de cette face, soit .