Point at orientation (quaternion)

Point at orientation (quaternion) - C++ - Programmation

Marsh Posté le 20-07-2010 à 10:48:45    

Bonjour à tous  :)  
 
J'essaie de comprendre comment utiliser un quaternion (NxQuat de PhysX) pour qu'un objet A pointe vers B...
 
Pour l'instant A pointe vers B seulement sur le plan axial X-Z :
 

Code :
  1. NxVec3 vA= actorA ->getGlobalPosition();
  2. NxVec3 vB= actorB->getGlobalPosition();
  3. NxVec3 pPitch(0,1,0);
  4. NxVec3 vDir = vA - vB;
  5. vDir.normalize();
  6. NxVec3 vC;
  7. vC.cross(vDir, pPitch);
  8. vC.normalize();
  9. NxReal pRad = 0;//vC.dot(pPitch);
  10. NxQuat q(pCross, pRad) ;
  11. q.normalize();
  12. NxMat33 pRot;
  13. pRot.fromQuat(q);
  14. actorA ->setGlobalOrientation( pRot);


 
...à première vue A semble tourner dans la bonne direction mais en déplacant B autour de A  
je me rends compte que ce dernier fait 2 tours au lieu de 1 !?
 
Si la démarche est bonne, comment pourrais-je diviser mon angle de rotation ?
 
merci  :ange:

Reply

Marsh Posté le 20-07-2010 à 10:48:45   

Reply

Marsh Posté le 20-07-2010 à 17:02:05    

2 tours au lieu de 1 ?

Reply

Marsh Posté le 20-07-2010 à 17:02:51    

Si c'est A qui doit s'orienter vers B, ce serait pas plustôt vDir = vB - vA ?
 
Et ce serait pas le deuxième constructeur qu'il te faudrait ?
 
NxQuat (const NxReal angle, const NxVec3 &axis)
creates from angle-axis representation
 
Et non celui que tu utilises:
NxQuat (const NxVec3 &v, NxReal w=0)
copies xyz elements from v, and scalar from w (defaults to 0).
 
Un NxQuat( 0, (vB-vA).normalize() ) ça donne quoi ?
 
vDir = vB - vA
vSide = vDir ^ Up
vFront = vCross ^ Up
 
Angle = acos( vFront.dot( vDir )
NxQuat( Angle, vSide )
 
Ça donnerai pas ce que tu veux ? (attention à normaliser où il faut :D)

Message cité 1 fois
Message édité par bjone le 20-07-2010 à 17:47:52
Reply

Marsh Posté le 20-07-2010 à 20:45:57    

Salut bjone  :p  
 

bjone a écrit :

Si c'est A qui doit s'orienter vers B, ce serait pas plustôt vDir = vB - vA ?
 
Et ce serait pas le deuxième constructeur qu'il te faudrait ?
 
NxQuat (const NxReal angle, const NxVec3 &axis)
creates from angle-axis representation
 


 
possible  :whistle:  
 

bjone a écrit :


vDir = vB - vA
vSide = vDir ^ Up
vFront = vCross ^ Up
 
Angle = acos( vFront.dot( vDir )
NxQuat( Angle, vSide )
 


 
 
Autrement dit ?:
 
 

Code :
  1. ...
  2.         vB = mB.getGlobalPosition();
  3. vA.normalize();
  4. vB.normalize();
  5.         NxVec3 vDir = vB - vA;
  6. NxVec3 Up(0,1,0);
  7. NxVec3 vCross;
  8.   vCross.cross(vDir, Up);
  9.   vCross.normalize();
  10. NxVec3 vSide = vDir ^ Up;
  11. NxVec3 vFront = vCross ^ Up;
  12. pRad = acos( vFront.dot( vDir ) );
  13. pAngle = NxMath::radToDeg( pRad );
  14. NxQuat q;// ( pRad, vSide );
  15.  q.fromAngleAxis( pAngle, vSide );
  16.  q.normalize();
  17. NxMat33 pOrient;
  18.       pOrient.fromQuat(q);


 

Citation :


Ça donnerai pas ce que tu veux ? (attention à normaliser où il faut :D)


A s'oriente bien dans les 3 dimensions mais ne pointe pas exactement vers B
Quand B tourne autour de A (en XZ), ce dernier pointer vers B uniquement dans un quart de cercle sur le pane X-Z, alors que pour le reste il se dresse en Y  ..comme s'il pivotait dans le 1/4 d'une sphère imaginaire  (en XYZ)  :sweat:  
 
 
ps: hum, 1ere fois que j'utilise ^, comment se comporte ce xor  avec vDir et Up ?
 
 
 
-----------------------------------------------------------------------------------------------------------
 
 
Sinon je crois avoir trouvé une bonne explication de Minorlogic http://www.euclideanspace.com/math [...] rlogic.htm
mais j'ai un doute sur le transcription (PhysX) de la ligne  //A avec len_squared()
...en //B avec ()distanceSquared() ?
...ou en //C avec magnitudeSquared() ??
 
Est que le carré de la longueur d'un vecteur correspond au carré de sa magnitude ?
   

Code :
  1. angleBetween(NxVec3 v1,NxVec3 v2)
  2. {
  3. NxReal d = v1.dot(v2);
  4. NxVec3 axis = v1;
  5.     axis.cross(v1);
  6. //A)  src  NxReal qw = Math.sqrt(v1.len_squared()*v2.len_squared()) + d;
  7. //B)     
  8.           NxReal qw = sqrt(v1.distanceSquared(v2)) + d;
  9. //C)
  10.          NxReal qw = sqrt(v1.magnitudeSquared()*v2.magnitudeSquared()) + d;
  11. if (qw < 0.0001) { // vectors are 180 degrees apart
  12. //src return (new sfquat(0,-v1.z,v1.y,v1.x)).norm;
  13.  NxVec3 vD(-v1.z,v1.y,v1.x);
  14.  NxQuat q(vD, 0.0 );
  15.    q.normalize();
  16.  return q;
  17. }
  18.   NxQuat q(axis, qw );
  19.       q.normalize();
  20.     return q;
  21. }


 
...en essayant les 2 solutions, ça ne fait pas l'affaire non plus  :??:  
 
Voilou,  
j'espère ne pas trop brouiller le problème avec ces 2 tentatives  :D merci


Message édité par spinzero le 21-07-2010 à 10:11:12
Reply

Marsh Posté le 21-07-2010 à 12:25:51    

^ c'est un symbole papier utilisé pour le produit vectoriel, enfin de ce qui me reste de mes cours de méca :D
(bon tu me diras, pour le .dot j'aurai pu utiliser . ou X :D)
 
En fait mon idée devait être fausse  :whistle:


Message édité par bjone le 21-07-2010 à 12:29:41
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed