Bonjour,
Je programme une petite application directX, cette appli contient un cube auquel est associé un Vecteur directeur initialisé à (0.0f,0.0f,1.0f,1.0f).
Les angles associés à la matrice de rotation du cube sont changés en fonction du déplacement de la souris, et je voudrais faire avancer le cube lorsqu'on appuie sur une touche dans la direction vers laquelle il est orienté, c'est à dire faire tourner le vecteur directeur avec le cube à chaque fois que le cube tourne.
mais apparemment ma méthode ne fonctionne pas, puisque le cube avance très bizzarement dans des directions que je n'avais pas prévu... c'est un gros casse tête je suis dessus depuis hier... Mon code :
Dessin du main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 void render( void ) { g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0 ); g_pd3dDevice->BeginScene(); static float fXrot = 0.0f; static float fYrot = 0.0f; static float fZrot = 0.0f; D3DXMATRIX matWorld; D3DXMATRIX matTranslation; D3DXMATRIX matRotation; D3DXMatrixTranslation( &matTranslation, 0.0f, 0.0f, 0.0f ); D3DXMatrixRotationYawPitchRoll( &matRotation, D3DXToRadian(fXrot), D3DXToRadian(fYrot), D3DXToRadian(fZrot) ); matWorld = matRotation * matTranslation; g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); //---------------------------------------------- moncube.draw(g_pd3dDevice); cubeMechant.rx += (g_fElpasedTime * 10.0f); cubeMechant.ry += (g_fElpasedTime * 25.0f); cubeMechant.rz += (g_fElpasedTime * 50.0f); cubeMechant.draw(g_pd3dDevice); g_pd3dDevice->EndScene(); g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); }
Methode de dessin du cube :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 void uncube::draw(LPDIRECT3DDEVICE9 g_pd3dDevice){ D3DXMATRIX matWorld; D3DXMATRIX matTranslation; D3DXMATRIX matRotation; D3DXMatrixTranslation( &matTranslation, x, y, z ); D3DXMatrixRotationYawPitchRoll( &matRotation, D3DXToRadian(rx), D3DXToRadian(ry), D3DXToRadian(rz) ); matWorld = matRotation * matTranslation; g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); g_pd3dDevice->SetStreamSource( 0, g_pVertexBuffer, 0, sizeof(CubeVertex) ); g_pd3dDevice->SetFVF( D3DFVF_CUBE_VERTEX ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 4, 2 ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 8, 2 ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 12, 2 ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 16, 2 ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 20, 2 ); }
L'erreur viens peut être de la multiplication entre la matrice et le vecteur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void uncube::avance(){ D3DXMATRIX matRotation; D3DXMatrixRotationYawPitchRoll( &matRotation, D3DXToRadian(rx), D3DXToRadian(ry), D3DXToRadian(rz) ); dir=multiplie(matRotation,dir); //matRotation*dir x=x+(dir.x/15); y=y+(dir.y/15); z=z+(dir.z/15); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 D3DXVECTOR4 uncube::multiplie(D3DXMATRIX mat,D3DXVECTOR4 vec){ D3DXVECTOR4 tmpvec; tmpvec.x=mat._11*vec.x + mat._12*vec.y + mat._13*vec.z + mat._14*vec.w; tmpvec.y=mat._21*vec.x + mat._22*vec.y + mat._23*vec.z + mat._24*vec.w; tmpvec.z=mat._31*vec.x + mat._32*vec.y + mat._33*vec.z + mat._34*vec.w; tmpvec.w=mat._41*vec.x + mat._42*vec.y + mat._43*vec.z + mat._44*vec.w; return tmpvec; }
Merci pour vos suggestions...si je me suis mal exprimé je peux la refaire ^^
Partager