Mesh: mise à l'echelle

Résolu
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008 - 4 juin 2006 à 15:51
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008 - 6 juin 2006 à 18:45
Salut a tous


Voila j'arrive à afficher des meshs et a les animer mais je souhaiterais les mettre à l'echelle car certains meshes .x sont super grands (comme la tiny du sdk). Je pense qu'il faut multiplier les vertices du mesh par une matrice du genre
|s   0   0   0|
|0   s   0   0|
|0   0   s   0|
|0   0   0   1|
avec s<1 ca devrait pouvoir réduire le mesh.
mais je sais pas comment on accede aux vertices du mesh animé ou non. Peut etre aussi qu'il y a une autre méthode...
Si qqun pouvait m'aider je lui serai tres reconnaissant.



<endl>< body></endl>

2 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
6 juin 2006 à 14:08
Salut,






Attention !

Un sommet (vertice) est un ensemble de données qui concerne un point, c'est à
dire :

des positions, des normales, des binormales, des tangentes, des couleurs, des
coordonnées textures, des constantes, bref TOUT ce qu'on veut.

La plupart du temps (1 position, 1 normale, 1 couple de coordonnées textures, 1
couleur).

Chaque donnée est caractérisée (entre autres) par un usage (ex: position) et un format (ex: 3 floats).







1. Récupérer la déclaration des vertices:




LPDIRECT3DVERTEXDECLARATION9    m_pVertexDeclaration;

UINT uiMaxSize = MAX_FVF_DECL_SIZE;





D3DVERTEXELEMENT9
m_Declaration[uiMaxSize ]; // permet d'accéder à l'usage et





GetVertexDeclaration(&m_pVertexDeclaration);





m_pVertexDeclaration->GetDeclaration(m_Declaration, &uiMaxSize );


2.

Localiser les informations sur la
position de chaque vertice:





J’ai pas fait de code dessus. Regarde les propriétés de D3DVERTEXELEMENT9 et tu
comprendras comment procéder.






3. Lire et d'ecrire sur le vertex buffer







void *pVertices;  //
pointeur pour pointer les vertices

m_pVertexBuffer->Lock(0, m_dwNumBytePerVertex*m_dwNumVertices,
&pVertices, 0);  // récupération de l'adresse des vertices





 // … écriture ou lecture

m_pVertexBuffer->Unlock();  // on débloque le buffer

Avec ça tu as de quoi trouve ton bonheur.
Si j'ai le temps je ferais une source dessus.
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
3
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
6 juin 2006 à 18:45
OK merci bcp pour ta réponse bien complete.
Afin que cela serve à d'autres, voici une explication de ma situation:
jusqu'ici pour réduire la taille de mes meshes j'optais pour la solution suivante:

D3DXMatrixScaling(&matScaling, 0.0035f, 0.0035f, 0.0035f); // On définit une matrice de mise a l'echelle

  g_pd3dDevice->SetTransform( D3DTS_WORLD, &(matScaling * matTranslation) );
// et aussi pourquoi pas * matRotation



  // AFFICHAGE du mesh , animé ou non  

Ca marche bien mais ca signifie que l'on doit effectuer une multiplication (matScaling * matTranslation) et un SetTransform à chaque boucle, même qd le mesh n'a pas à bouger. Donc pas tres optimisé...

C'est pourquoi je souhaitais mettre a l'echelle chaque mesh avant la boucle de rendu, une fois pour de bon, et ne transformer D3DTS_WORLD que lorsqu'un mesh doit bouger.
Je vais donc regarder ce que tu m'as indiqué, Galmiza, pour effectuer la conversion sur les coordonnées de chaque vertice (merci pour la précision, je suis allé un peu vite!).
<endl></endl>
0
Rejoignez-nous