假设我在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完全符合这一点。)这些可以忽略。我只是在寻找可以计算单个解决方案的情况。
答案 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
所以需要的步骤如下:
......或者某事; ^)
答案 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轴。