Ошибка при работе со смещением. Компьютерная графика
Пытаюсь отрисовать поднимающуюся руку при помощи самописных примитивов и матрицы поворота. Без смещения delta_2 (смещение точки, вокруг которой должен выполняться поворот) фигура поворачивается верно, но когда я пытаюсь выполнить поворот относительно смещенной точки, происходит смещение без поворота. Не понимаю, что я упустил.
В отрисовке примитивов/кривых, функции поворота ошибок нет. Также в цикле есть правильное смещение (1 вложенный цикл), там я смещаю ладонь относительно конца предплечья
Точки примитивов:
elbow = [
np.array([137, 394]),
np.array([45, 251]),
np.array([42, 65]),
np.array([65, 8]),
np.array([196, 52]),
np.array([126, 42]),
np.array([186, 90]),
np.array([215, 399]),
np.array([199, 381]),
np.array([140, 392])
]
fing_1_fal_1 = [
np.array([120, 218]),
np.array([132, 119]),
np.array([233, 59]),
np.array([384, 53]),
np.array([381, 222]),
np.array([259, 224]),
np.array([247, 140]),
np.array([148, 273]),
np.array([118, 219])
]
fing_1_fal_2 = [
np.array([148, 205]),
np.array([114, 129]),
np.array([197, 167]),
np.array([264, 148]),
np.array([258, 61]),
np.array([325, 228]),
np.array([142, 233]),
np.array([149, 205])
]
Мой код:
for i in range(80): #количество кадров
elbow_modif = [rotate_around_point_matrix(p, -np.pi / 180, 753, 361) for p in elbow_modif]
new_palm_modif = []
new_palm_stroke_modif = []
new_fing_1_fal_1_modif = []
pivot_old_1 = (783, 692) # конец предплечья - точка вращения ладони
pivot_old_2 = (841, 695)
pivot_new_1 = rotate_around_point_matrix(pivot_old_1, -np.pi / 180, 753, 361)
pivot_new_2 = rotate_around_point_matrix(pivot_old_2, -np.pi / 180, 753, 361)
delta_1 = pivot_new_1 - pivot_old_1
delta_2 = pivot_new_2 - pivot_old_2
for p1, p2 in zip(palm_modif, palm_stroke_modif):
new_p1 = rotate_around_point_matrix(p1, -np.pi / 180, 783, 692) + delta_1
new_palm_modif.append(new_p1)
new_p2 = rotate_around_point_matrix(p2, -np.pi / 180, 783, 692) + delta_1
new_palm_stroke_modif.append(new_p2)
for p in fing_1_fal_1_modif:
p_shifted = p + delta_2
new_p = rotate_around_point_matrix(p_shifted, -np.pi / 180, pivot_new_2[0], pivot_new_2[1])
if i % 5 == 0:
new_p = rotate_around_point_matrix(new_p, -np.pi / 180 * 2, pivot_new_2[0], pivot_new_2[1])
new_fing_1_fal_1_modif.append(new_p)
pivot_old_1 = pivot_new_1
pivot_old_2 = pivot_new_2
palm_modif = new_palm_modif
palm_stroke_modif = new_palm_stroke_modif
fing_1_fal_1_modif = new_fing_1_fal_1_modif