Je connais pas de tutos en ligne.
Mais avant d aborder la 3D, il y certaines propriétes mathématiques que tu doit connaître sur les vecteurs.
La addition des vecteurs, tu la connait, c est simple. Par contre ça se corse avec les multiplications: il y en a 3 possibles. Ensuite il y a la norme d un vecteur, et plus généralement sa distance.
1°) multiplication/division par un nombre
ça c est facile, tu multiplie chacun des composantes par un nombre k et tu obtient un vecteur k fois plus long, si le signe de k est négatif tu obtient un vecteur dans la direction opposée
2°) le produit vectoriel fonctionne avec deux vecteurs, il donne un troisième vecteur perpendiculaire à la fois aux deux autres. Le produit vectoriel est utilisé par exemple pour calculer un vecteur normal à plan définit par trois points.
Ex: une facette [ABC], son vecteur normal <n> est:
<n>=<AB>x<AC>
Les vecteurs normaux sont très utiles pour calculer les illuminations, ou tout simplement pour orienter les facette et ainsi les éliminer lorsquelle ne sont pas orientées vers la caméra.
Un vecteur normal définit aussi un générateur de plan: l ensemble des vecteurs dont le produit vectoriel est propotionel à la normale. Un vecteur + un point te donne un plan.
La longueur du vecteur issu d un produit vectoriel est égal à la multiplication des deux autres longueurs. Ça peut être utile pour déterminer l aire de parallélogrammes.
3°) le produit scalaire. le produit scalaire de deux vecteurs donne un nombre. Ce nombre vérifie la formule:
<a>.<b> = |a|*|b|*cos(a,b)
comme |a|*|b| est positif, le signe du produit scalaire est celui de cos(a,b), c est à dire que si les deux vecteurs originaux sont co-spatiaux (ils pointent dans la même direction) le signe est positif, s ils pointent dans la direction opposée le signe est négatif, s ils sont prependiculaires le produit scalaire est nul (0).
C est très pratique pour déterminer si une facette orientée est face à la caméra:
facette [ABC], camera au point de visualisation V:
<n>=(<AB>x<AC> )*orientation
[ABC] orienté vers la caméra si:
<n>.<VA> < 0
ou <n>.<VB> < 0
ou <n>.<VC> < 0
En conjonction avec la normalisation d un vecteur, tu obtient le cosinus entre deux vecteur:
|a|=|b|=1 => <a>.<b>=cos(a,b)
et c est utile pour déterminer le coefficient d illumination (l illumination d un plan est propotionnel au cosinus entre la normale à un plan et la direction de la lumière).
La longueure d un vecteur <x,y,z> est égale à:
|x,y,z| = sqrt( x²+y²+z² )
Si on divise les coordonnées d un vecteur par la longueure, on obtient un vecteur unitaire, c est à dire de longeure 1:
| <x,y,z>/|x,y,z| | = 1
On peut obtenir un vecteur normal unitaire à un plan [ABC]:
<n>=<AB>x<AC>
<u>=<n>/|n|
qui est très pratique pour pleins de calculs.
Il existe d autres longueure possibles: on les appelle distance d ordre n:
Dn(<x,y,z> )= ( |x^n| + |y^n| + |z^n| ) ^ (1/n)
(note: ici || est la valeur absolue)
La norme ou longeur d un vecteur est sa distance d ordre 2, mais il d autres peuvent être pratique, notamment la distance d ordre 1, appelée aussi distance de manhattan:
D1(<x,y,z> ) = |x|+|y|+|z|
Pour les matrices, une matrice 4x4 peut définir tous les types de transformations simples: rotations, translations, projection, échelle, étirement, homothéties... Une matrice de transformation multipliée par une autre donne une troisième matrice de transformation regroupant les deux premières. Multiplier un vecteur par une matrice de transformation donne un vecteur transformé.
Les transformations simples ont une transformation inverse, pour laquelle un vecteur transformé donne le vecteur originel.
Ça c est la théorie. Dans la pratique le calcul des racines carrées et lent sur les microprocesseurs donc à éviter.
Les cosinus et sinus sont encore plus lents, si bien que parfois une table est précalculée.
Idem pour les matrices, elles ne sont finalement utiles que dans les modeleurs 3D qui permettent de garder en mémoire et de modifier toute une chaîne de transformations.
Pour le raycasting (transformation d une carte 2D en visualisation 3D) tu devrais trouver des algos en vrac sur le net.
Deux types de raycasting: style wolfestein (carte carré), style doom (carte polygonale). Un algo qui ressemble au raycasting est la modélisations par carte 2D de voxels.
> je modifiais directement les vertices pour faire la translation.
- jamais faire ça, ça limite considérablement les possibilités de ta carte (re-calcul de toute la carte), et en plus si tu a des calculs en virgule flottante ça introduit des erreurs cumulatives de calculs.