如果重心已知,如何在 3D 空间中沿 Z 方向按特定角度旋转(顺时针或逆时针)点



我在 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

相关内容

  • 没有找到相关文章

最新更新