最小化距离的旋转矩阵

Nil*_*nck 4 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|)
Run Code Online (Sandbox Code Playgroud)

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


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

Jas*_*n S 5

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

1)计算向量ry = nxa

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

3)计算单位向量ux = uy xn

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

 a = dot(a,n) * n  +  dot(a,ux) * ux
Run Code Online (Sandbox Code Playgroud)

这是因为单位矢量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)旋转角度θ的旋转矩阵.

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