[DirectX] Deplacer un mesh... Comment ?

Le côté programmation du développement d'un jeu vidéo.

Deplacer un mesh... Comment ?

Messagepar bilaloch » 13 Avr 2006, 10:59

Bonjour tout le monde,

Je sais que, d'apres certaines sources, il faut executer une translation pour deplacer un mesh... Mais comment ? Quel matrice utiliser ? Et comment attribuer la matrice a l'objet en question (le mesh) ? Je travaille avec Visual C++ 2005 et Direct3D.

Merci beaucoup de votre aide...
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Acetate » 13 Avr 2006, 11:09

Tu dois transformer tous les points du mesh en effectuant le produit par la matrice de translation en coordonnées homogènes. Typiquement, c'est :

Code: Tout sélectionner
    [1 0 0 x]
    [0 1 0 y]
T = [0 0 1 z]
    [0 0 0 1]


..avec (x, y, z) le vecteur de translation.

C'est la théorie, tu as sûrement une routine Direct3D toute prête qui prend le vecteur en paramètre.
Avatar de l’utilisateur
Acetate
Hello World, I'm new !
 
Messages: 98
Inscription: 08 Juil 2005, 15:39

Messagepar bilaloch » 13 Avr 2006, 11:32

D'accord merci... mais j'aimerais bien connaitre cette fonction ^^ .

BILALoch
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Lenolian » 13 Avr 2006, 11:48

Code: Tout sélectionner
device->SetTransform(D3DTS_WORLD,&worldMatrix);

// rendu de ton mesh
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar bilaloch » 13 Avr 2006, 12:02

Ok merci beaucoup... Si je comprends bien, je dois mettre :

Code: Tout sélectionner
D3DXMatrixTranslation(&matWorld,x[r],y[r],z[r]);

g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

g_pMesh[r]->DrawSubset( e );


C'est ca ? Suis je obligé de le faire a chaque rendu ? Ralentirais je le programme a cause de ca ?

PS : Il me genere un bug : "Unhandled exception at 0x4fd7798b in Meshes.exe: 0xC0000005: Access violation writing location 0xfdfdfdad." à la ligne "D3DXMatrixTranslation(&matWorld,x[r],y[r],z[r]);"... Pourquoi ?

Merci :)
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Loulou » 13 Avr 2006, 14:49

C'est ca ? Suis je obligé de le faire a chaque rendu ? Ralentirais je le programme a cause de ca ?

Oui. Ben oui. Ben non ; enfin c'est sûr qu'un programme qui ne fait rien sera toujours plus rapide.

PS : Il me genere un bug : "Unhandled exception at 0x4fd7798b in Meshes.exe: 0xC0000005: Access violation writing location 0xfdfdfdad." à la ligne "D3DXMatrixTranslation(&matWorld,x[r],y[r],z[r]);"... Pourquoi ?

Sûrement parce que tu fais une manip foireuse au niveau de la mémoire. Utilise un debuggueur pour la dénicher.
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar Feriaman » 13 Avr 2006, 14:57

PS : Il me genere un bug : "Unhandled exception at 0x4fd7798b in Meshes.exe: 0xC0000005: Access violation writing location 0xfdfdfdad." à la ligne "D3DXMatrixTranslation(&matWorld,x[r],y[r],z[r]);"... Pourquoi ?


Access violation == tu lis/écris dans la mémoire à un endroit où tu n'as pas le droit de le faire

writing location 0xfdfdfdad == cet endroit c'est à l'adresse 0xfdfdfdad

Alors maintenant, pourquoi est-ce que tu écris là ?
En général, c'est parce que tu écris en dehors d'un tableau ou à l'adresse d'un pointeur que tu n'as pas initialisé, où que tu as déjà supprimé.

Exemple :
Code: Tout sélectionner
int* pMonPointeur;
*pMonPointeur = 5;  // ça écrit n'importe où

Autre exemple :
Code: Tout sélectionner
int Tableau[3];
Tableau[35] = 5;  // ça écrit n'importe où
Tableau[3] = 5;  // ça aussi
Tableau[-4] = 5;  // ça aussi


Dans ton exemple il est probable que tu aie des valeurs de r qui sortent de tes tableaux. Tu peux utiliser ta tête (ou à défaut un débuger pour trouver pourquoi)

Pour aller un peu plus loin dans la compréhension 1 :
Avec ce genre de manip tu écris à un endroit indéterminé de la mémoire. Il faut noter que cet endroit n'est pas forcément interdit. Parfois il s'agit d'un endroit que tu as alloué pour une autre de tes variables par exemple. Dans ces cas-là c'est une catastrophe à débuger, car tu as l'impression que tes variables bougent toutes seules (ciel : mon programme est hanté !).

Code: Tout sélectionner
int a[3];
int b[4];
a[3] = 5; // ici il y a des chances (mais pas forcément) que b[0] == 5.


Dans l'exemple ci-dessus, si la mémoire allouée à b suis juste la mémoire allouée à a, modifier a[3] ne créera pas un access violation, mais modifiera b.

Pour aller un peu plus loin dans la compréhension 2 :
Parfois, ces mêmes erreurs sont cachées ailleurs dans ton code. Par exemple, certaines librairies supposent que tu vas appeler une méthode Init() avant de commençer à appeler d'autres méthode. Elles utilisent cette fonction notament pour réserver la mémoire dont elles auront besoin. Si jamais tu oublie d'appeler le Init(), la librairie ne te le dira peut-être pas et tu auras éventuellement une "Access violation"
Feriaman
Hello World, I'm new !
 
Messages: 324
Inscription: 03 Oct 2005, 10:57

Messagepar Lenolian » 13 Avr 2006, 15:08

PS : Il me genere un bug : "Unhandled exception at 0x4fd7798b in Meshes.exe: 0xC0000005: Access violation writing location 0xfdfdfdad." à la ligne "D3DXMatrixTranslation(&matWorld,x[r],y[r],z[r]);"... Pourquoi ?


Dur à deviner, c'est quoi x, y, z et r?

Sinon je te conseille de lire la doc fourni avec le SDK DirectX afin de bien comprendre comment çà marche.
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar bilaloch » 13 Avr 2006, 19:04

En fait, "x", "y" et "z" sont des float, et "r" un int qui correspond a la boucle "for"... Voila un bout de code... pour vous aider a m'aider ^^

Code: Tout sélectionner
float *x = new float[2926];
float *y = new float[2926];
float *z = new float[2926];
D3DXMATRIXA16 matWorld;

[...]

VOID SetupMatrices()
{
    g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

    D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-11.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

[...]

VOID Render( int j, HWND hWnd )
{
   RECT rc;

   int e;

    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                         D3DCOLOR_XRGB(120,120,255), 1.0f, 0 );

    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
      
      for ( DWORD r = 1 ; r < j + 1 ; r++ )
      {
         for( DWORD e = 1 ; e < g_dwNumMaterials + 1; e++ )
         {

            g_pd3dDevice->SetMaterial( &g_pMeshMaterials[r][e] );
            g_pd3dDevice->SetTexture( 0, g_pMeshTextures[r][e] );

            D3DXMatrixTranslation(&matWorld,x[r],y[r],z[r]);

            g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

            g_pMesh[r]->DrawSubset( e );
         }
      }

        g_pd3dDevice->EndScene();
    }

   SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);

   MoveWindow( hWnd ,rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, NULL );

   g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

[...]

INT WINAPI WinMain ( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
[...]
    HWND hWnd = CreateWindow( "Bureau 3D", "Bêta Bureau 3D", WS_POPUP, 100, 100, 300, 300, NULL, NULL, wc.hInstance, NULL );
[...]
            MSG msg;
            ZeroMemory( &msg, sizeof(msg) );
            while( msg.message!=WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
                    Render(j,hWnd);
            }
[...]
}


Voila, merci beaucoup de bien vouloir essayer de m'aider.
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Lenolian » 13 Avr 2006, 20:24

les indices des tableaux commencent à 0 en C++ pas à 1.
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar bilaloch » 13 Avr 2006, 21:01

Oui :) je le sais... Mais comme je commence, je prefere les utiliser ainsi afin de m'habituer ^^
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Loulou » 14 Avr 2006, 05:23

bilaloch a écrit:Oui :) je le sais... Mais comme je commence, je prefere les utiliser ainsi afin de m'habituer ^^

Et tu penses que ça va marcher magiquement, simplement parce que tu as envie de coder comme ça ? :00000017:
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar Feriaman » 14 Avr 2006, 08:33

"Il faut obéir à la gravité, car c'est la loi"

C'est pareil avec les indices des tableaux.
Feriaman
Hello World, I'm new !
 
Messages: 324
Inscription: 03 Oct 2005, 10:57

Messagepar bilaloch » 14 Avr 2006, 10:01

Bien sur que cela va fonctionner ^^ . Car il n'y a que le [0] des tableaux qui n'est pas utilisé, mais ca fonctionne quand meme. Et puis, ce n'est pas ma question :) . Laissez moi m'occuper de cela, moi j'ai un probleme avec la translation, et c'est ici que j'ai besoin de votre aide ^^ .

BILALoch
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Loulou » 14 Avr 2006, 10:08

Bien sur que cela va fonctionner ^^ .

Non. Ok, passons sur le fait que l'élement 0 ne sera jamais utilisé, mais par contre tu vas utiliser l'élément N, alors que le dernier dans ton tableau est N - 1. Et là tu as un problème.

Laissez moi m'occuper de cela, moi j'ai un probleme avec la translation, et c'est ici que j'ai besoin de votre aide ^^ .

Ce n'est pas parce que la ligne qui plante commence par "D3DXMatrixTranslation" que le problème est lié aux translations. En l'occurence ce qui provoque l'erreur est, à mon avis, le dépassement de tableau dont je viens de te parler.

Et puis quel est intéret de mal utiliser les tableaux ? Tu es débutant, donc justement ne commence pas à prendre des mauvaises habitudes...
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar bilaloch » 14 Avr 2006, 10:15

Oui je te comprends... Cependant, j'ai mis "[2926]" alors que j'en ai besoin de 2925, pour justement eviter ce depassement de capacité ^^ . J'essayerai d'eviter la prochaine fois d'utiliser un tableau de la sorte... Merci.

BILALoch
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Feriaman » 14 Avr 2006, 10:28

Pourquoi chercher conseil, si ce que tu veux c'est ne pas apprendre ?
Feriaman
Hello World, I'm new !
 
Messages: 324
Inscription: 03 Oct 2005, 10:57

Messagepar Loulou » 14 Avr 2006, 10:35

2926 ok, mais qu'en est-il du tableau de materials que tu parcours également de manière incorrecte, et qui lui ne doit pas avoir un élément inutile à la fin vu que ce n'est pas toi qui l'alloue ?
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar Lenolian » 14 Avr 2006, 10:40

Bon y'a plusieurs autres choses qui ne vont pas :

1)

Code: Tout sélectionner
VOID Render( int j, HWND hWnd )
{
RECT rc;
[B]int e;[/B]

[...]

   for( [B]DWORD e = 1 [/B]; e < g_dwNumMaterials + 1; e++ )
   {
      [...]
   }
[...]
}


Là tu définis 2 variables qui ont le même nom dans le même scope, c'est pas bon.

2)

Code: Tout sélectionner
SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);

MoveWindow( hWnd ,rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, NULL );;


Je comprends pas l'interêt de ce passage...

3)

Franchement dessiner 2926 meshs à chaque frame, c'est un peu excessif. Je ne connais pas beaucoup de programme qui peuvent faire tourner çà.

4) mais bon l'erreur vient soit de ta boucle avec un dépassement d'indice, ou alors un pointeur non initialisé dans tes meshs.
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar bilaloch » 14 Avr 2006, 10:52

1) Tu as totalement raison... je vais corriger ca.

2) C'est pour que la fenetre ai la taille de l'ecran sans compter la barre "demarrer".

3) Beaucoup de programme en dessine autant, par exemple les jeux.

4) Je n'arrive pas a trouver l'erreur mais je continue de rechercher.
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar Loulou » 14 Avr 2006, 10:57

4) Je n'arrive pas a trouver l'erreur mais je continue de rechercher.


Loulou a écrit:2926 ok, mais qu'en est-il du tableau de materials que tu parcours également de manière incorrecte, et qui lui ne doit pas avoir un élément inutile à la fin vu que ce n'est pas toi qui l'alloue ?
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar bilaloch » 14 Avr 2006, 11:06

Ah oui... Si je change :

Code: Tout sélectionner
for ( DWORD r = 1 ; r < j + 1 ; r++ )
{
   for( DWORD e = 1 ; e < g_dwNumMaterials + 1 ; e++ )
   {
      g_pd3dDevice->SetMaterial( &g_pMeshMaterials[r][e] );
      g_pd3dDevice->SetTexture( 0, g_pMeshTextures[r][e] );

      D3DXMatrixTranslation(&matWorld,xPos[r],yPos[r],zPos[r]);

      g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

      g_pMesh[r]->DrawSubset( e );
   }
}


En :

Code: Tout sélectionner
for ( DWORD r = 1 ; r < j + 1 ; r++ )
{
   for( DWORD e = 0 ; e < g_dwNumMaterials ; e++ )
   {
      g_pd3dDevice->SetMaterial( &g_pMeshMaterials[r][e] );
      g_pd3dDevice->SetTexture( 0, g_pMeshTextures[r][e] );

      D3DXMatrixTranslation(&matWorld,xPos[r],yPos[r],zPos[r]);

      g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

      g_pMesh[r]->DrawSubset( e );
   }
}


Cela ne devrait pas poser de probleme, non ?
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar bilaloch » 14 Avr 2006, 11:10

C'est bon merci... Ca ne cause plus de bug, cependant... Meme sans ce bug, je ne sais pas pourquoi, je ne vois pas mon Mesh ^^' . Merci beaucoup de votre aide :) . Une tite question... Scaling, ca multiplie sa taille ou tout simplement on lui donne une taille ? Ainsi je pourrais tous leur donner 1 de x, 1 de y et 1 de z. Je pourrais les voir ^^ . Et je dois multiplier les deux matrice ? Trans * Scal pour le mettre dans World ?

BILALoch
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar bilaloch » 14 Avr 2006, 14:58

C'est bon j'ai reussi a les afficher :) . Merci beaucoup ^^ . Hum... Auriez vous une idée sur pourquoi le mesh parait pixalisé ? Merci encore.

BILALoch
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41

Messagepar bilaloch » 17 Avr 2006, 19:20

C'est bon j'ai trouvé... merci quand meme.

BILALoch
bilaloch
Hello World, I'm new !
 
Messages: 40
Inscription: 13 Avr 2006, 10:41


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 6 invités

cron