最小化距离的旋转矩阵

时间:2009-10-25 14:28:26

标签: math 3d geometry

假设我在3D空间中有两个点(a和b)以及一个名为n的固定轴/单位向量。

我想创建一个旋转矩阵,最小化a点(未旋转)和旋转点b之间的欧几里德距离。

例如:

 Q := matrix_from_axis_and_angle (n, alpha);

 find the unknown alpha that minimizes sqrt(|a - b*Q|)

顺便说一句 - 如果使用单位四元数更容易表达解决方案/算法,请继续使用它们。我只是使用矩阵来表达我的问题,因为它们被更广泛地使用。


哦 - 我知道有一些堕落的案例(a或b完全符合这一点。)这些可以忽略。我只是在寻找可以计算单个解决方案的情况。

4 个答案:

答案 0 :(得分:5)

听起来相当容易。假设单位矢量n意味着围绕平行于n到点x0的线旋转。如果x0!=原点,则将坐标系转换为-x0,以获得相对于新坐标系原点0的点a'b',并使用这两个点代替a和b。

1)计算向量ry = n x a

2)计算单位向量uy =方向ry

的单位向量

3)计算单位向量ux = uy x n

现在你有一个相互垂直的单位向量ux,uy和n的三元组,形成一个右手坐标系。可以证明:

 a = dot(a,n) * n  +  dot(a,ux) * ux

这是因为单位矢量uy与ry平行,ry垂直于a和n。 (来自第1步)

4)沿单位向量ux,uy计算b的分量。 a的分量是(ax,0),其中ax = dot(a,ux)。 b的分量是(bx,by)其中bx = dot(b,ux),by = dot(b,uy)。由于右手坐标系统,ax总是正的,所以你实际上并不需要计算它。

5)计算theta = atan2(by,bx)。

您的旋转矩阵是围绕n轴以相对于坐标系(ux,uy,n)的角度-theta旋转的旋转矩阵。

如果a与n平行(步骤1和2)或者b与n平行(步骤4,5),则会产生简并答案。

答案 1 :(得分:2)

我认为你可以将问题改为:

在3d空间中从点到2d圆的距离是多少。

答案可以找到here

所以需要的步骤如下:

  • 围绕矢量n旋转点b,在3d空间中为您提供2d圆
  • 使用上述方法,找到到该圆圈的距离(以及圆圈上的点)
  • 圆圈上的点是您要查找的旋转点。
  • 推导出旋转角度

......或者某事; ^)

答案 2 :(得分:2)

当从a到n的向量的向量与从b到n的向量的向上对齐时,距离将被最小化。

将a和b投影到垂直于n的平面中,并在2维中解决问题。你到达那里的旋转是你需要的旋转,以尽量减少距离。

答案 3 :(得分:2)

设P是垂直于n的平面。 我们可以找到a到P平面的投影(并且类似于b):

a' = a - (dot(a,n)) n 
b' = b - (dot(b,n)) n 

其中dot(a,n)是a和n

的点积

a'和b'位于P平面。

我们现在已将问题缩小为2维。耶!

'和'之间的角度(旋转)等于围绕n轴摆动b所需的角度(旋转),以便最接近a。 (想想B将投射在P平面上的阴影)。

很容易找到'和b'之间的角度:

dot(a',b') = |a'| * |b'| * cos(theta)

解决theta。

现在你可以在这里找到给定theta和n的旋转矩阵: http://en.wikipedia.org/wiki/Rotation_matrix

杰森S正确地指出,一旦你知道了θ,你仍然必须决定顺时针或逆时针绕n轴旋转b。

如果(a x b)与n位于同一方向,则数量,点((a x b),n)将为正数,如果(a x b)位于相反方向,则为负数。 (只要a和b都与n共线,它就永远不为零。)

如果(a x b)与n的方向相同,则b必须顺时针旋转角度θ绕n轴。

如果(a x b)位于相反方向,则b必须顺时针旋转角度-theta绕n轴。