IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Problème orientation vecteur directeur


Sujet :

DirectX

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut Problème orientation vecteur directeur
    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 );
     
    	}

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

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 33
    Points : 21
    Points
    21
    Par défaut
    J'ai résolu le problème, c'était seulement un oublie de réinitialiser le vecteur directeur...

    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
     
    void uncube::avance(){
    		D3DXMATRIX matRotation;
    		dir.x=0.0f;
    		dir.y=0.0f;
    		dir.z=1.0f;
    		dir.w=1.0f;
     
    		D3DXMatrixRotationYawPitchRoll( &matRotation,
                                        D3DXToRadian(-rx), 
                                        D3DXToRadian(-ry), 
                                        D3DXToRadian(-rz) );
     
    		dir=multiplie(matRotation,dir);
     
     
    		x=x+(dir.x/10);
    		y=y+(dir.y/10);
    		z=z+(dir.z/10);
    	}
    Si vous avez d'autre méthodes pour faire ça, merci de me les indiquer, la méthode me semble peu "naturelle"

    PS : désolé pour le double topic je j'avais créer par mauvaise manip et merci de l'avoir supprimé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de Vecteur
    Par larchicha dans le forum Débuter
    Réponses: 17
    Dernier message: 27/04/2010, 14h58
  2. [ode45] problème taille vecteurs
    Par chardonnette dans le forum MATLAB
    Réponses: 3
    Dernier message: 30/01/2009, 10h31
  3. Problème Orienté Objet
    Par A&Z dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/08/2008, 14h25
  4. petit problème de vecteur
    Par Ulfguard dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 16/05/2007, 11h09
  5. Problème de vecteur
    Par mat_monroe dans le forum MFC
    Réponses: 12
    Dernier message: 22/05/2006, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo