2016-04-04 1 views
1

Bonsoir,Créer une matrice de rotation à partir de 2 normaux

Je veux trouver un moyen de créer une matrice de rotation avec seulement 2 vecteurs normaux. L'un est le vecteur d'origine (0,1,0) et l'autre est la normale où je veux déplacer les points.

Donc, en théorie, je dois multiplier ma matrice r par chaque point.

donc cette image représente mon problème: enter image description here

J'ai googlé, je l'ai aussi trouvé quelque chose, mais je pense que ce isnt ce que je veux vraiment.

EDIT: Ceci est également important pour l'espace 3D, l'image est juste pour une meilleure compréhension.

+0

est '(0,0,0)' un point fixe pour la rotation? –

+0

Oui, seulement après la rotation, je ne veux pas traduire ces points tournés. – Sens4

Répondre

0

Bonjour.

Supposons que vous voulez écrire la rotation qui correspond à un vecteur U à un vecteur V. Puis W=U^V (produit croisé) est l'axe de rotation et est un invariant. Soit M être la matrice associée.

Nous avons enfin:

       (V,W,V^W) = M.(U,W,U^W) 

Maintenant, nous allons écrire le code:

from pylab import cross,dot,inv 

def rot(U,V): 
    W=cross(U,V) 
    A=np.array([U,W,cross(U,W)]).T 
    B=np.array([V,W,cross(V,W)]).T 
    return dot(B,inv(A)) 

Un exemple:

In [2]: U = np.array([4, 3, 8]) 
Out[3]: V = np.array([1, 3, 4]) 

In [6]: M=rot(U,V) 
In [7]: dot(M,U) 
Out[7]: array([ 1., 3., 4.]) 

In [9]: W=cross(U,V) 

In [10]: allclose(W,dot(M,W)) 
Out[10]: True  

Notez que U et V n'a pas besoin d'être des vecteurs unitaires, juste pas parallèle. La transformation est une rotation si les normes sont égales.