help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: find the rotation matrix between two vectors


From: John Swensen
Subject: Re: find the rotation matrix between two vectors
Date: Tue, 27 Apr 2010 11:36:12 -0400

On Apr 27, 2010, at 11:12 AM, James Sherman Jr. wrote:

> The most intuitive way for me is to first axis-angle representation of the 
> rotation, then convert it to a quaternion.
> 
> To get axis-angle is fairly straightforward, the inner product of the two 
> vectors is the cosine of the angle, and the cross-product gives the axis 
> (just need to normalize).
> 
> Then, to convert to quaternion, its pretty straightforward as well, but the 
> formula is found in (of many places) Axis-angle article or here.
> 
> There is also several libraries, if you can't find any for octave 
> specifically, written for Matlab may work with octave.  Some are GPL even, if 
> you are concerned about that.  Search for "quaternion for matlab"
> 
> Hope this helps.
> 
> On Tue, Apr 27, 2010 at 7:18 AM, Junqian Gordon Xu <address@hidden> wrote:
> I'm trying to find the rotation matrix or quaternion from two unit
> vectors A and B, then to apply the rotation to a third vector C.
> 
> I played with the quaternion package on octave-forge, but the
> documentation is not complete and the `demoquat` does not work well
> under 3.2.4.
> 
> My knowledge of quaternion is quite limited. Does anybody have any
> suggestion on how to achieve this easily in octave?
> 
> Thanks
> Gordon
> _______________________________________________


Also, if you want the rotation matrix rather than a quaternion (even though the 
two are equivalent global representations of rotations), then you can use 
Rodrigues formula.

% Get the axis and angle
angle = acos(v1'*v2);
axis = cross(v1,v2)/norm(cross(v1,v2));

% A skew symmetric representation of the normalized axis
axis_skewed = [ 0 -axis(3) axis(2) ; axis(3) 0 -axis(1) ; -axis(2) axis(1) 0];

% Rodrigues formula for the rotation matrix
R = eye(3) + sin(angle)*axis_skewed + (1-cos(angle))*axis_skewed*axis_skewed;

Hope this helps (may sure you add error checkin for the obvious problem cases).

John


reply via email to

[Prev in Thread] Current Thread [Next in Thread]