Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have written an algorithm for solving the following problem: Given two 3-vectors, say: $a,b$, find rotation of $a$ so that its orientation matches $b$.

However, I am not sure if the following algorithm works in all cases:

1) Find axis and angle using cross product and dot product:

$$\mathbf{x}=\frac{a\times b}{||a\times b||}\\ \theta=\cos^{-1}(\frac{a\cdot b}{||a||\cdot ||b||})$$

3) Find rotation matrix using exponential map:

$$\mathbf{R}=e^{\mathbf{A}\theta} =\mathbf{I}+\sin(\theta)\cdot \mathbf{A}+\left(1-\cos(\theta)\right) \cdot \mathbf{A}^{2}$$

where $\mathbf{A}$ is a skew-symmetric matrix corresponding to $\mathbf{x}$:

$$\mathbf{A}=[\mathbf{x}]_{\times}=\begin{bmatrix}0 & -\mathbf{x}_{3} & \mathbf{x}_{2} \\ \mathbf{x}_{3} & 0 & -\mathbf{x}_{1} \\ -\mathbf{x}_{2} & \mathbf{x}_{1} & 0\end{bmatrix}$$


The axis is computed using cross product as this gives vector perpendicular to both $a$ and $b$. Only direction of the axis is important, hence it is divided by its magnitude. However, I am not sure if $\mathbf{x}$ will always have the proper direction (the result can be $-\mathbf{x}$ instead of $\mathbf{x}$?).

The rotation matrix is computed using Rodrigues' rotation formula.

Finally, the vector $\mathbf{R}a$ should have same direction as $b$.

I have tested this numerically and it seems working, but I would like to be sure the formulas work for any two $a,b$.

share|cite|improve this question
up vote 5 down vote accepted

This is the right general approach, but the corner case $\|a\times b\| \approx 0$ must be handled.

If $\theta < \epsilon,$ $R=I$.

If $\pi-\theta < \epsilon$, you can choose for $\mathbf{x}$ any vector orthogonal to $\mathbf{a}$, for instance $\mathbf{x} = \frac{\mathbf{a} \times e_i}{\|\mathbf{a}\times e_i\|}$, where $i$ is the index of the component of $\mathbf{a}$ with least magnitude.

share|cite|improve this answer
I was aware of the first case (very small angle), but you have shown the angle approaching 180° is also important to handle. Thanks. – Libor Feb 2 '13 at 21:53
Libor, user7530: Can anyone explain the origin of rotation matrix formula? I've no idea about rotation matrix and skew matrix. I'd also like to know what happens at 0 and 180 to handle the cases separately? I also have no idea about orthogonal vector. I can understand till finding the angle between vectors and the axis of rotation. – cegprakash Jun 9 '14 at 23:17
@cegprakash Have you read the article on Wikipedia about the Rodrigues Rotation Formula? What you ask is a rather broad topic, you may want to try asking specific, new questions. – user7530 Jun 9 '14 at 23:40

Let $F_n(x) = x - {2 \over n . n} n (n \ . \ x)$ be the transformation that reflects $x$ through the plane that is perpendicular to $n$. Composing two reflections gives a rotation: if the angle from $a$ to $b$ is $\phi$ then $F_b(F_a(x))$ rotates $x$ on the plane spanned by $a$ and $b$ by $2 \phi$.

Given the normalized vectors $\hat a=a/|a|$, $\hat b=b/|b|$, $\hat c=c/|c|$, where $c = \hat a + \hat b$, the angle from $\hat a$ to $\hat c$ is $\phi$, half the angle from $\hat a$ to $\hat b$.

In fact, $F_{\hat c}(F_{\hat a}(x))$ rotates $x$ by $\phi$ on the plane spanned by $a$ and $b$. This is valid even if $a$ and $b$ are parallel. This avoids computing a cross product, inverse cosine, sine and cosine, or division by a magnitude that can be arbitrarily close to zero.

share|cite|improve this answer
On second thought, this still isn't valid if the two vectors point in opposite directions. Other than expecting the user to explicitly provide a bisecting vector, reflect on (t-a) and then (t-b) where t is a coordinate vector corresponding to the smallest component of the vector a. This is detailed in this paper: – Centrinia Mar 18 '15 at 12:12

I have a simpler method comes from Erigen's "Mechanics of Continua". Here R is rotational matrix that rotate vector "a" align with vector "b"

Matlab Code:

%%%%%% Rotate vector a align with vector b%%%%%%%%%%
syms ax ay az bx by bz k real

a=[ax ay az]'


b=[bx by bz]'


R=[bu(1)*au(1) bu(1)*au(2) bu(1)*au(3);

    bu(2)*au(1) bu(2)*au(2) bu(2)*au(3)

    bu(3)*au(1) bu(3)*au(2) bu(3)*au(3)]

% You can verify it by type




%the result is zero means c(a after rotation) and b are aligned with each other.  


%the result is zero means c(a after rotation) and a are of the same length

share|cite|improve this answer
Thanks. Could you please point me to the theory? The matrix seems to be simply $R=ab^{T}$ where $a$ and $b$ are normalized vectors. It is not clear to me why $R^{T}=R^{-1}$ (i.e. $R^{T}R=I$) in that case. The book is unfortunately hard to obtain and too much hassle just to get this information... – Libor Jul 26 '14 at 14:14

I'm not clear on why you have a factor of $A^2$ in your expression for $R$. In particular, wikipedia lists the matrix form for the Rodrigues formula as

$$R = I \cos \theta + A \sin \theta + (1-\cos \theta) x x^T$$

share|cite|improve this answer
Note that for $k$ a unit vector, $A^2 = kk^T - I$. – user7530 Feb 2 '13 at 21:40
function [ R ] = RotAtoB( a,b )
    x = [a(2)*b(3) - b(2)*a(3);a(3)*b(1) - b(3)*a(1);a(1)*b(2) - b(1)*a(2)];
    x = x/norm(x);
    theta = acos(a'*b/(norm(a)*norm(b)));
    A = [0    -x(3)  x(2)
         x(3)   0   -x(1)
        -x(2)  x(1)   0  ];
    R = eye(3) + sin(theta)*A + (1-cos(theta))*A^2;

Calculating the powers of matrix : Nth power of a square matrix and the Binet Formula for Fibonacci sequence

share|cite|improve this answer
What does the link have to do with this? – Vladhagen Nov 6 '14 at 5:01

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.