Signé de l'angle entre les deux vecteurs 3D avec la même origine dans le même plan
Ce dont j'ai besoin est une signature de l'angle de rotation entre deux vecteurs, Va et Vb située dans le même plan 3D et ayant la même origine, sachant que:
- L'avion contatining les deux vecteurs est arbitraire et n'est pas parallèle à XY ou tout autre du cardinal avions
- Vn - un plan normal
- Les deux vecteurs le long de la normale ont la même origine O = { 0, 0, 0 }
- Va - est une référence pour la mesure de la main gauche rotation à Vn
L'angle doit être mesuré de manière si le plan serait plan XY Va se présenterait pour l'axe X de l'unité de vecteur de.
Je suppose que je devrais effectuer une sorte d'espace de coordonnées de la transformation à l'aide de la Va comme l'axe des X et le produit vectoriel de Vb Vn que l'axe des Y, et puis juste à l'aide de certaines 2d méthode comme avec atan2() ou quelque chose. Des idées? Les formules?
- Et Oui, je sais à propos de "acos( Av . Vb" façon mais en raison de la nature de cosinus donne toujours le résultat positif.
- Pouvez-vous expliquer en Va? Est parallèle au Vn?
- Vn est le plan de vecteur normal ici, donc il est perpendiculaire à la fois Va et Vb - et Vn est d'abord fait connaître
- La tâche en question est simplifiée. Dans ce cas particulier Vn est le seul vecteur qui a été à l'origine connu avec la matrice de rotation R. Av est alors calculé comme un produit croisé de Vn et l'un des cardinaux de la base de vecteurs: Va = normalize( Vn x {0,1,0} );
- Solution - peut être simplifié un peu si les vecteurs sont normalisés donc pas de division nécessaire en premier lieu.
- Vous n'avez pas besoin de diviser par
(|Va||Vb|)
pour lasin
etcos
. La façonatan2
œuvres les dénominateurs annuler. - Qu'est-ce que Vn ici Plan normal signifie?
Vous devez vous connecter pour publier un commentaire.
Utilisation produit vectoriel de deux vecteurs pour obtenir la normale au plan formé par les deux vecteurs. Ensuite, vérifiez le dotproduct entre cela et l'original plan normal pour voir si elles sont orientées dans la même direction.
angle = angle*sgn(dotProduct(Vn,cross))
au lieu de laif
déclaration. Vous ne savez pas si il serait moins/plus efficace, mais il semble un peu plus agréable.x=array([ 1., 0., 0.], dtype=float32)
ety=array([ 1.00000000e+00, 9.99999975e-05, 0.00000000e+00], dtype=float32)
, vous aveznorm(y) == 1.0f
doncy
est normalisé de sortedot(x,y) == 1.0
même sinorm(cross(x,y)) == 9.9999997e-05
, etarcsin(9.9999997e-05) == 9.9999997e-05
.La solution, je suis actuellement à l'aide de semble manquer ici.
En supposant que le plan normal est normalisé (
|Vn| == 1
), la signature de l'angle est tout simplement:atan2((Vb x Va) . Vn, Va . Vb)
qui retourne un angle dans l'intervalle [-PI +PI] (ou quelle que soit la disposition atan2 la mise en œuvre des retours).
.
etx
sont la dot et de la croix-produit respectivement.Explicite pas la ramification et pas de division/longueur du vecteur de calcul est nécessaire.
Utilisation
Va x Vb
pour le droit de rotation de la main au lieu de la gaucheExplication de pourquoi cela fonctionne: laissez-alpha-être l'angle entre les vecteurs (de 0° à 180°) et la bêta de l'angle que nous recherchons (de 0° à 360°) avec
beta == alpha
oubeta == 360° - alpha
Enfin
Vous pouvez le faire en deux étapes:
Déterminer l'angle entre les deux vecteurs
theta = acos(produit scalaire de la Va, Vb). En supposant Va, Vb sont normalisés. Cela permettra de donner le minimum de l'angle entre les deux vecteurs
Déterminer le signe de l'angle
Trouver le vecteur V3 = produit croisé de Va, Vb. (l'ordre est important)
Si (produit scalaire de la V3, Vn) est négatif, thêta est négatif. Sinon, thêta est positif.
Vous pouvez obtenir l'angle de signer à l'aide de la produit scalaire. Pour obtenir le signe de l'angle, prendre le signe de
Vn * (Va x Vb)
. Dans le cas particulier du plan XY, ce qui réduit de seulementVa_x*Vb_y - Va_y*Vb_x
.dot product
êtrecross product
?up to sign
). Je veux dire le signe de l'angle dépend de lacross product
.Vn * (Va x Vb)
, qui contient à la fois un produit scalaire et un produit croisé. Les deux phrases sont indépendants.Croix un vecteur dans l'autre et de normaliser, pour obtenir le vecteur unitaire.
Le sinus de l'angle entre les deux vecteurs est égale à la grandeur de la croix du produit divisé par les amplitudes des deux vecteurs:
http://mathworld.wolfram.com/CrossProduct.html
Laisser thêta être l'angle entre les vecteurs. Soit C = Av de la croix du produit Vb. Puis
Pour déterminer si theta est positive ou négative, n'oubliez pas que C est perpendiculaire à Va et Vb pointant dans la direction déterminée par la règle de droite. En particulier, C est parallèle à Vn. Dans votre cas, si C points dans la même direction que Vn, puis thêta est négatif, puisque vous voulez gaucher de rotation. Probablement la méthode la plus simple de calcul moyen de vérifier rapidement si Vn et C pointent dans la même direction est de prendre de leur produit scalaire; s'il est positif, ils pointent dans la même direction.
Tout cela résulte de propriétés élémentaires de la la croix du produit.
Supposons que Vx est l'axe des x, compte tenu de la normale Vn, vous pouvez obtenir de l'axe des y par la croix du produit, vous pouvez projeter le vecteur Vb Vx et Vy (par le produit scalaire, vous pouvez obtenir la longueur de la projection de Vb sur Vx et Vy), compte tenu de l' (x, y) de coordonner sur le plan, vous pouvez utiliser atan2(y, x) pour obtenir l'angle dans l'intervalle [-pi +pi]
Avancée à la Clientèle fourni la solution suivante (à l'origine d'une modification à la question):
C'est le code Matlab pour calculer la signature de l'angle entre les deux vecteurs u,v, soit en 2D ou en 3D. Le code est auto-explicatif. La convention de signe est telle que positif de +90° est sortie entre ix et iy ([1,0,0],[0,1,0]) ou iy et iz ([0,1,0],[0,0,1])