computing rotation matrix for vector rotation about another vector

Discussion in 'MATLAB' started by John, Sep 4, 2007.

  1. John

    John Guest

    I have two known vectors (in 3-space if it matters), v and
    b. v is rotated by an unknown rotation matrix, R, into b.


    I want to rotate b by the same amount (and in the same plane
    of rotation defined by v and b) to get c. i.e.:


    R is orthogonal, so RR' = R'R = I, so


    I only need to compute c. If I can compute c without
    computing R, that works. But some mental block stops me from
    computing c.

    I could come up with:

    cross(v,c) = n ( 2 * cross(v,b) * dot(v,b) )/ (|v| * |b|)

    where n = cross(v,b) / |cross(v,b)|

    so the LHS can be expressed as a skew-symmetric matrix, V,
    with c, and the RHS is just a scalar times the normal
    direction, but I can't seem to solve for c because V is rank 2.

    Any ideas?

    John, Sep 4, 2007
    1. Advertisements

  2. John

    W. Dale Hall Guest

    Try this: use the fact that the points

    0 (the origin)

    all lie in a plane (the plane containing the
    circle that v would rotate through if you took
    all real powers of the matrix R and applied to
    v), and that the triangles

    0 v b

    0 b c

    are congruent. If you were to sketch a picture
    of this plane, you would get something like this:

    . .
    . .
    . .
    . .

    where I've indicated the lines connecting
    0&v, 0&b, 0&c, v&b and v&c as well as I could
    given ASCII characters. The next thing to
    notice is that v and c are symmetric about the
    line 0b, so you could in fact write c as the
    reflection of v through this line.

    The easy way to do this it to take the projection
    of v along b:

    (v.b/||b||^2) b

    and subtract it from v:

    v - (v.b/ ||b||^ 2) b

    to get the component of v orthogonal to b.

    I'll let p(v,b) denote v.b / ||b||^2
    to simplify what follows.

    Note that you get a decomposition of v into
    parts parallel to b & orthogonal to b:

    v = p(v,b) b + (v - p(v,b) b)

    (you should verify for yourself that the
    second term is indeed orthogonal to b)

    The vector c you want just has the other sign
    for the component orthogonal to b:

    c = p(v,b) b - (v - p(v,b) b)

    That should do the trick.

    W. Dale Hall, Sep 5, 2007
    1. Advertisements

  3. John

    W. Dale Hall Guest

    ... stuff deleted ...

    oops: I forgot to note that c is also in this plane.


    W. Dale Hall, Sep 5, 2007
  4. John

    John Guest

    Thanks for the idea. That looks right. I'll try it today.
    John, Sep 5, 2007
  5. John

    John Guest

    Dale, thanks. That worked.
    John, Sep 5, 2007
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.