Как повернуть (по часовой стрелке или против часовой стрелки) точки на определенный угол в трехмерном пространстве вдоль направления Z, если известен центр тяжести? - PullRequest
0 голосов
/ 31 марта 2019

У меня есть точки в трехмерном пространстве, и я нашел центр тяжести (CG), и я хочу повернуть эти точки на некоторый угол (предположим, 30 градусов) вдоль вектора, проходящего через CG и параллельного оси Z.

Я нашел CG и определил ось, проходящую через этот CG параллельно оси Z.Сегмент кода, который я нашел в каком-то блоге, показан ниже, но я немного изменил.

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

1 Ответ

0 голосов
/ 01 апреля 2019

Возможно, ваш фрагмент кода пытается реализовать вращение Родригеса , но с некоторыми ошибками (я не настолько знаком с 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
...