• Advertisement
Sign in to follow this  

Calculate Euler rotation angles between 2 points

This topic is 2648 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I need to calculate the 3 Euler angles (yaw, pitch, roll) between 2 points.

The picture below shows the way I rotate. These are the angles I need to calculate.
(The only difference is I'm rotating the object in the order X,Y,Z and not Z,Y,X)


This is the code I'm using but its not working for me:

// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )

[Edited by - Jenko on October 22, 2010 10:04:08 PM]

Share this post

Link to post
Share on other sites
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.

Share this post

Link to post
Share on other sites
mfiorilli, thanks for the Euler method.

Do I assume correctly that the resultant vector stores the X and Y euler rotations into the vector's x and y properties?

However since I'm not programming this in C++ nor do I have your vector library, I'm having some trouble understanding what you've done here:

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

// do you add all the properties of the eye3 matrix?
// do you multiply with all the properties of the axis_skewed matrix?
// etc..
// and what is R? a vector or matrix? or number?

and here:

$result = ($R * $vectorMatr);

// do you multiply the vector with the matrix to get the resultant vector using standard matrix multiplying?

If you could post your matrix/vector library I could use its code since my platform does not compute operators (* / + -) and call functions behind the scenes.

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement