sbi.re

Raycasting

Auteurices : flupe
Date d'ajout : 16 Mai 2021
Modifié le : 09 Novembre 2021
[source]

Quelques liens sur les méthodes de rendu par raycasting.

Petite histoire

Blablabla, Wolfenstein, Doom, Comanche, Duke Nukem 3D.

Principe

Blablabla, un rayon par colonne. C’est essentiellement de la trigo et du théorème de Thalès à outrance.

Guides

  • Permadi

    Un très vieux guide sur comment faire un raycaster à la Wolfenstein.

    Défauts :

    • Le calcul de prochaine intersection est un peu nullasse, on calcule la distance de toutes les intersections sur l’axe X, puis sur l’axe Y, et on prend le min, c’est débile et inefficace.
    • la formule pour l’angle entre les rayons est incorrecte.
    • Le rendu du sol peut être optimisé si on corrige la déformation angulaire des rayons.
  • Lodev partie 1 et partie 2.

    Bien meilleur que celui de Permadi pour du rendu à la Wolfenstein :

    • Utilise DDA pour calculer la prochaine intersection.
    • Calcul correct de l’angle des rayons
    • Méthode efficace de rendu du sol et du plafond
  • Flipcode

    Guide qui se penche plus précisemment sur l’utilisation du raycasting pour dessiner des terrains à hauteur variable, à la Comanche.

    • Pas fixe d’itération, mais présente plusieurs optimisations pour réduire la coût au loin.

Le secret des 6 degrés de liberté

Le gros désavantage — certains diront charme — du raycasting est que la caméra est limitée à 4 degrés de liberté. On peut se déplacer comme on veut, mais seulement pivoter la caméra sur l’axe vertical (ou Z dans Blender). Cette limitation vient évidemment du fait que les rayons sont associés à des plans verticaux qui intersectent l’écran en colonnes.

Le seul exemple que j’ai trouvé de moteur de raycasting qui s’affranchit de ces limitations est Voxlap. L’astuce réside en ne plus simplement associer les plans verticaux à des colonnes de l’écran, mais à des segments quelconques. Il “suffit” ensuite de calculer la position des points de fuite quand on regarde en bas ou en haut, et lancer un éventail de rayons tels que l’ensemble des segments en étoile autour du point de fuite couvre la totalité de l’écran. C’est assez tricky à implémenter et j’ai jamais réussi à obtenir un résultat satisfaisant. Mais sur le papier ça marche. Une conséquence est qu’il y a de l’overdraw, certains segments ayant des pixels en commun sur l’écran.