Пример скрипта для создания анимации в Blender на основе результатов расчётов
in Механика
В проекте Blender создана следующая иерархия объектов:
- Empty1 (Empty)
- Body1 (Mesh)
- Empty2 (Empty)
- Body2 (Mesh)
import bpy
import math
import sys
import mathutils
import csv
import numpy as np
# Удаление существующей анимации:
# выделяем все объекты типа EMPTY (Add -> Empty -> Arrows)
bpy.ops.object.select_by_type(type='EMPTY')
# Удаляем, связанную с выделенными объектами анимацию
bpy.ops.anim.keyframe_clear_v3d()
bpy.ops.object.select_all(action='DESELECT')
# Формируем список объектов типа Empty по их именам - систем координат (СК)
obj = (bpy.data.objects['Empty1'], bpy.data.objects['Empty2'])
# Читаем данные из файла
data=np.loadtxt('C:\\Users\\user\\results.csv', delimiter=',')
nframes = data.shape[0]
for i in range(nframes):
# Тело 1
phi11 = data[i,1]
phi12 = data[i,2]
# Матрицы элементарных поворотов СК 1
A1 = mathutils.Matrix.Rotation(phi11, 4, 'X')
A2 = mathutils.Matrix.Rotation(phi12, 4, 'Y')
# Матрица сложного поворота
# преобразование координат из СК 0 в СК 1
A01 = np.transpose(np.dot(A1,A2))
# Сохраняем "кадр" анимации
# Поворот СК
obj[0].matrix_local = A01
obj[0].keyframe_insert(data_path='rotation_euler',frame=i)
# Положение СК
obj[0].location = mathutils.Vector((0.0,0.0,0.0))
obj[0].keyframe_insert(data_path='location', frame=i)
# Тело 2
phi21 = data[i,3]
# Матрицы элементарных поворотов СК 2 относительно СК 1
A1 = mathutils.Matrix.Rotation(phi21, 4, 'X')
# Матрица сложного поворота из СК 1 в СК 2
A12 = np.transpose(A1)
# Поворот СК
obj[1].matrix_local = A12
obj[1].keyframe_insert(data_path='rotation_euler',frame=i)
# Положение СК
obj[1].location = mathutils.Vector((0.0,0.0,-1.0))
obj[1].keyframe_insert(data_path='location', frame=i)