假设我在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),则得出简并答案。