Euler angles between two 3d vectors

僤鯓⒐⒋嵵緔 提交于 2019-12-03 07:12:29
Ali

As others have already pointed out, your question should be revised. Let's call your vectors a and b. I assume that length(a)==length(b) > 0 otherwise I cannot answer the question.


Calculate the cross product of your vectors v = a x b; v gives the axis of rotation. By computing the dot product, you can get the cosine of the angle you should rotate with cos(angle)=dot(a,b)/(length(a)length(b)), and with acos you can uniquely determine the angle (@Archie thanks for pointing out my earlier mistake). At this point you have the axis angle representation of your rotation.

The remaining work is to convert this representation to the representation you are looking for: Euler angles. Conversion Axis-Angle to Euler is a way to do it, as you have found it. You have to handle the degenerate case when v = [ 0, 0, 0], that is, when the angle is either 0 or 180 degrees.


I personally don't like Euler angles, they screw up the stability of your app and they are not appropriate for interpolation, see also

Vectasus

At first you would have to subtract vector one from vector two in order to get vector two relative to vector one. With these values you can calculate Euler angles.

To understand the calculation from vector to Euler intuitively, lets imagine a sphere with the radius of 1 and the origin at its center. A vector represents a point on its surface in 3D coordinates. This point can also be defined by spherical 2D coordinates: latitude and longitude, pitch and yaw respectively.

In order "roll <- pitch <- yaw" calculation can be done as follows:

To calculate the yaw you calculate the tangent of the two planar axes (x and z) considering the quadrant.

yaw = atan2(x, z) *180.0/PI;

Pitch is quite the same but as its plane is rotated along with yaw the 'adjacent' is on two axis. In order to find its length we will have to use the Pythagorean theorem.

float padj = sqrt(pow(x, 2) + pow(z, 2)); 
pitch = atan2(padj, y) *180.0/PI;

Notes:

  • Roll can not be calculated as a vector has no rotation around its own axis. I usually set it to 0.
  • The length of your vector is lost and can not be converted back.
  • In Euler the order of your axes matters, mix them up and you will get different results.
Sahil Kalra

Getting Rotation Matrix in MATLAB is very easy e.g.

A = [1.353553385,  0.200000003,  0.35]
B = [1 2 3]

[q] = vrrotvec(A,B)
Rot_mat = vrrotvec2mat(q)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!