【发布时间】:2017-12-21 21:58:19
【问题描述】:
我有两个独立的 3D 数据点向量来表示曲线,我正在使用 matplotlib 将它们绘制为 3D 图中的散点数据。
两个向量都从原点开始,并且都是单位长度。曲线彼此相似,但是,两条曲线之间通常存在旋转(出于测试目的,我实际上使用了一条曲线并对其应用旋转矩阵来创建第二条曲线)。
我想对齐两条曲线,以便它们在 3D 中对齐,例如旋转曲线 b,使其起点和终点与曲线 a 对齐。我一直在尝试通过从第一个点中减去最后一点来获得一个方向向量,该向量表示从每条曲线的起点到终点的直线,将它们转换为单位向量,然后计算叉积和点积和使用此答案 (https://math.stackexchange.com/a/476311/357495) 中概述的方法来计算旋转矩阵。
但是,当我这样做时,计算出的旋转矩阵是错误的,我不确定为什么?
我的代码如下(我使用的是 Python 2.7):
# curve_1, curve_2 are arrays of 3D points, of the same length (both start at the origin)
curve_vec_1 = (curve_1[0] - curve_1[-1]).reshape(3,1)
curve_vec_2 = (curve_2[index][0] - curve_2[index][-1]).reshape(3,1)
a,b = (curve_vec_1/ np.linalg.norm(curve_vec_1)).reshape(3), (curve_vec_2/ np.linalg.norm(curve_vec_2)).reshape(3)
v = np.cross(a,b)
c = np.dot(a,b)
s = np.linalg.norm(v)
I = np.identity(3)
vXStr = '{} {} {}; {} {} {}; {} {} {}'.format(0, -v[2], v[1], v[2], 0, -v[0], -v[1], v[0], 0)
k = np.matrix(vXStr)
r = I + k + np.square(k) * ((1 -c)/(s**2))
for i in xrange(item.shape[0]):
item[i] = (np.dot(r, item[i]).reshape(3,1)).reshape(3)
在我的测试用例中,曲线 2 只是曲线 1,应用了以下旋转矩阵:
[[1 0 0 ]
[ 0 0.5 0.866]
[ 0 -0.866 0.5 ]]
(仅绕 x 轴旋转 60 度)。
我的代码计算的再次对齐两个向量的旋转矩阵是:
[[ 1. -0.32264329 0.27572962]
[ 0.53984249 1. -0.35320293]
[-0.20753816 0.64292975 1. ]]
两条原始曲线的方向向量图(a 和 b 分别为蓝色和绿色)以及 b 用计算的旋转矩阵(红色)变换的结果如下。我正在尝试计算旋转矩阵以将绿色矢量与蓝色对齐。
【问题讨论】:
-
你也可以围绕平均向量旋转180度,它不需要叉或内积。
标签: python python-2.7 numpy 3d rotational-matrices