Point et orientation (quaternion)
Bonjour à tous :)
J'essaie d'utiliser le quaternion pour orienter un actor A vers B... en 2D c'est fastoche mais en 3D, qui plus est avec NxQuad c'est la loose totale :aie:
Pour l'instant j'essaie uniquement de pointer en X-Z :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| NxVec3 pPan(0,1,0);
NxVec3 vA= actorA->getGlobalPosition();
NxMat33 rA= actorA->getGlobalOrientation();
NxVec3 vB= actorB->getGlobalPosition();
NxVec3 wPan = rA % pPan;
wPan.normalize();
NxVec3 vDir = vB - vA;
vCross.cross(vDir, pPan);
vCross.normalize();
///-A-from vector-rotation
//pRad = acos(wPan.dot(vDir));
//-B-from positions
pRad = acos(vA.dot(vB));
pAngle = NxMath::radToDeg(pRad);
NxQuat q( pAngle, vCross);
q.normalize();
NxMat33 pRot;
pRot.fromQuat(q);
actorA ->setGlobalOrientation( pRot); |
Le problème c'est que je n'arrive pas à avoir un angle entre 0-360° 8O
Je ne sais pas vraiment sur quel type de vecteur (position d'actors normalisés ou extrait de leur rotation..) m'appuyer...
Si j'utilise pAngle une petite formule de trigo 2D genre:
dx = x0-x1;
dy = y0-y1;
absX = abs(dx);
absY = abs(dy);
tg = absY/absX;
ang = atan(tg)*180/M_PI;
if (quad == 1)
ang = 90 + ang;
else if (quad == 2)
ng = 90 - ang;
...
j'obtiens bien mon angle entre 0-360 mais je ne vois pas comment m'y prendre avec le NxQuad :?
Auriez vous une petite idée ?
ps: sinon je crois avoir trouvé une bonne explication de Minorlogic http://www.euclideanspace.com/maths/...minorlogic.htm
mais ici ça ne pointe pas correctement...de plus j'ai un doute ma 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
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;
} |