Question

I besoin de calculer les angles 2 (lacet et de tangage) pour un objet 3D pour faire face à un point 3D arbitraire. Ces rotations sont appelées rotations « Euler » simplement parce que, après la première rotation, (Z permet de dire que, sur la base de l'image ci-dessous) de l'axe Y tourne également avec l'objet.

Voici le code que je utilise, mais sa ne fonctionne pas pleinement. Lorsque sur le plan de masse (Y = 0) l'objet tourne correctement pour faire face au point, mais dès que je déplace le point vers le haut en Y, les rotations ne semblent pas correctes.

// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )

Savez-vous comment calculer le 2 angles d'Euler donné un point?


L'image ci-dessous montre la façon dont je tourne. Ce sont les angles que je dois calculer. (La seule différence est que je faire tourner l'objet dans l'ordre X, Y, Z et pas Z, Y, X)

  


Ceci est mon système.

  • système de coordonnées x = vers la droite, vers le bas y = z = plus en arrière
  • un objet est par défaut à (0,0,1) qui fait face vers l'arrière
  • rotations sont dans l'ordre X, Y, Z, où X est une rotation sur tangage, lacet Y est et Z est un rouleau

mon système

Était-ce utile?

La solution

Voici mes hypothèses de travail:

  • Le système de coordonnées (x, y, z) est telle que x est positif vers la droite, y positif vers le bas, et z est la direction restante. En particulier, y = 0 est le plan de masse.
  • Un objet à (0,0,0) faisant face actuellement à (0,0,1) est tourné pour faire face vers (x, y, z).
  • Pour ce faire, il y aura une rotation autour de l'axe x suivi d'un autour de l'axe des y. Enfin, il y a une rotation autour de l'axe z afin d'avoir des choses droites.

(Le lacet terminologique, tangage et roulis peut être source de confusion, donc je voudrais éviter de l'utiliser, mais grosso modo la correspondance est x = pas, y = lacet, z = rouleau.)

Voici ma tentative de résoudre votre problème donné cette configuration:

rotx = Math.atan2( y, z )
roty = Math.atan2( x * Math.cos(rotx), z )
rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )

Espérons que cela est correct jusqu'à des signes. Je pense que la meilleure façon de corriger les signes est par essais et erreurs. En effet, vous semblez avoir obtenu les signes sur rotx et roty correct - y compris une question subtile en ce qui concerne z - donc vous suffit de fixer le signe sur rotz

.

Je pense que ce soit non négligeable (peut-être selon le Octant vous êtes), mais s'il vous plaît essayer quelques possibilités avant de dire qu'il est faux. Bonne chance!


Voici le code qui a finalement fonctionné pour moi.

I remarqué un effet de « flip » qui a eu lieu lorsque l'objet déplacé à un quadrant arrière à partir de tout quadrant avant (Z positif). Dans l'avant quadrants l'avant de l'objet serait toujours faire face au point. Dans le dos du quadrants retour de l'objet se trouve toujours au point.

Ce code corrige l'effet flip si l'avant de l'objet toujours face le point. Je l'ai rencontré par essais et erreurs, donc je ne sais pas vraiment ce qui se passe!

 rotx = Math.atan2( y, z );
 if (z >= 0) {
    roty = -Math.atan2( x * Math.cos(rotx), z );
 }else{
    roty = Math.atan2( x * Math.cos(rotx), -z );
 }

Autres conseils

La réponse de Rich vendeur vous montre comment faire pivoter un point d'un système de coordonnées 3-D à un autre système, étant donné un ensemble d'angles d'Euler décrivant la rotation entre les deux systèmes de coordonnées.

Mais il semble que vous vous demandez quelque chose de différent:

Vous avez: coordonnées 3-D d'un point unique

Vous voulez: un ensemble d'angles d'Euler

Si c'est ce que vous demandez, vous n'avez pas assez d'informations. Pour trouver les angles d'Euler, vous auriez besoin des coordonnées d'au moins deux points dans les deux systèmes de coordonnées, afin de déterminer la rotation d'un système de coordonnées dans l'autre.

Vous devez également savoir que les angles d'Euler peuvent être ambigus: la réponse de Rich prend la rotations sont appliquées à Z, puis X «alors Z », mais ce n'est pas standardisé. Si vous avez à interopérer avec un autre code en utilisant des angles d'Euler, vous devez vous assurer que vous utilisez la même convention.

Vous pouvez envisager d'utiliser des matrices de rotation ou escouades au lieu d'angles d'Euler.

Cette série de rotations vous donnera ce que vous vous demandez:

  1. A propos de X: 0
  2. A propos de Y: atan2 (z, x)
  3. A propos de Z: atan2 (y, sqrt (x * x + z * z))

Je ne peux pas vous dire ce que ceux-ci sont en termes de « roll », « pitch » et « lacet » à moins que vous définissez d'abord la façon dont vous utilisez ces termes. Vous ne les utilisez pas de manière standard.

EDIT:
Très bien, essayez ceci:

  1. A propos de X: -atan2 (y, z)
  2. A propos de Y: atan2 (x, sqrt (y * y + z * z))
  3. A propos de Z: 0

Parler de la rotation des axes, je pense que l'étape 3 ait été la rotation de X'-, Y '' -, et Z 'autour d'axes Y '' -.' Axe

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top