Directx mesh face a la direction

cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 - 20 nov. 2007 à 13:30
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008 - 27 nov. 2007 à 18:47
Salut a tous.
Voila mon pb.
J'affiche la mesh et je lui donne une position ainsi qu'une direction.
Je voudrai orienter ma mesh vers la direction.

x,y,z =position
dirx,diry,dirz=direction
a,b,c=rotation(en degré)

Je crois que c'est pour les poids lourds des maths.
Merci a vous.

43 réponses

THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
25 nov. 2007 à 16:19
sam20, comment veux tu qu'on t'aide à debugger un code qu'on ne voit pas (ou partiellement). On ne peux pas deviner comment tu geres ton affichage, tes matrices, etc.
Quelqu'un t'as donné la fonction à utiliser, si ca ne marche pas c'est que quelque chose ne va pas dans ton code, alors ne t'attends pas à ce que quelqu'un arrive et te dise "tu as inversé les matrices à la ligne 234".

Donnes au moins ta fonction d'affichage.

<endl>Un clavier Azerty en vaut deux

</endl>
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
25 nov. 2007 à 16:30
Ca vient pas de mon code.
L'initialisation est ok.
L'affichage est ok.
Les latrices sont ok.
Le Mesh est ok.
Les fonction sont celles de directx.

Quand je test avec c'ette vieille fonction:

D3DXMatrixRotationX( &matRotX,DEGTORAD(a) );  
D3DXMatrixRotationY( &matRotY,DEGTORAD(b));   
D3DXMatrixRotationZ( &matRotZ,DEGTORAD(c));  
D3DXMatrixTranslation(&matTrans,x,y,z);
D3DXMATRIX matWorld=(matRotX*matRotY*matRotZ)*matTrans;
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld);

            g_pd3dDevice->SetMaterial( &Mesh3d.g_pMeshMaterials);
            g_pd3dDevice->SetTexture( 0, Mesh3d.g_pMeshTextures );
            Mesh3d.g_pMesh->DrawSubset( k );

Ca affiche bien le mesh et ca le tourne.
Donc mon code est bon
Il me faut juste une fonction qui le tourne face  un point.
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
25 nov. 2007 à 16:33
Donc il faut que je remplace cette fonction qui tourne l'objet  par rapport a des angles(a,b,c):

D3DXMatrixRotationX( &matRotX,DEGTORAD(a) );  
D3DXMatrixRotationY( &matRotY,DEGTORAD(b));   
D3DXMatrixRotationZ( &matRotZ,DEGTORAD(c));  
D3DXMatrixTranslation(&matTrans,x,y,z);
D3DXMATRIX matWorld=(matRotX*matRotY*matRotZ)*matTrans;
g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld);

Par une qui le tourne face a un point (x,y,z).
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
25 nov. 2007 à 16:46
Je t'ai donné plus haut une fonction à base de D3DXMatrixLookAtLH, tu m'as dit que cela ne fonctionnait pas: qu'est ce qui ne fonctionne pas?
c'est cette fonction qui te donne la matrice à multiplier à matworld. Tu n'as pas à utiliser de D3DXMatrixRotation.
Le point de direction (pAt) est-il bien défini?
Par contre n'oublie pas de réaffecter matworld d'origine aux autres meshes avant de les afficher.

<endl>Un clavier Azerty en vaut deux

</endl>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
25 nov. 2007 à 16:58
Dans le render je fais:
//je dessine des vertex pour delimiter le terrain 3d
D3DXMATRIX W;


D3DXVECTOR3 E=D3DXVECTOR3(0, 10,10);
D3DXVECTOR3 L=D3DXVECTOR3(5, 10,10);
D3DXVECTOR3 U=D3DXVECTOR3(0, 1, 0);


 D3DXMatrixLookAtLH(&W, &E, &L, &U);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &W);

g_pd3dDevice->SetMaterial( &Mesh3d.g_pMeshMaterials);
            g_pd3dDevice->SetTexture( 0, Mesh3d.g_pMeshTextures );
            Mesh3d.g_pMesh->DrawSubset( k );

//
Ca marche pas, j a l'ecran 'ai les vertex mais pas le mesh
Ca ne vient pas de mon code vu que ca marche avec l'autre fonction.
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
25 nov. 2007 à 17:27
Est-ce que tu rétablis matworld avant d'afficher les vertices du terrain? (matworld peut etre l'identité):

g_pd3dDevice->SetTransform(D3DTS_WORLD,  &matworld);

// Afficher vertices terrain

D3DXMatrixLookAtLH(&W, &E, &L, &U);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &W);

// Afficher mesh

car une fois la matrice world modifiée par ton g_pd3dDevice->SetTransform(D3DTS_WORLD, &W), tous les affichages, terrain compris, sont effectués avec W comme matrice de transformation.

<endl>Un clavier Azerty en vaut deux

</endl>
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
25 nov. 2007 à 17:34
J'ai enlevé les vertices qui entour le terrain pour eviter les pb.
Mais le mesh ne s'affiche tourjour pas.
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
25 nov. 2007 à 17:39
Je vois que tu as mis (0, 10, 10) pour la position de ton mesh: essaie en le mettant au centre (0, 0, 0). Sinon la je suis à vide d'idées.

<endl>Un clavier Azerty en vaut deux

</endl>
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
25 nov. 2007 à 17:46
10 c'est pour la camera
void Cam(){
Eyes=D3DXVECTOR3(0, 10,0);
Look=D3DXVECTOR3(0, 10, 1000);
Up=D3DXVECTOR3(0, 1, 0);
 D3DXMatrixLookAtLH(&matView, &Eyes, &Look, &Up);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
}

Pour avoir l'objet au centre de la fenetre.
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
25 nov. 2007 à 17:55
OK alors essaies plutot en placant ton objet au centre (vecteur E = (0,0,0) ) et ta camera un peu plus en arriere suivant Z: Eye = (0, 0, -10), avec Look = (0, 0, 0)

Au passage, peut etre les dimensions de ton objet sont elles trop grandes ou trop petites: si ta caméra est située 10 unités en arriere, une dimension de l'ordre de 5 est pas mal pour ton objet.

<endl>Un clavier Azerty en vaut deux

</endl>
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
25 nov. 2007 à 18:02
Non ca vient pas de la.

Quand je met ceci  a la place:

D3DXMATRIX W;
D3DXMatrixIdentity( &W );
D3DXMatrixTranslation(&W , 0.0f, 10.0f, -10.0f);

            g_pd3dDevice->SetMaterial( &Mesh3d.g_pMeshMaterials[k] );
            g_pd3dDevice->SetTexture( 0, Mesh3d.g_pMeshTextures[k] );
            Mesh3d.g_pMesh->DrawSubset( k );

Je vois bien l'objet.Donc cela ne vient pas des positions.
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
25 nov. 2007 à 20:04
Ok j'ai essayé un truc
D3DXVECTOR3 E=D3DXVECTOR3(0.0f, 0.0f,0.0f);
D3DXVECTOR3 L=D3DXVECTOR3(0.0f, 0.0f,-0.0f);
D3DXVECTOR3 U=D3DXVECTOR3(0.0f, 1.0f, 0.0f);

quand toutes les valeur sont a 0 ca n'affiche rien mais quand je fais exemple:

D3DXVECTOR3 E=D3DXVECTOR3(0.0f, 0.0f,0.0f);
D3DXVECTOR3 L=D3DXVECTOR3(0.0f, 0.0f,-1.0f);
D3DXVECTOR3 U=D3DXVECTOR3(0.0f, 1.0f, 0.0f);

ca a l'air correcte.
Merci a vous de m'avoir aidé.
Je vous tiens au courant si c'est pas bon.
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
26 nov. 2007 à 13:18
D3DXMATRIX W;


D3DXMatrixIdentity(&W);
D3DXMatrixTranslation(&W,0,0,0); //ca m'afiche la mesh au centre


D3DXVECTOR3 Ea=D3DXVECTOR3(0,0,0);
D3DXVECTOR3 La=D3DXVECTOR3(0,0,5);
D3DXVECTOR3 Ua=D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&W, &Ea, &La, &Ua);

g_pd3dDevice->SetTransform(D3DTS_WORLD, &W);
//j'afiche la meshe

La mesh s'affiche bien en position 0,0,0  mais je n'ai aucune rotation.
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
26 nov. 2007 à 17:27
Juste au passage: D3DXMatrixTranslation(&W,0,0,0) ne sert a rien (translation de 0 = identité).

Sinon peut etre ton objet regarde-t-il deja dans la direction de z (La = (0,0,5) ) donc la rotation n'a pas lieu.
Essaie avec La = (0,5,5) par exemple.

<endl>Un clavier Azerty en vaut deux

</endl>
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
26 nov. 2007 à 17:33
Biensûr je disais que D3DXMatrixTranslation(&W,0,0,0) est inutile: ça l'est d'autant plus qu'après tu réaffecte W par D3DXMatrixLookAtLH....

<endl>Un clavier Azerty en vaut deux

</endl>
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
27 nov. 2007 à 13:06
D3DXMatrixIdentity(&W);


D3DXVECTOR3 Ea=D3DXVECTOR3(0,200,80);
D3DXVECTOR3 La=D3DXVECTOR3(0,0,0.01);
D3DXVECTOR3 Ua=D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&W, &Ea, &La, &Ua);


g_pd3dDevice->SetTransform(D3DTS_WORLD, &W);


 

J'ai l'impression que c'est le monde 3d qui tourne et pas l'object
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
27 nov. 2007 à 13:09
Oui c'est bien le monde qui tourne,Comment faire pour que ce soit l'objet??
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
27 nov. 2007 à 13:17
Tu dois comprendre quelque chose: quand tu bouges un objet, c'est en fait le monde que tu fais bouger car tu manipules toujours la matrice World. Donc lorsque tu souhaites bouger un objet en particulier, tu changes matworld comme tu l'as fait, tu affiches ton mesh et après, comme je te l'ai deja dit au début de mes posts, tu dois remodifier ta matrice world (identité par exemple) pour afficher tes autres meshes.

<endl>Un clavier Azerty en vaut deux

</endl>
0
cs_sam20 Messages postés 184 Date d'inscription lundi 31 juillet 2006 Statut Membre Dernière intervention 26 mai 2016 3
27 nov. 2007 à 14:36
D3DXMatrixIdentity(&W);


D3DXVECTOR3 Ea=D3DXVECTOR3(0,0,80);
D3DXVECTOR3 La=D3DXVECTOR3(0,0,0.01);
D3DXVECTOR3 Ua=D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&W, &Ea, &La, &Ua);


g_pd3dDevice->SetTransform(D3DTS_WORLD, &W);

//Je dessine l'objet(le monde tourne bien)

Puis:


Ea=D3DXVECTOR3(0,0,-80);
La=D3DXVECTOR3(0,0,0.01);
Ua=D3DXVECTOR3(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&W, &Ea, &La, &Ua);


g_pd3dDevice->SetTransform(D3DTS_WORLD, &W);

//pour faire revenir le monde a sa place initiale
Mais cela ne marche pas.
0
THEwarrior333 Messages postés 192 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 30 janvier 2008
27 nov. 2007 à 15:13
Non: pour faire revenir le monde à sa position initiale, tu affectes l'identité tout simplement.

<endl>Un clavier Azerty en vaut deux

</endl>
0
Rejoignez-nous