我在 3D 空间中有点,我找到了重心 (CG(,我想将这些点沿着通过 CG 并平行于 Z 轴的矢量旋转一定角度(假设 30 度(。
我找到了 CG 并定义了平行于 Z 轴通过该 CG 的轴。我在某个博客上找到的代码段如下所示,但我进行了一些修改。
def rotation_matrix(angle, direction, point):
"""Return matrix to rotate about axis defined by point and direction.
"""
sina = math.sin(angle)
cosa = math.cos(angle)
direction = unit_vector(direction[:3])
# rotation matrix around unit vector
R = numpy.diag([cosa, cosa, cosa])
R += numpy.outer(direction, direction) * (1.0 - cosa)
direction *= sina
R += numpy.array([[ 0.0, -direction[2], direction[1]],
[ direction[2], 0.0, -direction[0]],
[-direction[1], direction[0], 0.0]])
M = numpy.identity(4)
M[:3, :3] = R
if point is not None:
# rotation not around origin
point = numpy.array(point[:3], dtype=numpy.float64, copy=False)
M[:3, 3] = point - numpy.dot(R, point)
return M
实际结果并没有像我预期的那样旋转点。我要旋转的矢量垂直于 XY 平面并平行于 Z 轴。这段代码正在向其他方向旋转点,我无法弄清楚。
数据的 CG 是 ::
cg = 0.5631200, 0.6244500, 0.0852599
定义的向量如下:
v_tail = np.array([x_c, y_c, 0.0])
v_head = np.array([x_c, y_c, z_c])
v = v_head - v_tail
vector v = [0. 0. 0.08526]
我尝试旋转的点的 x、y、z 坐标如下:
x y z
0 0.59046 0.62928 0.07307
1 0.59021 0.62943 0.07376
2 0.58970 0.62961 0.07333
3 0.58997 0.62907 0.07220
4 0.59081 0.62902 0.07266
也许您的代码片段尝试实现罗德里格斯的旋转,但有一些错误(我对 numpy 不太熟悉发现错误(
但是对于给定的情况,有更简单的方法:
要围绕此类轴制作旋转矩阵,您需要执行以下步骤:
-matrix of translation by (-cg.x, -cg.y, 0) T
-matrix of rotation around z-axis by angle R
-matrix of backward translation by (cg.x, cg.y, 0) BT
生成的矩阵为
M = T * R * BT