假设我在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完全符合等等).这些可以忽略.我只是在寻找可以计算单个解决方案的情况.
听起来相当容易.假设单位矢量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),则会产生简并答案.