# Raycasting

Le ray casting est une technique de calcul d'images de synthèse 3D, 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.

## Différence entre le ray casting et le ray tracing (lancer de rayons)

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. Contrairement au lancer de rayons, le ray casting est nettement plus rapide. Il tire parti de certaines caractéristiques du monde virtuel :
* les murs sont des plans, en général perpendiculaires par rapport au sol ;
* il n'y a pas de primitives complexes ou alors sous la forme d'approximations planaires ;
* les mondes virtuels sont de facto plus simples.
Les cylindres sont par exemple des approximations avec des faces planes. Le lancer de rayons s'affranchit de ces contraintes 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. Le ray casting produit des images plutôt anguleuses avec des effets de bloc désagréables. Autre limitation courante de la technique du ray casting : le champ de vision est parallèle au sol, il n'est pas possible d'avoir un axe de la caméra entièrement libre. Ceci est particulièrement visible dans les premiers jeux vidéo à vue subjective comme Doom où le champ de vision pointe toujours vers l'avant et ne peut pas regarder le plafond ou le sol. Il n'est pas non plus possible d'effectuer une rotation autour de l'axe de la caméra (roll).
Ceci est dû au fait que le ray casting est essentiellement une technique fondée sur un espace en 2D et non pas sur une description complète en 3D du monde.
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.

## Optimisation du ray casting

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 :

### Recherche binaire récursive

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.

### Rendu à travers des portails

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.

### Z ordering pré-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.