
Le ray casting (littéralement "lancer de rayon") est une technique de calcul d'images de synthèse 3D, qui comme son nom l'indique, consiste à utiliser des rayons virtuels pour déterminer ce qui est visible à l'écran. Elle fait partie des nombreux algorythmes de ray tracing.
Cette technique est facilement accélérée matériellement par une carte graphique dédiée. L'accélération peut se faire en utilisant l'API OpenGL, Glide (tombé en désuétude), ou Direct3D.
Elle a été utilisée avec succès au début des années 1990 dans les jeux vidéo comme Wolfenstein 3D ou Doom. L'implémentation était alors entièrement logicielle et ne faisait pas appel à du matériel spécifique. Tombée en désuétude lors de l'apparition des moteurs entièrement en 3D, cette technique a été remise au goût du jour par les technologies portables comme Java ou Flash.
Avant cela, les algorythmes d'infographie 3D projetaient affinement les objets 3D sur le plan de la caméra. Afficher une image de cette manière était difficile avec les faces et arrêtes cachées, mais aussi à cause des surfaces courbées, qui devaient être calculées explicitement.
Le ray casting a grandement simplifié le rendu d'image en passant d'une projection d'un espace 3D en 2D à une recherche d'intersection de lignes avec les objets dans l'espace. La technique est commune en infographie et en modélistion géométrique. On utilise pour cela des transformations homogènes de coordonnées représentées par des matrices 4x4.
L'algorythme va créer une image en envoyant des rayons depuis un point focal à travers une grille dont les cases sont les pixels de l'écran. Un (ou plusieurs) rayon va passer par chaque pixel, et on va trouver le premier objet qui va rencontrer le rayon. A partir des propriétés de l'objet et de l'environnement, on va pouvoir calculer de suelle couleur sera le pixel. Le ray casting tire parti de certaines caractéristiques du monde virtuel pour simplifier et accélérer le calcul des images :
Cette méthode de calcul présente plusieurs limites :

On peut utiliser le ray casting de deux manières différents, avec une camera ponctuelle (comme sur la partie gauche de l'illustration) pour avoir une image avec de la perspective, ou avec une caméra "à l'infini", pour avoir de la perspective cavalière, comme sur des dessins d'usine. Dans le modèle de la caméra ponctuelle, on a un point focal (la caméra) et une matrice de pixels carré (l'écran), on appelle longueur focale la distance qui les séppare. Les rayons lumineux partent du point focal et traverse les pixels, on prend généralement un rayon par pixel.
Lorsque que la distance focal est infinie, on est dans le cas d'une caméra à l'infini. Les rayons lumineux sont parallèles les uns aux autres, ce qui donne comme nom à ce point de vue le nom de vue parallèlle. Bien que la vue avec de la perspective est plus naturelle pour produire des images, certaines applications nécessite des rayons qui soient uniformément distribués.

Pour un souci de simplicité de modélisation, on se place dans le cas dune caméra ponctuelle et on utilisera le système de coordonnée suivant : l'axe Z est orthogonal à l'écran (donc les axes X et Y forment le plan qui contient l'écran), l'axe Y est la verticale, le point focal (celui d'où partent les rayons) est sur l'axe -Z.
Un rayon est simplement une droite dans l'espace. Il peut donc être paramamétré par un point (X0, Y0, Z0) et un vecteur (Dx, Dy, Dz), les points (X, Y, Z) de la droite sont paramétrés par un paramètre t tel que :
Si le vecteur directeur est normalisé, alors le paramètre t donne la distance à (X0, Y0, Z0) le long de la ligne. Pour substituer un vecteur quelconque par un vecteur normalisé, il suffit de prendre :
En connaissant les paramètres géométriques des objets dans l'environnement. Il suffit de trouver toutes les intersections entre ces objets et le rayon. Cela nous donne deux tableaux :
On détermine ensuite l'intersection dont la distance est minimale après l'écran. C'est les propriétés de la surface intersectée qui servira à déterminer la couleur du pixel.
Certains ouvrages utilisent les deux termes comme des synonymes ; toutefois, le ray casting a historiquement une autre définition puisqu'il est intimement lié aux premiers jeux vidéo en 3D.
Le ray tracing s'affranchit des contraintes du ray casting puisqu'il s'appuie sur les intersections précises avec des primitives : une sphère est par exemple parfaite en lancer de rayons dans le sens où l'intersection est calculée de manière analytique selon la définition mathématique de la sphère. Ce n'est pas le cas avec le ray casting qui constitue en quelque sorte un sous-ensemble du lancer de rayons et qui va approcher la surface sphérique par des faces planes. Le lancer de rayons nécessite plus de puissance de calcul mais compense par une qualité d'image incomparable.

Pour dessiner les bords visibles d'un solide, on génère un rayon par pixel. Si la surface associée au le pixel localisé en est différente de celle en , alors on dessine une arrête verticale longue d'un pixel en . De même, si la surface associée au le pixel localisé en est différente de celle en , alors on dessine une arrête horizontale longue d'un pixel en . Comme ce dessin consiste uniquement en des traits verticaux et horizontaux, son rendu sera irrégulier à basse résolution.
Cette méthode a été décrite par Roth et a été employé sur les images ci-contre. A des fins d'optimisations, des boîtes englobantes(qui consiste à englober les ensembles de forme complexes dans des pavés plus grand pour diminuer le nombre de calcul), la mise à jour dynamique des boîtes et la cohérence. Pour chaque image, l'écran a été échantilloné avec une taille d'environ 100x100 (i.e. 10 000 rayons). Les nouvelles arrêtes étaient localisés avec de la dichotomie. Puis, pour chaque arrêtes, on lance un rayon additionnel des deux côtés de l'arrête. Chaque image a été dessiné sur tube Tetronix avec une résolution de 780x780.
Pour faire une image ombragée, on utilise cette fois encore un seul rayon par pixel de l'écran. Cependant, cette fois, on va tracer aussi tracer des rayons depuis des sources lumineuses vers le point d'intersection avec la surface. Puis, à partir des propriétés de la surface, des distances aux sources lumineuses et des angles entre les rayons de l'écran et ceux de la, on calcule la valeur du pixel. Pour être plus précis, la luminosité apporté par une source

Le volume volume (et les grandeurs semblables) d'un solide délimité par des surfaces courbées est calculable facilement par en approchant par des sommes comme en intégration, en approchant le solide par des pavé droits. Pour cela, on prend une photo "en profondeur" du solide avec une vue parallèle. On lance des rayons depuis l'écran à travers le solide, de manière à partitionner le solide en éléments de volume. Ces éléments forment des parallépipèdes rectangles dont deux dimensions sont constantes et égales aux dimensions du pixel de l'écran (i.e. l'écart entre les rayons). La troisième dimension, variable, est défini par la somme des distances entre les entrées et les sorties, alors le volume détecté par le rayon est :
où est la norme du vecteur directeur (qui vaut donc 1 si il a été normalisé),
et où chaque est la longueur du rayon dans le solide.
On décit dans cette section décrit le programme d'échelle de gris par ray casting développé par Scott Roth et Daniel Bass au GM Research Labs en 1979. Pour créer des images, le programme laisse le contrôle à l'utilisateur des paramètres suivants :

L'image ci-dessus a été générée par le programme avec deux sources de lumière d'intensités différentes et avec des ombres.

Les algorythmes comme celui-ci qui implémente une lumière réaliste sont relativement simple à mettre au point, mais sont couteux en calculs. Par exemple, la figure ci-contre illustre que, pour un pixel, on doit tracer plusieurs rayon supplémentaires pour une seule source afin de déterminer le résultat.
Pour générer une image, le programme va pour chaque lancer un rayon qui part du point focal. Lorsque le rayon intersecte une surface en partie transparente, il la traverse. Lorsque le rayon atteint une surface réflechissante, on crée un rayon réflechi pour savoir ce qui est visible. Pour chaque surface intersectée, on trace un rayon vers les sources lumineusses (les "shadow feeler") pour voir si celles-ci sont occultées par une surface.
Turner Whitted appelle les rayons secondaires et additionnels de "tracer de rayons récursifs". Il a modélisé la réfraction pour les objets transparents en générant des rayons secondaires depuis la surface visible à un angle déterminé par l'indice de réfraction de la surface. Whitthed fait la remarque qu'une pièce rempli de mirroirs serait coûteuses à simuler, et suggère de limiter le nombre de récursion par prudence.
La manière la plus simple de rendre le ray casting est de lancer un rayon par pixel, chaque rayon fait une recherche dans l'espace pour trouver l'intersection avec le mur le plus proche.
On l'accélère avec des optimisations comme :
On lance un premier rayon au centre de l'écran, puis récursivement sur les deux moitiés et ainsi de suite. Lorsque deux rayons voisins ont touché le même mur, on arrête la recherche et on rend les tranches intermédiaires avec une interpolation fondée sur le z-mapping.
Technique intéressante pour des résolutions très faibles et des espaces très découpés, si bien que dans l'arrière plan le nombre de polygones devient plus grand que le nombre de pixels.
On ne lance des rayons que sur les points du secteur (polygone) où se trouve la caméra. Puis on recommence récursivement sur les secteurs adjacents avec de nouveaux cônes de vision définis par les rayons lancés sur les points des portails (murs invisibles qui connectent deux secteurs).
La recherche s'arrête quand les sous-cônes de vision ne traversent plus aucun portail.
Le cône de vision est ainsi décomposé en une série de sous-cônes qui vont permettre de trier les faces avant leur rendu.
Technique utilisée dans Doom. On ne lance plus que deux rayons pour le frustum clipping des faces. Leur ordre de rendu est précalculé avec un arbre BSP et le clipping entre les faces s'effectue sur un axe à une dimension.
La recherche des faces s'arrête quand tous les pixels ont été remplis.
Plus rapide que la précédente, elle présente l'inconvénient de ne fonctionner qu'avec des espaces statiques.