假设我在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恰好与n等)。这些情况可以忽略。我只是在寻找可以计算单个解决方案的情况。

最佳答案

听起来很容易。假设单位矢量n表示通过点x0绕平行于n的线旋转。如果x0!=原点,则通过-x0转换坐标系以获得相对于新坐标系原点0的点a'b',并使用这2个点代替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 =点(a,ux)。 b的成分是(bx,by),其中bx = dot(b,ux),by = dot(b,uy)。由于右手坐标系,ax始终为正,因此您实际上不需要计算它。

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

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

如果a与n平行(步骤1和2)或b与n平行(步骤4、5),则得出简并答案。

09-25 18:21