Пример скрипта для создания анимации в Blender на основе результатов расчётов

В проекте 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)

© 2023. All rights reserved.

Powered by Hydejack v9.1.6