# Calculate Euler rotation angles between 2 points

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

## 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 towardsyaw = 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 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.

1. 1
2. 2
Rutin
24
3. 3
4. 4
JoeJ
18
5. 5

• 14
• 17
• 11
• 11
• 9
• ### Forum Statistics

• Total Topics
631758
• Total Posts
3002155
×