La matrice perspective

Cette matrice permet de définir la perspective de la caméra. Une méthode existe déjà dans le SDK, il s'agit de SetProjectionMatrix. Mais pour les même raisons que la matrice de vue on définira nous même notre propre fonction.

LONG * arctang(alpha) / LONG 0 0           0          
0 arctang(alpha) 0 0
0 0 pl_l/(pl_l-pl_p) 0
0 0 -pl_l*pl_p/(pl_l-pl_p) 1

alpha est l'angle d'ouverture de la caméra, l'idéal c'est une ouverture de PI / 4
pl_l, c'est la distance du plan lointain, au delà, rien n'est affiché
pl_p c'est la distance du plan proche, avant, rien n'est affiché non plus.

dans le fichier entête principal on rajoutera les define des angles :

#define _PI 3.141592654
#define _2PI 6.283185307
#define _1_2EMI_PI 1.570796327
#define _3_2EMI_PI 4.71238898


dans le fichier cam_mde.cpp on écrira le code :

D3DMATRIX* matr_persp(float alpha, float pl_p, float pl_l) {

View view;
view.dwHeight = LARG;
view.dwWidth = LONG;
D3DMATRIX *proj_m = (D3DMATRIX*)malloc(sizeof(D3DMATRIX));

// initialise la matrice 4 x 4 proj à 0
ZeroMemory(proj_m, sizeof(D3DMATRIX));

float at = cos(alpha/2)/sin(alpha/2);
proj_m->_11 = (float)view.dwWidth*at/(float)view.dwHeight;
proj_m->_22 = at;
proj_m->_33 = pl_l/(pl_l-pl_p);
proj_m->_43 = -pl_l*pl_p/(pl_l-pl_p);
proj_m->_34 = 1.0f;

return proj_m;
}

void perspective(D3DMATRIX *proj, LPDIRECT3DDEVICE9* _obj_Direct3DDevice) {

(*_obj_Direct3DDevice)->SetTransform(
D3DTS_PROJECTION,proj);

}

La fonction perspective permet à DirectX de prendre en compte la matrice perspective

Et dans def_cam_mde.h on rajoute le code :

D3DMATRIX* matr_persp(float, float, float);
void perspective(D3DMATRIX*, LPDIRECT3DDEVICE9*);

Dans la fonction main on initialise la matrice perspective avant la boucle du jeu. Car celle-ci restera constante

// vérifie présence de l'horloge de précision et initialise temps
if (!(temps = horloge())) return -1;


mat_proj = matr_persp(_PI/4, 50.0f, 300.0f);

_module_ *module1 = new _module_;
_module_ *module2 = new _module_;

et on rajoute dans la fonction rendu :

if(rp->coef_cam && rp->coef_cam != 20.0f) {
rp->position_cam.z+=rp->coef_cam;

D3DVECTOR b = {0.0f, -.707f, .707f};
vue(rp, b, &(*D3DD));

rp->position_cam.z-=rp->coef_cam;
}
vue_settransf(rp, &(*D3DD))
;

perspective(mat_proj, &(*D3DD));

mat_proj est du type D3DMATRIX elle est définie dans le fichier source principal :

clavier et_module = {0, 0, 0, 0};
clavier et_module2 = {0, 0, 0, 0};


D3DMATRIX *mat_proj;


Téléchargez la source, cliquez ci-dessous :