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
Pour l'instant j'essaie uniquement de pointer en X-Z :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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°
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Partager