Как оживить движение и вращение нескольких объектов? - PullRequest
0 голосов
/ 19 октября 2019

У меня есть дрон, состоящий из нескольких объектов. Проблема в том, что когда я вращаю дрон и перемещаю его в какую-то другую точку, он теряет свою форму (разрывается на части), каждая часть дрона отсоединяется от основного корпуса. Как я могу вращать и перемещать беспилотник, не теряя его форму?

Я пытался сделать тело беспилотника родителем всех фигур. Это работает, когда я только вращаю или двигаю тело. config

import math
import bpy
import mathutils
import subprocess as sp
from math import sqrt, degrees, acos, pow

sp.call('cls', shell=True)

drone_objects_names = ['Cube.008', 'Cylinder.007', 'Cube.007', 'Cube.006', 'Sphere.005', 'Sphere.004', 'Cylinder.008',
                       'Sphere.003', 'Cylinder.006', 'Cube.005', 'Cube.004', 'Sphere.002', 'Cylinder.005', 'Sphere.001',
                       'Cylinder.004', 'Sphere', 'Cylinder.003', 'Cube.003', 'Cylinder.002', 'Cylinder.001', 'Cube.002',
                       'Cube.001', 'Cylinder', 'Cube']

X = 10
Y = 10
Z = 5

frame_num = 0
teta = 0

factor = 0.97


def set_keyframe():
    for object_name in drone_objects_names:
        bpy.data.objects[object_name].keyframe_insert(data_path="location", index=-1)


def send_drone_to_center():
    move_drone(-bpy.data.objects['Cylinder.003'].location)


def select_drone():
    for object_name in drone_objects_names:
        bpy.data.objects[object_name].select_set(True)


def move_drone(v):
    bpy.ops.transform.translate(value=v)


def angle_between_z(vc, uc):
    nominator = vc[0] * uc[0] + vc[2] * uc[2]
    denominator = sqrt(pow(vc[0], 2) + pow(vc[2], 2)) * sqrt(pow(uc[0], 2) + pow(uc[2], 2))
    return acos(nominator / denominator)


def angle_between_y(vc, uc):
    nominator = vc[0] * uc[0] + vc[2] * uc[2]
    denominator = sqrt(pow(vc[0], 2) + pow(vc[2], 2)) * sqrt(pow(uc[0], 2) + pow(uc[2], 2))
    return acos(nominator / denominator)


def do_step():
    global factor, teta, frame_num, X, Y, Z
    factor = 0.97

    x_new = X * math.cos(math.radians(teta))
    y_new = Y * math.sin(math.radians(teta))

    bpy.context.scene.frame_set(frame_num)

    move_drone(-bpy.data.objects['Cylinder.003'].location)
    move_drone((x_new, y_new, Z * factor))

    angle = angle_between_z((x_new, y_new, Z * factor), (X, Y, Z))
    bpy.data.objects['Cylinder.003'].rotate_euler[2] = angle

    set_keyframe()

    frame_num += 3

    X *= factor
    Y *= factor
    Z *= factor
    teta += 10


select_drone()
send_drone_to_center()
move_drone((X, Y, Z))

while math.sqrt(X * X + Y * Y + Z * Z) > 1:
    do_step()
    e = bpy.data.objects['Cylinder.003'].location
    print(X, Y, e[0], e[2])

bpy.context.scene.frame_end = frame_num

Я ожидаю, что дрон окажется в центре референции, не потеряв свою форму ... Дрон потеряет свою форму

Дрон, который я использую в этом проекте (если вы хотите попробовать его ...): Дрон

1 Ответ

0 голосов
/ 20 октября 2019

Ваш сценарий применяет одно и то же движение к каждой части дрона. Будучи дочерним объектом, расположение объектов относительно родительского объекта: путем изменения местоположения дочернего объекта он перемещается от родительского объекта, который также перемещается.

Либо удалите родительский элемент, либо только анимируйтеродительский объект.

...