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 :