[DirectX] Selectionner ?

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

Selectionner ?

Messagepar bilaloch » 15 Avr 2006, 08:54

Bonjour a tous :) ,

Je ne vois pas comment faire en sorte pour que l'on puisse selectionner un mesh... Je peux utiliser DirectInput pour trouver la position de la souris et quel evenement, mais pour le combiner avec DirectGraphics pour selectionner un objet 3D, il me faut de l'aide.

Merci ;)

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

Messagepar Loulou » 15 Avr 2006, 11:40

Ce que tu cherches s'appelle du picking, avec Google tu devrais trouver un max de choses.

Note que D3DX fournit une fonction de picking avec des mesh (me rappelle plus le nom).
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar bilaloch » 15 Avr 2006, 15:41

Merci beaucoup Loulou :) . Tu connais tout :D . Il me semble qu'elle s'appelle "intersect"... Mais quel est la taille de la camera (x, y et z) ?

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

Messagepar bilaloch » 15 Avr 2006, 16:53

Il me faut un "LPD3DXBASEMESH" mais moi j'ai un "LPD3DXMESH". Comment dois je y remedier ? Copier un "LPD3DXMESH" en "LPD3DXBASEMESH" ? Quel fonction utiliser ?

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

Messagepar Lenolian » 15 Avr 2006, 16:58

L'interface Mesh dérive de l'interface BaseMesh, tu peut donc utiliser un LPD3DXMESH à la place d'un LPD3DXBASEMESH.

Toutes ces infos sont dans la docs fournis avec le SDK.
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 » 15 Avr 2006, 18:04

Oui j'ai remarqué... Merci quand meme. La camera a quelle taille ? Pour que je puisse calculer la trajectoire de la souris. J'ai mis :

Code: Tout sélectionner
INT Quel( float x, float y, int nombre )
{
   BOOL Oui;

   D3DXVECTOR3 Position( vEyePt.x + x - 0.5f, vEyePt.x + x - 0.5f, vEyePt.z );
   D3DXVECTOR3 Vers( vLookatPt.x + x - 0.5f, vLookatPt.x + x - 0.5f, vLookatPt.z );

   for ( int i = 1 ; ; i++ )
   {
      D3DXIntersect( g_pMesh[i], &Position, &Vers, &Oui, NULL, NULL, NULL, NULL, NULL, NULL );
      if ( Oui == true )
      {
         MessageBox(NULL, "OUAIS !", "Bureau.exe", MB_OK);
         return i;
      }
      if ( i == nombre )
      {
         return 0;
      }
   }
}


Où x et y sont la position de la souris dans le programme sur 1. Est ce la bonne marche a suivre ?

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

Messagepar Loulou » 15 Avr 2006, 19:16

Tu devrais t'inspirer du sample Pick du SDK. En l'occurence il faut commencer par projeter les coordonnées écran dans l'espace de la caméra (en les multipliant par l'inverse de la matrice de projection). Mais tout ceci est décrit dans n'importe quel tuto sur le sujet.

Ceci-dit c'est bien dommage que D3DX n'ait pas de fonction dédiée au picking (D3DXIntersect ne fait qu'un lancer de rayon dans l'espace 3D).
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar Lenolian » 15 Avr 2006, 19:27

La camera a quelle taille ?


Elle a pas de taille, c'est un point dans un espace 3D.

Est ce la bonne marche a suivre ?


Vu que tu n'utilises pas y dans le code, je pense pas que ce soit cela. Mais bon je pense que c'est une erreur de recopie.

Pour projeter un point de l'écran dans l'espace 3D, tu as la fonction D3DXVec3Unproject.

Code: Tout sélectionner
D3DXVECTOR3 v1(x,y,0.0f);
D3DXVECTOR3 v2(x,y,1.0f);
D3DXVECTOR3 pos, dir;

D3DXVec3Unproject(&pos,&v1,&viewport,&projection,&view,&world);
D3DXVec3Unproject(&dir,&v2,&viewport,&projection,&view,&world);
D3DXIntersect( g_pMesh[i], &pos, &dir, &Oui, NULL, NULL, NULL, NULL, NULL, NULL );


Pas sur à 100% du code, j'ai fait çà de tête.
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 » 15 Avr 2006, 20:10

Merci bien... Je teste ca. Et merci pour me rappeller l'existence de l'exemple pick :) . Au fait, je voulais ecrire :

Code: Tout sélectionner
INT Quel( float x, float y, int nombre )
{
   BOOL Oui;

   D3DXVECTOR3 Position( vEyePt.x + x - 0.5f, vEyePt.y + y - 0.5f, vEyePt.z );
   D3DXVECTOR3 Vers( vLookatPt.x + x - 0.5f, vLookatPt.y + y - 0.5f, vLookatPt.z );

   for ( int i = 1 ; ; i++ )
   {
      D3DXIntersect( g_pMesh[i], &Position, &Vers, &Oui, NULL, NULL, NULL, NULL, NULL, NULL );
      if ( Oui == true )
      {
         MessageBox(NULL, "OUAIS !", "Bureau.exe", MB_OK);
         return i;
      }
      if ( i == nombre )
      {
         return 0;
      }
   }
}


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

Messagepar bilaloch » 16 Avr 2006, 11:08

Bizarre... je n'ai pas trouver l'exemple Pick du SDK. Quel version l'integre ?

PS : J'ai fais quelques modifs dans mon code, mais je ne vois pas pourquoi il me dit maintenant a chaque fois qu'il touche le mesh en question (quelque soit le mesh) :

Code: Tout sélectionner
INT Quel( float x, float y, int nombre )
{
   BOOL Oui;

   D3DXVECTOR3 dir;
   D3DVIEWPORT9 viewport;
   
   g_pd3dDevice->GetViewport( &viewport );

   dir.x = ( x / viewport.Width ) + vEyePt.x;
   dir.y = ( y / viewport.Height ) + vEyePt.y;
   dir.z = 1000;

   for ( int i = 1 ; ; i++ )
   {
      D3DXIntersect( g_pMesh[i], &vEyePt, &dir, &Oui, NULL, NULL, NULL, NULL, NULL, NULL );
      if ( Oui == true )
      {
         MessageBox(NULL, "OUAIS !", "Bureau.exe", MB_OK);
         return i;
      }
      if ( i == nombre )
      {
         return 0;
      }
   }
}


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

Messagepar Loulou » 16 Avr 2006, 13:17

Chez moi c'est le SDK de Février 2006.
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar bilaloch » 16 Avr 2006, 14:59

Ok... Merci. Pendant que je telecharge et j'installe le SDK j'aimerais vous montrer mon code :

Code: Tout sélectionner
INT Quel( float x, float y, float w, float h, int nombre )
{
   BOOL Oui;
   float distanceToCollision;

   D3DXVECTOR3 v;
   D3DXMATRIX m;
   D3DXMATRIX matInverse;
   D3DXVECTOR3 rayOrigin, rayDir;
   D3DXVECTOR3 rayObjOrigin,rayObjDirection;

   v.x =  ( ( ( 2.0f * x ) / w ) - 1 ) / matProj._11;
   v.y = -( ( ( 2.0f * y ) / h ) - 1 ) / matProj._22;
   v.z =  1.0f;

   D3DXMatrixInverse( &m, NULL, &matView );

   // Transform the screen space pick ray into 3D space
   rayDir.x = v.x * m._11 + v.y * m._21 + v.z * m._31;
   rayDir.y = v.x * m._12 + v.y * m._22 + v.z * m._32;
   rayDir.z = v.x * m._13 + v.y * m._23 + v.z * m._33;
   rayOrigin.x = m._41;
   rayOrigin.y = m._42;
   rayOrigin.z = m._43;

   D3DXMatrixInverse(&matInverse,NULL,&matWorld);

   D3DXVec3TransformCoord(&rayObjOrigin,&rayOrigin,&matInverse);
   D3DXVec3TransformNormal(&rayObjDirection,&rayDir,&matInverse);
   D3DXVec3Normalize(&rayObjDirection,&rayObjDirection);

   for ( int i = 1 ; ; i++ )
   {
      D3DXIntersect(g_pMesh[i], &rayObjOrigin, &rayObjDirection, &Oui, NULL, NULL, NULL, &distanceToCollision, NULL, NULL);
      if ( Oui == true )
      {
         MessageBox(NULL, "OUAIS !", "Bureau.exe", MB_OK);
         return i;
      }
      if ( i == nombre )
      {
         return 0;
      }
   }
}


J'ai pris cela de ce site : http://www.toymaker.info/Games/html/picking.html

Voila, donner moi votre avis :) .

PS : Je n'arrive pas a dl le SDK DirectX... pourrais tu me l'envoyer par mail ? (momodestains@yahoo.fr(l'exemple pick seulement lol))

Merci beaucoup ^^ .
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 35 invités

cron