Tutorial n°3 Bis : 20/11/2001
III Bis) Translations, rotations, changements de repères : Explications des sources
On considèrera dans tout le programme que la caméra ne peut effectuer des rotations qu'autour des axes X et Y de son repère.
Soit R'' le repère égal au repère R sauf que son centre est celui de la caméra.
On associe 4 points à la Caméra :
- son centre : Centre_caméra (xr,yr,zr) dans R
- le point vers lequel elle regarde et situé à une distance de 1 cm : At(zxr,zyr,zzr) dans R''
- le point au dessus d'elle et situé à une distance de 1 cm : Up(yxr,yyr,yzr) dans R''
- le point à sa droite et situé à une distance de 1 cm : Dr(xxr,xyr,xzr) dans R''
et 2 angles : Rot_x et Rot_y les angles autour des axes X et Y permettant de passer du
repère R'' au repère Caméra (R'
par la matrice de passage M = Rx(-Rot_x).Ry(-Rot_y)
1) Affichage d'un polygone :
a) On Calcule les coordonnées de chacun des sommets dans le repère caméra (R'
.
Pour cela, on calcule la matrice M=Rx(-Rot_x).Ry(-Rot_y).T(-Centre_caméra)
On obtient donc : Pr' = M.Pr pour tout point P
b) Projection des sommets sur l'écran (Repère E):
Soit f=50 cm la distance focale de la caméra.
On obtient P la matrice de projection de celle-ci.
Soit l la largeur=60 cm du plan de projection (écran) et h=80 cm sa hauteur.
Sachant que sa résolution est de rx=320 x ry=200 et que le centre du repère écran
est au centre de ce dernier, on obtient :
xe = (rx/2)*xp/(l/2) + (rx/2)
ye = (ry/2) - (ry/2)*yp/(l/2)
ze = zp
où xp, yp et zp sont les coordonnées obtenues par P.
D' où la matrice T = rx/l 0 0 rx/2
0 -ry/l 0 ry/2
0 0 1 0
0 0 0 1
On a donc Xe = T.P.Xv où X est le point à projeter.
c) Visibilite:
On teste si le polygone est :
- à droite du cône de projection:
<=> z<50*x/40
Si 1 des sommets du polygone est à droite, alors le polygone est non visible.
- à gauche du cône de projection:
<=> z<-50*x/40
Si 1 des sommets du polygone est à gauche, alors le polygone est non visible.
- au dessus du cône de projection:
<=> z<50*y/30
Si 1 des sommets du polygone est au dessus, alors le polygone est non visible.
- en dessous du cône de projection:
<=> z<-50*y/30
Si 1 des sommets du polygone est en dessous, alors le polygone est non visible.
- avant le cône de projection:
<=> z<50
Si 1 des sommets du polygone est avant, alors le polygone est non visible.
- après le cône de projection:
<=> z>500
Si 1 des sommets du polygone est après, alors le polygone est non visible.
Sinon le polygone est visible.
2) Mouvement de la caméra :
a) Rotation de la caméra autour de son axe X (respectivement Y) :
Cela revient à trouver les angles Rot_x et Rot_y correspondants.
On commence par effectuer la rotation des points At ,Up et Dr autour de X (respectivement Y)
dans le repère R''.
On calcule ensuite ces coordonnées dans le repère R'':
Xr'' = Ry(rot_y).Rx(rot_x).Xr'
où X est le point pour lequel on veut effectuer le changement de repère.
Il nous faut maintenant trouver les nouveaux angles rot_x et rot_y.
En posant ca=cos(Rot_x), sa=sin(Rot_x)
et cb=cos(Rot_y), sb=sin(Rot_y).
On a :
xr'' = cb*xr' + sb*(sa*yr'+ca*zr'
yr'' = ca*yr' - sa*zr'
zr'' = -sb*xr' + cb*(sa*yr'+ ca*zr'
Or pour At :
xar' = 0
yar' = 0
zar' = 1
d'où xar''=sb*ca, yar''=-sa et zar''=cb*ca
et pour Up :
xur' = 0
yur' = 1
zur' = 0
d'où xur''=sb*sa, yur''=ca, zur''=cb*sa
Donc Rot_x = arctan(sa/ca) = arctan(-yar''/yur''
et Rot_y = arctan(sb/cb) = arctan(-xar''/zar''
si ca <=> 0
= arctan(-xur''/zur''
sinon
b) Déplacement de la caméra :
- en avant : on translate le centre du vecteur At(zxr,zyr,zzr).
- en arrière : on translate le centre du vecteur -At(-zxr,-zyr,-zzr).
- à droite : on translate le centre du vecteur Dr(xxr,xyr,xzr).
- à gauche : on translate le centre du vecteur -Dr(-xxr,-xyr,-xzr).
3) Les sources :
Remarque :
Placer les sources dans le répertoire "sources",
les objets (.3dd) dans le répertoire "objets" et les scènes (.cnd) dans le répertoire "scenes".
"3d_3.cpp"
"3d_3.h"
"graphique.cpp"
"graphique.h"
"souris.cpp"
"souris.h"
"infos_compilation.h (utilisé par graphique.h)"
"main.cpp"
"voiture.3dd (l'objet à afficher)"
"voiture.cnd (la scène à afficher)"
"chateau.3dd (l'objet à afficher)"
"jeu.cnd (la scène à afficher)"
"La feuille de projet pour Borland C++"
"L'exécutable"
Modifications mineures:
Pas mal de petites choses depuis la version précédente (Tutorial n°2):
- Changement de la structure des objets et de la scène.
- Sauvegarde et chargement de la scène et des objets à partir d'un fichier.
- L'objet chateau entièrement crée à la main (toute une soirée passée sur Wordpad...).
Pour l'instant, ça ne rend pas super puisque les polygones ne sont pas découpés lors du test de visibilité,
mais c'est pour bientôt...
[edtdd]--Message édité par Dav Vador--[/edtdd]