Introduction

Compatible ActionScript 3. Cliquer pour en savoir plus sur les compatibilités.Par Monsieur Spi, le 05 janvier 2010

Menu général

Mise en pratique

Maintenant que nous avons parlé des concepts communs à tous les langages passons à la pratique

illustre-raycaster.jpg

Nous allons choisir le langage AS3 pour sa rapidité de calcul.
Vous pouvez bien sur tenter l’aventure en AS2, les formules restent les mêmes.
Cependant le résultat ne sera sans doute pas aussi bon sans certaines optimisations.

On supposera que vous avez le niveau de connaissances nécessaires pour ne pas avoir besoin d’explications sur le fonctionnement basique d’un programme (variables, fonctions, boucles, tableaux, syntaxe et écouteurs sont les bases minimum à connaître). On supposera également que vous avez lu attentivement la partie théorique avant de vous lancer, si ce n’est pas le cas faites-le car nous ne détaillerons plus ce qui a déjà été dit.

Le but de l'exercice est de mettre en pratique les conseils donnés par F.Permadi au travers de son tutorial.
Le choix du moteur proposé par Lode Vandevenne se porte sur l'utilisation des vecteurs et non d'angles.
Une notion qui, bien que facultative, est très importante à comprendre lorsque l'on cherche à optimiser un peu son programme.

Travailler avec des vecteurs

Une des particularités du moteur C++ proposé par Lode Vandevenne et dont est issu cet exercice, c’est de préférer travailler avec des vecteurs et non des angles dans l’espace Euclidien.

Lode nous dit la chose suivante :

« Les Raycasters [NTD : moteurs de Ray Casting] travaillent en général avec des angles pour représenter la direction vers laquelle la caméra regarde.
Vers laquelle les rayons sont projetés, et pour calculer le FOV à l’aide d’un angle supplémentaire.
Je trouve qu’il est plus simple de travailler avec des vecteurs lorsque cela est possible.
La position de la caméra est toujours la base d’un vecteur (qui possède des coordonnées posX et posY).
La direction du vecteur est déterminée par deux nouvelles valeurs (dirX et dirY).

Un vecteur de direction peut donc être représenté de la sorte :

Si l’on trace une ligne dans la direction où la caméra est tournée et à partir de sa position.
Alors chaque point de la ligne est une somme de la position de la caméra et d’un multiple du vecteur de direction.
La longueur du vecteur à peu d’importance, il n’est là que pour représenter une direction.
Multiplier X et Y par la même valeur change la distance mais ne change pas la direction.

Cette méthode nous permet d’introduire un nouveau vecteur, celui du plan de la caméra.
Dans un véritable moteur 3D ce plan existe aussi mais nécessite deux vecteurs pour fonctionner [NDT : hauteur et largeur].
Mais lorsqu’on lance nos rayons nous restons sur un plan en 2D donc le plan de la caméra n’est pas réellement un plan mais plutôt une ligne.
Et une ligne peut être représentée par un seul et unique vecteur composé de deux coordonnées de départ et une direction fixe.

Pour faire effectuer une rotation à un vecteur dans un plan on le multiplie par la rotation à effectuer.

[ cos(a) -sin(a) ]
[ sin(a) cos(a) ]»

Etant donné que nous (je) sommes là pour apprendre, nous allons nous efforcer de travailler de cette manière.
Même si pour moi c’est un exercice supplémentaire en soit car j’ai plutôt l’habitude de travailler avec des angles.

Outre l'excellent moteur (et tutotrial) de N+ gracieusement mis à disposition par l'équipes de “Metanet Software” et que je vous recommande d'étudier, je vous conseille également de jeter un œil à la traduction de Nicolas Barradeau alias Nicoptère du travail de Tonypa à propos des vecteurs sur Flash avant de commencer cet exercice.

La suite

page suivante > Raycaster simple

 
Cette page est placée sous licence CC Attribution-Noncommercial-Share Alike 3.0 Unported
Si vous distribuez ou adaptez le contenu de cette page, merci d'en indiquer l'URL d'origine (celle qu'affiche a présent votre navigateur) et l'auteur : Monsieur Spi .
Contact Ressources Mediabox

Ces pages de ressources collaboratives Mediabox sont mises en ligne en utilisant Dokuwiki