La matrice de vue

Cette matrice permet de définir comment et où on place la caméra. Il existe déjà une méthode prédéfinie dans le SDK SetViewport mais ici nous allons la créer nous même la fonction pour mieux comprendre ce que l'on fait.

er.x eu.x ev.x      0      
er.y eu.y ev.y      0     
er.z eu.z ev.z      0     
-(r.x * c.x, r.y * c.y, r.z * c.z) -(u.x * c.x, u.y * c.y, u.z * c.z) -(v.x * c.x, v.y * c.y, v.z * c.z)      1     

er = eu ^ ev

eu : vecteur unitaire de u
ev
: vecteur unitaire de v
er
: vecteur unitaire de r

u = w - landa

landa = (w . ev) . ev

v = b - c

w = (0,1,0) : c'est un vecteur vertical, indiquant le haut de la caméra
c
: coordonnées de la caméra

Et voici la fonction vue, et la fonction vue_settransf

#include "tutor.h"
#include "decl_vect_matr.h"

void vue(_module_ *modu, D3DVECTOR b, LPDIRECT3DDEVICE9* _obj_Direct3DDevice) {

D3DVECTOR w = {0.0f, 1.0f, 0.0f};
D3DVECTOR v = soustraction(b,modu->position_cam);
D3DVECTOR unit_v = normalisation(v);

D3DVECTOR landa = scalaire(produit_scalaire(w, unit_v), unit_v);

D3DVECTOR u = soustraction(w, landa);
D3DVECTOR unit_u = normalisation(u);

D3DVECTOR unit_r;

// produit vectoriel
unit_r = produit_vectoriel(unit_u, unit_v);

// initialisation de la matrice
modu->view_matr._11=unit_r.x;
modu->view_matr._21=unit_r.y;
modu->view_matr._31=unit_r.z;
modu->view_matr._12=unit_u.x;
modu->view_matr._22=unit_u.y;
modu->view_matr._32=unit_u.z;
modu->view_matr._13=unit_v.x;
modu->view_matr._23=unit_v.y;
modu->view_matr._33=unit_v.z;
modu->view_matr._41=-unit_r.x*modu->position_cam.x-unit_r.y*modu->position_cam.y-unit_r.z*modu->position_cam.z;
modu->view_matr._42=-unit_u.x*modu->position_cam.x-unit_u.y*modu->position_cam.y-unit_u.z*modu->position_cam.z;
modu->view_matr._43=-unit_v.x*modu->position_cam.x-unit_v.y*modu->position_cam.y-unit_v.z*modu->position_cam.z;
modu->view_matr._14=0.0f;
modu->view_matr._24=0.0f;
modu->view_matr._34=0.0f;
modu->view_matr._44=1.0f;

}

void vue_settransf(_module_ *modu,LPDIRECT3DDEVICE9* _obj_Direct3DDevice) {

// D3DTRANSFORMSTATE_VIEW : drapeau indiquant
// qu'il s'agit d'une matrice de vue

// définit la matrice de vue à l'interface graphique
(*_obj_Direct3DDevice)->SetTransform(D3DTS_VIEW, &(modu->view_matr));

}

Ces fonctions on les mettra dans un nouveau fichier source cam_mde.cpp.
coef_cam permet de déplacer la caméra. C'est à dire de l'éloigner ou non du module piloté ; à chaque fois que le vecteur position_cam change de valeur on doit recalculer la matrice de vue. La fonction vue_settransf permet à l'interface Direct3D de prendre en compte la matrice.

La déclaration des fonctions se fait dans decl_cam_mde.h

#include <d3d9.h>

void vue(_module_*, D3DVECTOR, LPDIRECT3DDEVICE9*);
void vue_settransf(_module_*, LPDIRECT3DDEVICE9*);

Dans la fonction rendu du fichier principal on rajoute le code :

#include <windows.h>
#include "init_D3D.h"
#include "decl_init_D3D.h"
#include "tutor.h"
#include "decl_vect_matr.h"
#include "mesh.h"
#include "decl_mesh.h"
#include "decl_timer.h"

#include "decl_cam_mde.h"

#define LONG_FENETRE 300
#define LARG_FENETRE 300

...

// début de la scène
(*D3DD)->BeginScene();


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));

Sans oublier d initialiser la matrice vue dans la fonction main :

module2->position_cam.x = 0.0f;
module2->position_cam.y = 0.0f;
module2->position_cam.z = -70.0f;
module2->monde = identite();
module2->rot_cam = 0.0f;
module2->coef_rotation_module = 0.0f;
module2->coef_vitesse_module = 0.0f;
module2->coef_cam = 0.0f;
module2->module_rot = 0.0f;
module2->coord_0.x = 0.0f;
module2->coord_0.y = 0.0f;
module2->coord_0.z = -50.0f;
module2->rayon = 20.0f;
module2->coord_0.z = -50.0f;
module2->coord_0.x = 0.0f;
module2->collision = 0;
module2->missile = NULL;


D3DVECTOR b = {0.0f, -.707f, .707f};

vue(module1, b, &obj_Direct3DDevice);
vue(module2, b, &obj_Direct3DDevice2);

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