web-dev-qa-db-fra.com

Calcul de l'angle réel entre deux vecteurs dans Unity3D

Est-il possible de calculer l'angle réel entre deux vecteurs 3D dans Unity? Vector3.Angle donne l'angle le plus court entre les deux vecteurs. Je veux connaître l'angle réel calculé dans le sens des aiguilles d'une montre.

9
shaveenk

Cela devrait être ce dont vous avez besoin. a et b sont les vecteurs pour lesquels vous voulez calculer un angle, n serait la normale de votre avion pour déterminer ce que vous appelleriez "sens horaire/antihoraire"

float SignedAngleBetween(Vector3 a, Vector3 b, Vector3 n){
    // angle in [0,180]
    float angle = Vector3.Angle(a,b);
    float sign = Mathf.Sign(Vector3.Dot(n,Vector3.Cross(a,b)));

    // angle in [-179,180]
    float signed_angle = angle * sign;

    // angle in [0,360] (not used but included here for completeness)
    //float angle360 =  (signed_angle + 180) % 360;

    return signed_angle;
}

Par souci de simplicité, je réutilise Vector3.Angle puis calcule le signe à partir de la magnitude de l'angle entre le plan normal n et le produit transversal (vecteur perpendiculaire) de a et b.

17
Jerdak

C'est facile si vous utilisez simplement l'addition et la soustraction. Regarde ça:

/Degrees
  float signedAngleBetween (Vector3 a, Vector3 b, bool clockwise) {
  float angle = Vector3.angle(a, b);

  //clockwise
  if( Mathf.Sign(angle) == -1 && clockwise )
    angle = 360 + angle;

  //counter clockwise
  else if( Mathf.Sign(angle) == 1 && !clockwise)
    angle = - angle;
  return angle;
}

Voici ce que je veux dire: si nous sommes dans le sens des aiguilles d'une montre et que l'angle est négatif, par exemple. -170 pour en faire 180, vous utilisez cette équation. "180- | angle | +180" vous savez déjà que l'angle est négatif, utilisez donc "180 - (- angle) +180" et ajoutez les 180 "360 + angle". Ensuite, si c'est dans le sens des aiguilles d'une montre,CONTINUEmais si c'est dans le sens contraire des aiguilles d'une montre, indiquez un angle négatif, car l'autre partie de l'angle 360 ​​(qui est le complément de 360 ​​+ angle) est "360 - (360 + angle) "ou" 360 - 360 - angle "OR" (360 - 360) - angle "et, encore une fois,OU" - angle ". Nous y voilà donc ... votre angle fini.

1
Kino Bacaltos