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;
}