Publicité pour l'hébergement

Plan du projet

Projet

II - Ray Casting

1) Qu'est ce que le Ray-casting?

Le Ray-casting est une technique qui transforme une forme limitée de données (une carte très simplifiée ou plan d'étage) dans une projection 3D en traçant les rayons du point de vue dans la visualisation de volume.

2) Création d'un monde

La première étape du Ray-casting est de créer un monde sur lequel on pourra se déplacer. Pour cela, il faut déjà créer un tableau 2D, qui représentera le monde sur lequel on se déplacera.
Pour notre objectif, chaque cube aura la taille de 64x64x64 unités, car cela facilitera les nombreux calculs à venir. Le monde est constitué de la manière suivante.

http://zupi.free.fr/PTuto/images/upload/Raycasting1.jpg

3) Définition des attributs de projection

Maintenant le monde est établit, nous avons besoin de définir certains attributs avant de pouvoir projeter et rendre visible le monde. Plus précisément, nous avons besoin de connaître les attributs suivants:

1. La taille du joueur, le champ de vision du joueur (FOV), et la position du joueur.
2. Dimension du plan de projection.
3. Relation entre le joueur et le plan de projection.

Le joueur devrait être en mesure de voir ce qui est en face de lui. Pour ce faire, nous aurons besoin de définir un champ de vision. Le champ de vision détermine comment le joueur voit le monde en face de lui. Il est conseillé de définir un champ de vision de 60 degrés, car ce dernier donne un très bon aperçu à l'écran.
Le joueur est défini à hauteur de 32 unités, car il s'agit d'une hypothèse raisonnable étant donné que les murs (les cubes) sont de 64 unités de haut.

http://zupi.free.fr/PTuto/images/upload/Raycasting4.jpg
http://zupi.free.fr/PTuto/images/upload/Raycasting4bis.jpg

Nous avons besoin de définir un plan de projection afin que nous puissions visualiser ce que le joueur voit dans le plan de projection. Un plan de projection de 320 unités de large et 200 unités de haut est un bon choix, car c'est la résolution de la plupart des cartes vidéo VGA.

En connaissant le champ de vision (FOV) et la dimension de la projection du plan, nous pouvons calculer l'angle entre les rayons ultérieurs, et la distance entre le joueur et le plan de projection.

http://zupi.free.fr/PTuto/images/upload/Raycasting5.jpg
http://zupi.free.fr/PTuto/images/upload/Raycasting5bis.jpg
http://zupi.free.fr/PTuto/images/upload/Raycasting5bis1.jpg
http://zupi.free.fr/PTuto/images/upload/Raycasting5bis2.jpg

Alors maintenant, nous connaissons:

* Dimension de la projection du plan = 320 x 200 unités
* Centre de la projection du plan = (160.100)
* La distance du plan de projection = 277 unités
* Angle entre les rayons ultérieures = 60/320 degrés


4) Trouver l'emplacement des murs

Maintenant, il va falloir vérifier l'emplacement des murs dans notre monde. Pour cela, nous allons vérifier l'intersection verticale et horizontale entre notre rayon et le mur et cela de façon séparer.
L'étude de l'intersection horizontale entre notre rayon et le mur sert à connaitre l'emplacement des murs horizontaux dans le tableau 2D. Tandis que l'étude de l'intersection verticale entre notre rayon et le mur sert à connaitre l'emplacement des murs verticaux dans le tableau 2D.
Tout d'abord, nous allons vous présenter le monde et les intersections avec les murs horizontaux afin de mieux visualiser la façon de connaitre l';emplacement des murs.

http://zupi.free.fr/PTuto/images/upload/Raycasting6.jpg

Donc comme vous pouvez le constater, le point P représente notre emplacement. Chaque case est un carré de dimension 64*64. Les cases blanches représentent des emplacements vides, tandis que les cases de couleurs représentent des murs.

4.1) Les intersections horizontales

http://zupi.free.fr/PTuto/images/upload/Raycasting7.jpg
http://zupi.free.fr/PTuto/images/upload/Raycasting7bis.jpg
http://zupi.free.fr/PTuto/images/upload/Raycasting7bis1.jpg

Maintenant, nous allons réaliser les étapes, qui vont permettre de trouver des intersections avec des lignes de la grille horizontale :

1. Trouver des coordonnées de la première intersection (point A dans cet exemple de coordonnée (1,2)).
Si le rayon est positionné vers le haut alors
A.y = int(PlayerPtY/64) * (64) - 1;
Si le rayon est positionné vers le bas alors
A.y = int(PlayerPtY/64) * (64) + 64;
Et on a :
A.x = PlayerPtX + (PlayerPtY-A.y)/tan(ALPHA);

2. Trouvez Ya. (Note: Ya est juste la hauteur de la grille, mais si le rayon est orienté vers le haut, Ya sera négative, si le rayon est en bas, Ya sera positive.)

3. Trouvez Xa en utilisant l'équation Xa = 64/tan(a). Xa est la distance qui sépare deux points d'intersections successifs sur l'axe des abscisses (ex : A et C).

4. Vérifiez la grille à l'intersection. S'il ya un mur sur la grille, on cesse de calculer cette distance.

5. S'il n'y a pas de mur, étendre le rayon à la prochaine intersection. A Noter que les coordonnées du prochain point d'intersection de appeler (Xnew, Ynew) est Xnew = Xold + Xa, et Ynew = YOld + Ya.

4.2) Les intersections verticales


http://zupi.free.fr/PTuto/images/upload/Raycasting8.jpg

Ensuite, nous allons réaliser les étapes, qui vont permettre de trouver des intersections avec des lignes de la grille verticale :

1. Trouver les coordonnées de la première intersection (point B dans cet exemple).
Le rayon est confrontée à droite de la photo, de sorte
Bx = int (PlayerPtX/64) * (64) + 64.
Si les rayons ont été confrontés à gauche
Bx = int (PlayerPtX/64) * (64) - 1.
Et on a :
By = PlayerPtXY + (PlayerPtX-x) * tan (AngleDeVision);

2. Trouvez Xa. (Note: Xa n'est que la largeur de la grille, mais si le rayon est confronté à droite, Xa sera positif, si le rayon est confronté à gauche, Xa sera négatif.)

3. Trouvez Ya en utilisant l'équation
Ya = 64*tan(AngleDeVision).

4. Vérifiez la grille à l'intersection. S'il ya un mur sur la grille, on cesse de calculer cette distance.

5. S'il n'y a pas de mur, étendre le rayon à la prochaine intersection. A Noter que les coordonnées du prochain point d'intersection de appeler (Xnew, Ynew) est Xnew = Xold + Xa, et Ynew = YOld + Ya.

4.3) Calcul de la distance entre un mur et le joueur, et calcul de la hauteur d'un mur

Maintenant que l'emplacement des murs est connu, nous allons calculer la distance entre le joueur et les mur, afin de déterminer le mur le plus proche.
On pose :
-mur trouver de façon horizontale : A(x,y)
-mur trouver de façon verticale : B(x1,By1)

Donc il faut effectuer les calculs suivants :
PA = abs (PlayerPtX-x) / cos(AngleDeVision)
PB = abs (PlayerPtX-x1) / cos(AngleDeVision)

Ensuite on compare les 2 résultats, et on sélectionne le plus court, qu'on appellera distanceIncorrecte. En effet, si l'on utilise cette distance, nous aurons un problème à l'affichage, le "fishbowl effect", c'est pour cette raison que nous devons recalculer cette distance grâce a la formule suivante :

correcteDistance = distanceIncorrecte * cos(Beta)
Beta = +30 pour les rayons à gauche du rayon du milieu
ou
Beta = -30 pour les rayons à droite du rayon du milieu

Ce dernier va nous servir à calculer la hauteur du mur, grâce a la formule suivante :

hauteurMur = ((hauteurMur = 64) / correcteDistance) * (distance du plan de projection = 277 )

Ensuite, il ne reste plus qu'à définir une couleur au mur en lui assignant un numéro dans le tableau 2D qui représentera un mur avec une couleur.
Et enfin, il faudra afficher tous les pixels de l'écran en indiquant indiquant le plus bas et le plus élevé pixel à remplir de la bande actuelle.






admin

Stats :