У меня есть точки в трехмерном пространстве, и я нашел центр тяжести (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