你怎么找到2个3D矢量之间的3个欧拉角? 当我有一个载体,我想它的旋转,这个环节通常可以使用: 计算旋转一下三维点?
但如何根据彼此计算他们当我做到这一点?
Answer 1:
正如其他人已经指出的那样,你的问题应该加以修订。 让我们把你的向量a
和b
。 我假定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