Calcul de l'angle entre les deux vecteurs dans Unity3D
Est-il une manière que je peux calculer l'angle entre deux Vecteurs 3D dans l'Unité? Vector3.L'Angle donne le plus court de l'angle entre les deux vecteurs. Je veux savoir l'angle réel calculé, dans le sens de la mode.
Qu'entendez-vous par le plus court de l'angle? Il n'y a qu'un angle entre deux vecteurs. L'angle est généralement calculée par (conceptuellement) en passant du premier vecteur dans un arc vers le second vecteur.
Je ne veux pas de l'angle calculé par le déplacement du premier vecteur dans le sens horaire ou dans le sens inverse, en direction d'un Vecteur. Dans la mise en œuvre de Vector3.Angle, je reçois de 90 degrés si le Vecteur 2 est de 90 degrés dans le sens horaire à partir du Vecteur 1, ou même si elle est de 270 degrés. Je veux le retour de 270 degrés.
La réponse que je viens de poster (et supprimer) les deux secondes, il est évidemment faux, mais je pense que vous allez vraiment finir à l'aide de produit scalaire de ces deux vecteurs.
Par la voie, que voulez-vous dire exactement par "sens horaire"? À partir de quel moment vous voulez regarder ces vecteurs et de déterminer si elles sont dans le sens horaire ou dans le sens inverse?
Et si du point de vue de la dit point dans l'espace de ces vecteurs arriver à projet en une seule ligne? Par exemple, si vous souhaitez déterminer "clockwiseness" les vecteurs par la recherche à partir d'un point (0,+9001,0), ce qui au sujet de qui se trouvent dans le plan X-Y?
Je ne veux pas de l'angle calculé par le déplacement du premier vecteur dans le sens horaire ou dans le sens inverse, en direction d'un Vecteur. Dans la mise en œuvre de Vector3.Angle, je reçois de 90 degrés si le Vecteur 2 est de 90 degrés dans le sens horaire à partir du Vecteur 1, ou même si elle est de 270 degrés. Je veux le retour de 270 degrés.
La réponse que je viens de poster (et supprimer) les deux secondes, il est évidemment faux, mais je pense que vous allez vraiment finir à l'aide de produit scalaire de ces deux vecteurs.
Par la voie, que voulez-vous dire exactement par "sens horaire"? À partir de quel moment vous voulez regarder ces vecteurs et de déterminer si elles sont dans le sens horaire ou dans le sens inverse?
Et si du point de vue de la dit point dans l'espace de ces vecteurs arriver à projet en une seule ligne? Par exemple, si vous souhaitez déterminer "clockwiseness" les vecteurs par la recherche à partir d'un point (0,+9001,0), ce qui au sujet de qui se trouvent dans le plan X-Y?
OriginalL'auteur shaveenk | 2013-10-30
Vous devez vous connecter pour publier un commentaire.
Ce doit être ce dont vous avez besoin.
a
etb
sont les vecteurs pour lesquels vous voulez calculer un angle,n
serait normal de votre avion afin de déterminer ce que vous appelez "dans le sens horaire/antihoraire"Pour des raisons de simplicité je réutiliser
Vector3.Angle
puis calculer le signe de l'ampleur de l'angle entre le plan normaln
et le produit vectoriel (perpendiculaire vecteur) dea
etb
.Jedrak la réponse est grand, mais si vous voulez obtenir les angles dans la plage de [0, 360), vous devez modifier angle360 formule (écrire 360 au lieu de 180): float angle360 = (signed_angle + 360) % 360;
Pourriez-vous expliquer les Mathématiques derrière cela ? spécialement
float sign = Mathf.Sign(Vector3.Dot(n,Vector3.Cross(a,b)));
2 vecteurs
a
etb
définir un avion, mais il est implicite, 3e vecteur, la croix du produit de la première 2, qui définit le plan de la normale. N'importe quel angle entrea
etb
tourne autour de ce 3ème axe. Le problème est donc de quelle façon nous nous tourner? L'angle entre 2 vecteurs est toujours un angle positif.Vector3.Angle(a,b) == Vector3.Angle(b,a)
. Pour trouver le sens de rotation, nous utilisons la ligne que vous avez identifié qui, essentiellement, se contente de comparer l'utilisateur définit l'axe de rotationn
contre l'implicite de l'axe. Si un match, le signe est positif, si pas, le signe est négatif.OriginalL'auteur Jerdak
Il est facile si vous venez d'utiliser l'addition et la soustraction. Regardez ceci:
Voici ce que je veux dire:
si nous sommes des aiguilles d'une montre et l'angle est négatif, par exemple -170
pour le rendre 180, vous utilisez cette équation. "180-|angle|+180"
vous savez déjà que l'angle est négatif, donc, utiliser "180-(angle)+180" et d'ajouter les 180 "360 + angle".
Alors si c'est dans le sens horaire, CONTINUER mais si c'est dans le sens antihoraire, faire de l'angle négatif, c'est parce que l'autre partie de l'angle de 360 (qui est le complément de la 360 + angle) est "à 360 (360 + angle)" ou
"360 - 360 - angle" OU "(360 - 360) - angle" et, de nouveau, OU "angle". Donc, nous y voilà... vous avez terminé votre angle.
OriginalL'auteur Kino Bacaltos
Essayez d'utiliser
Vector3.Angle(targetDir, forward);
Puisque vous voulez le plus court de l'angle entre eux, puis, si la valeur retournée est de plus de 180 degrés, juste soustraire à 360 degrés avec cette valeur.
Découvrez http://answers.unity3d.com/questions/317648/angle-between-two-vectors.html
Ok voici une idée: Vérifier le quadrant le vecteur est dans. Par exemple, si la composante x est positif et que le composant y est négatif, alors que c'est dans la 4ème quadrant. Le faire avec les 2 vecteurs, et vous aurez une idée de leur orientation par rapport à l'autre. Maintenant, si les deux vecteurs arriver à être dans le même quadrant, juste calculer l'angle entre chacun de vos vecteur un vecteur, dire le vecteur qui se trouve entre les quadrants 1 et 4. À partir de ces angles, vous devriez être en mesure de déterminer leurs orientations relatives.
J'ai essayé la même chose. Cela fonctionne partiellement, mais le même problème se pose dans le quadrant si j'essaie de comparer l'Angle entre les Vecteurs. Un léger changement à la dernière étape, mais nous donne une solution mais c'est pas toujours pratique. Au lieu de vérifier l'angle entre un Vecteur et un vecteur arbitraire dans ce quadrant, vous pouvez comparer les x composantes des deux Vecteurs dans les deux quadrants. Vous devez toujours vous assurer que les deux vecteurs sont dans le même quadrant moitiés d'autre, il ne fonctionnera pas correctement.
Si vous regardez la documentation,
Vector3.Angle
dit: "L'angle retournée est toujours l'angle aigu... jamais de plus de 180 degrés". Si cette réponse n'est pas seulement de répondre à une question que l'OP n'a pas demandé, il contient trompeuses ou fausses informations.OriginalL'auteur aaa