Posted 22 October 2010 - 06:14 PM

I have also been doing a lot a research on the internet about that topic. I'm currently looking for a way to do this with QUATERNIONS and I decided to post that here instead of starting a new thread since it's basicaly the same question but with another system.

So here's what I currently found:

------------------------------------------------------------

//Given two vectors, find the angle difference between them in quaternion

vector $V1 = << my first vector >>;

vector $V2 = << my second vector >>;

float $d = dot($V1, $V2);

vector $axis = cross($V1, $V2);

float $W = sqrt(norm($V1) * norm($V1) * norm($V2) * norm($V2) + $d);

float $X = ($axis.x);

float $Y = ($axis.y);

float $Z = ($axis.z);

// So my quaternion is now $X, $Y, $Z, $W ... transform that in a vector

vector $xyz = << $X, $Y, $Z >>;

vector $result = (2 * $W*$W -1)*$V1 + 2*dot($V1,$xyz)*$xyz + 2 * $W * cross($V1,$xyz);

// $result is my resulting vector

------------------------------------------------------------

It's weird because this is almost working, if I rotate on vector on a specific axis in relation to my other vector, the resulting vector seems to rotate correctly but all other axis won't work ! It gives awkward results. But if I move my two vectors as if they were stick one to the other, the resulting vector will react as if it was stick to my 2 vectors. So I think I'm not doing something correct here but I just don't know what.

And finally, here's the same thing with euler angles. I got it to work but I wanted a more optimized method.

// Calculate Euler rotation angles between 2 vectors .. we use Rodrigues formula

vector $V1 = << my first vector >>;

vector $V2 = << my second vector >>;

vector $axis;

float $angle;

$angle = acos($V1*$V2);

$axis = normalizeVector((cross($V1,$V2)));

matrix $axis_skewed[3][3] = <<

0, (-$axis.z), ($axis.y) ;

($axis.z), 0, (-$axis.x) ;

(-$axis.y), ($axis.x), 0 >>;

matrix $eye3[3][3] = <<

1, 0, 0;

0, 1, 0;

0, 0, 1 >>;

// here's Rodrigues

$R = $eye3 + sin($angle)*$axis_skewed + (1-cos($angle))*$axis_skewed*$axis_skewed;

matrix $vectorMatr[3][1];

$vectorMatr[0][0] = ($V1.x);

$vectorMatr[1][0] = ($V1.y);

$vectorMatr[2][0] = ($V1.z);

// $result is the resulting vector

$result = ($R * $vectorMatr);

----------------------------------------------------

In conclusion, my quaternion method is still not working but seems more promising than my other method which is working but might be slow. I'm looking for a better solution.