Последовательный сигнал от Arduino к блендеру - PullRequest
0 голосов
/ 03 июня 2019

У меня есть анимация (просто объект, который меняет позиции), созданный с помощью Blender, и я хотел бы начать воспроизведение анимации, когда я нажимаю кнопку на Arduino. Я новичок в Python и пытаюсь понять это.

Я сделал соединение с Arduino, и оно работает.

Вот код Python:

#part of the code was found from Olav3D tutorials on youtube"
import serial
import bpy

try:
    serial = serial.Serial("COM3", 9600, timeout = 10)
    print("Connection succeed")
except:
    print("Connection failed")

positions = (5,0,-2), (0,0,2), (0,0,5), (0,0,1), (0,0,7), (0,0,5)


ob = bpy.data.objects['Sphere']
frame_num = 0

x = serial.read(size=1)

for position in positions:
        bpy.context.scene.frame_set(frame_num)
        ob.location = position
        ob.keyframe_insert(data_path="location",index=-1)
        frame_num+=20
        print("Next position---")

Когда я нажимаю «Run Script», кажется, что все работает, я вижу соединение и появляются сообщения о следующей позиции, но моя Сфера не движется. Может кто-нибудь объяснить мне, почему сфера не движется и как я могу добиться запуска анимации, когда я нажимаю кнопку? Что я должен добавить, чтобы это произошло?

1 Ответ

0 голосов
/ 05 июня 2019

Пока работает скрипт, результат не тот, который вам нужен.Скрипт просто создает несколько ключевых кадров для сферы.Хотя он читает (один раз) последовательный вход, он ничего с этим не делает, поэтому нет ответа на нажатие кнопки.

Чтобы ответить на вход от arduino, вам необходимо постоянно читать последовательный входи выберите действие, основанное на этом входном сигнале.

Теоретически, то, что вы хотите, выглядит примерно так:

while True:
    x = serial.read(size=1)
    if x == 'p':
        # this will play/pause
        bpy.ops.screen.animation_play()

Недостатком является то, что этот цикл захватит блендер и предотвратит любые обновления окна.Чтобы обойти это, вы можете поместить шаги цикла в модальный оператор, blender будет неоднократно вызывать модальный метод в операторе и обновлять экран между каждым вызовом.

Начиная с модального оператора шаблон , включенный в blender, измените модальный метод на что-то вроде

def modal(self, context, event):
    x = serial.read(size=1)
    if x == 'p':
        # this will play/pause
        bpy.ops.screen.animation_play()
    if x == 's':
        bpy.ops.screen.animation_cancel()
    if event.type == 'ESC':
        # press esc to stop the operator
        return {'CANCELLED'}
    return {'RUNNING_MODAL'}

Более подробные примеры взаимодействия с arduino можно найти по адресу blender.stackexchange

...