spinzero | Salut bjone
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
bjone a écrit :
vDir = vB - vA
vSide = vDir ^ Up
vFront = vCross ^ Up
Angle = acos( vFront.dot( vDir )
NxQuat( Angle, vSide )
|
Autrement dit ?:
Code :
- ...
- vB = mB.getGlobalPosition();
- vA.normalize();
- vB.normalize();
- NxVec3 vDir = vB - vA;
- NxVec3 Up(0,1,0);
- NxVec3 vCross;
- vCross.cross(vDir, Up);
- vCross.normalize();
- NxVec3 vSide = vDir ^ Up;
- NxVec3 vFront = vCross ^ Up;
- pRad = acos( vFront.dot( vDir ) );
- pAngle = NxMath::radToDeg( pRad );
- NxQuat q;//
( pRad, vSide );
- q.fromAngleAxis( pAngle, vSide );
- q.normalize();
- NxMat33 pOrient;
- pOrient.fromQuat(q);
|
Citation :
Ça donnerai pas ce que tu veux ? (attention à normaliser où il faut )
|
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) 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 :
- angleBetween(NxVec3 v1,NxVec3 v2)
- {
- NxReal d = v1.dot(v2);
- NxVec3 axis = v1;
- axis.cross(v1);
- //A) src NxReal qw = Math.sqrt(v1.len_squared()*v2.len_squared()) + d;
- //B)
- NxReal qw = sqrt(v1.distanceSquared(v2)) + d;
- //C)
- NxReal qw = sqrt(v1.magnitudeSquared()*v2.magnitudeSquared()) + d;
- if (qw < 0.0001) { // vectors are 180 degrees apart
- //src return (new sfquat(0,-v1.z,v1.y,v1.x)).norm;
- NxVec3 vD(-v1.z,v1.y,v1.x);
- NxQuat q(vD, 0.0 );
- q.normalize();
- return q;
- }
- NxQuat q(axis, qw );
- q.normalize();
- return q;
- }
|
...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 merci Message édité par spinzero le 21-07-2010 à 10:11:12
|