欧拉两个3D矢量之间的角度(Euler angles between two 3d vectors)

2019-08-17 05:19发布

你怎么找到2个3D矢量之间的3个欧拉角? 当我有一个载体,我想它的旋转,这个环节通常可以使用: 计算旋转一下三维点?

但如何根据彼此计算他们当我做到这一点?

Answer 1:

正如其他人已经指出的那样,你的问题应该加以修订。 让我们把你的向量ab 。 我假定length(a)==length(b) > 0 ,否则我不能回答这个问题。


计算叉积的矢量的v = axb ; v给出旋转轴线 。 通过计算点积 ,就可以得到角度的余弦你应该旋转cos(angle)=dot(a,b)/(length(a)length(b)) ,并用acos可以唯一地确定的角度(@Archie感谢您指出我的错误更早)。 在这一点上你有你的旋转轴的角度表示

剩下的工作就是这个表示转换成你正在寻找的表示:欧拉角。 转换的轴心角度欧拉是一个办法做到这一点,因为你已经找到了。 你有当处理退化情况v = [ 0, 0, 0]即,当角度为0或180度。


我个人不喜欢欧拉角,他们搞砸了你的应用程序的稳定性,他们是不适合的内插,也见

  • 与Android方向传感器奇怪的行为

  • 旋转矩阵之间的插值



Answer 2:

起初,你将不得不为了得到相对矢量两至矢量一个从向量2减去载体之一。 有了这些值,可以计算出欧拉角。

为了理解从矢量欧拉计算直观地,让想象为1半径,并且在其中心为原点的球体。 甲矢量表示在三维坐标在其表面上的一个点。 分别纬度和经度,俯仰和偏航:也可以通过球形2D来定义此点坐标。

为了“滚< - 俯仰< - 偏航”的计算可如下完成:

要计算你算算考虑象限的两个平面坐标轴(x和z)的切线偏航。

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

间距是相当的相同,但作为它的平面与偏转沿着旋转的“相邻”是在两个轴。 为了找到它的长度,我们将不得不使用勾股定理。

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

笔记:

  • 卷不能计算为载体具有绕自身轴线不进行旋转。 我通常将其设置为0。
  • 您的向量的长度丢失,无法转换回来。
  • 在欧拉您轴事项的顺序,将它们混合起来,你会得到不同的结果。


Answer 3:

获取旋转矩阵在MATLAB是很容易如

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

[q] = vrrotvec(A,B)
Rot_mat = vrrotvec2mat(q)


文章来源: Euler angles between two 3d vectors