Jeu avec simulation de 3d utilisant la techique de raycasting.
- Raycasting
- Sprites
- Animations
Warning
Cette partie se base sur les informations d'un article de permadi.com.
Le raycasting est une technique visant à rendre un espace en 3 dimensions sur un plan en 2 dimensions en mesurant la distance entre l'observateur de la scène et les murs.
Pour ce faire, on tire des rayons (1 rayon par colonne de pixels), et on affiche à l'écran un segment dont la taille dépend de la distance jusqu'au mur.
Le joueur
const mapLayout = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 1, 1, 1, 1, 1, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
];
// 0 pour du vide, 1 pour un mur
La direction dans laquelle il regarde forme l'angle
On tire un ensemble de rayons en cône depuis
L'objectif est de trouver le point d'intersection entre chaque droite d'origine
Pour une intersection horizontale, on cherche
Soit
si |
||
sinon |
Les intersections suivantes sont définies par :
$x_i = Ax+(Xa\times i)$ $y_i = Ay+(64\times i)$
Même procédé pour la verticale :
Soit
si |
||
sinon |
Les intersections suivantes sont définies par :
$x_i = Bx+(64\times i)$ $y_i = By+(Ya\times i)$
[fig16]
Reste à trouver un mur en parcourant un à un les points d'intersection pour enfin obtenir une distance et tracer le segment correspondant.
Pour calculer la taille du segment, on peut diviser la hauteur du mur (ici 64 pour coller aux dimensions des cases) par la distance.
Taille du segment =
Problème, si on utilise simplement la distance entre l'intersection
Cette déformation est due au fait que les rayons sont tirés en arc de cercle.
Sur l'image ci-dessous, la distance
On cherche alors à "corriger" la distance par rapport à un plan. Dans notre cas, la distance
On défini
distance corrigée
Ainsi, Taille du segment =