[DirectX] Deux problemes : rotation double, et selection multiple

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

Deux problemes : rotation double, et selection multiple

Messagepar bilaloch » 19 Avr 2006, 13:43

Bonjour a tous,

J'ai deux problemes, mineurs certes, mais plutot genants :

1 - Comment pourrais je faire une rotation en trois dimensions (pas seulement deux comme d'habitude) ? Voici mon code :

Code: Tout sélectionner
VOID SetupMatrices(int j)
{
   double sngAngleY, sngAngleZ;
   D3DXMATRIXA16 matRot;

   DIUpdate(j);

   sngAngleY = buffered_mouse.lX / 30.0f;
   sngAngleZ = buffered_mouse.lY / 30.0f;

   vEyePt.x = cos ( sngAngleY ) * 18.5;
   vEyePt.y = cos ( sngAngleZ ) * 18.5;
   vEyePt.z = ( sin ( sngAngleY ) + sin ( sngAngleZ ) /  2 ) * 18.5;

   D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
   g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

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


La, je fais la moyenne des deux sinus, mais ca ne fonctionne pas... Comment pourrais je faire une rotation sur la camera sur les trois dimensions ?

2 - Pourquoi ma fonction pour connaitre quel mesh a été selectionné ne fonctionne que sur le premier mesh ? Voici 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 );

   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 == 1 )
      {
         return i;
      }
      if ( i == nombre )
      {
         return 0;
      }
   }
}


Lorsque je clique sur "g_pMesh[1]", il fonctionne et me retourne "1", mais sur tous les autres meshes, il ne fonctionne pas (il retourne 0). Pourquoi donc d'apres vous ?

Merci beaucoup,

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

Messagepar tof » 19 Avr 2006, 14:12

Je me trompe peut-etre, mais toute rotation s'effectuant autour d'un axe (qui n'est certes pas toujours un des axes du repere actuel), une rotation est toujours dans une seule dimension.

Donc pour une rotation qui n'est pas autour d'un axe de ton repere, il suffit de multiplier la matrice de passage du repere courant a un repere contenant l'axe de rotation par la matrice de la rotation de l'objet dans ce nouveau repere.
tof
 
Messages: 1763
Inscription: 11 Avr 2005, 12:00

Messagepar Loulou » 19 Avr 2006, 14:20

1- La formule pour passer tes coordonnées sphériques en coordonnées cartésiennes est la suivante :

Code: Tout sélectionner
x = cos(phi) * cos(theta)
y = sin(theta)
z = sin(phi) * cos(theta)


Avec peut-être une erreur sur l'ordre des sin/cos ou des angles, me souviens jamais.

Ici tes coordonnées sphériques (phi et theta) seraient tes sngAngleY et sngAngleZ.

2- Fais une execution pas à pas, ou log un max d'infos pour voir à quel endroit la fonction ne se comporte pas comme prévu.
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar bilaloch » 19 Avr 2006, 14:39

Merci a vous deux... Je vais essayer de trouver la bonne formule Loulou, car la tienne ne fonctionne pas. Mais pour ce qui est du mesh, d'apres vous, si les mesh sont les meme, ca pourrait causer ce probleme ? Il semblerait que ce soit le dernier a etre charger qui est tout le temps celui qui peut etre selectionner. Pourquoi ?

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

Messagepar bilaloch » 19 Avr 2006, 16:58

Bien... j'ai resolu mon second probleme, cependant, mon premier probleme n'est pas pres d'etre resolu. D'ailleurs, j'ai beau recherché sur google et meme sur internet, mais je ne trouve rien sur ces maths... Il me faudrait de l'aide.

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

Messagepar Loulou » 19 Avr 2006, 17:17

Après vérification ma formule est bien correcte :

Code: Tout sélectionner
x = cos(sngAngleZ) * cos(sngAngleY) * 18.5;
y = sin(sngAngleZ) * 18.5;
z = cos(sngAngleZ) * sin(sngAngleY) * 18.5;

Ca donne quoi comme résultats ?
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar deathangel » 19 Avr 2006, 18:05

[quote="Loulou"]Après vérification ma formule est bien correcte :

Code: Tout sélectionner
x = cos(sngAngleZ) * cos(sngAngleY) * 18.5]
Ca donne quoi comme résultats ?[/QUOTE]


je suis assez intéressé par la formule, mais j'ai pas compris à quoi sert le
[CODE]* 18.5


si tu pouvais éclairer ma lanterne svp
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Loulou » 19 Avr 2006, 18:11

C'est simplement le rayon. Les coordonnées sphériques donnent juste un déplacement angulaire sur la sphère unitaire, après il faut multiplier par une constante pour avoir une distance autre que 1 par rapport à l'origine.

18.5 étant la valeur que notre ami utilisait, je l'ai juste reprise.
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00

Messagepar bilaloch » 20 Avr 2006, 08:49

Oui effectivement, c'est pour que la camera reste dans une position plus loin. En fait, avec ta formule, la rotation sur l'axe Y fonctionne tres bien il me semble, mais pour celle sur l'axe X, la camera a l'air de faire un rodeo sur un taureau ^^' .

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

Messagepar Loulou » 20 Avr 2006, 12:34

Bizarre. Au pire, essaye d'intervertir des cos et sin, ou d'ajouter des signes moins, ou que sais-je.
Loulou
Hello World, I'm new !
 
Messages: 702
Inscription: 10 Avr 2005, 12:00


Retourner vers Programmation

Qui est en ligne

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

cron