3d форум по Blender

Blender => Вопросы от новичков => Тема начата: flakonov от 08 Март 2017, 00:02:48

Название: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 08 Март 2017, 00:02:48
Добрый день.
Прошу прощения, если ошибся с выбором категории.
Использую Blender 2.78c. Есть модель руки человека с суставами. Есть 8 физических контроллеров (трехосевой гироскоп и трехосевой акселерометр в одном флаконе) для углов поворота в 8 точках (5 на пальцах, один на тыльной стороне ладони, один на запястье, один на предплечье, прикладываю картинку размещения датчиков).
Блендер принимает данные с помощью Python'a через COM-порт в формате CSV.
Нужно сделать так, чтобы модель руки повторяла движения самого человека.
Как решал:
1) Риггинг. И последующее соединение с мешем модели руки.
2) Properties-Constraints-Add object constrant-Limit Rotation. Для мешей.
Оба варианта хорошо связывают модель, задают в нужную структуру в режиме Pose Mode. Но в этом режиме не запустить Blender Engine. Переводишь в Object Mode, запускаешь - и все не работает, ограничения углов поворота не работают. Пробовал и через контроллеры и через актуаторы тестовые движения задавать на простой поворот по одной оси для одного сустава.
Вопрос:
1) Как можно сохранить структуру модели, используя Game Logic?

Прикладываю свой экспериментальный файл с примитивным суставом. (это не для анимации).
Заранее спасибо
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: Samovar от 08 Март 2017, 00:13:23
Я не вполне вкурил, что нужно... Но если надо BGE, то там работает только ограничитель Rigid Body Joint ( и он не работает вне движка BGE ) https://docs.blender.org/manual/en/dev/rigging/constraints/relationship/rigid_body_joint.html
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 08 Март 2017, 00:16:07
Я не вполне вкурил, что нужно...
Нужно сделать так, чтобы модель руки повторяла движения самого человека.

Человек надевает одежду с вшитыми датчиками, двигается, моделька в блендере повторяет.

Спасибо! Изучу и отпишусь
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: Samovar от 08 Март 2017, 00:50:18
Оставлю ещё ссылку на одну статью:
http://www.render.ru/books/show_book.php?book_id=638
http://render.ru/book/701
 (я особо не вникал в проблему.., но трекер в Блендере есть...)
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 08 Март 2017, 01:01:29
... тебе на выходе нужна анимация или обязательно bge? ...
... если это у тебя работает в режиме Pose Mode, то можно попробовать просто "обновлять экран" в этом режиме ...
... во вложении есть пример с кодом обновления ...
... попробуй запустить этот год из окна текстового редактора Blender клавишами (http://blender-3d.ru/keys/Alt.png)(http://blender-3d.ru/keys/P.png) ...


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

Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 08 Март 2017, 09:52:35
... некоторая модификация предыдущего скрипта ...
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 10 Март 2017, 13:15:34
Спасибо! Изучу и отпишусь
Уже лучше работает, но только в одной комбинации, когда ставлю Generic 6 DoF и ставлю ограничение угла, причем стоит выбрать Child Object и снова все не работает.

+если так связывать уже три объекта, то у центрального почему-то инерция появляется (30 вперед бежит, когда управлением двигаю, как остановлюсь - встает вровень). Центромасс у трех объектов в одном месте.
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 10 Март 2017, 13:20:04
Оставлю ещё ссылку на одну статью:
http://www.render.ru/books/show_book.php?book_id=638
http://render.ru/book/701
 (я особо не вникал в проблему.., но трекер в Блендере есть...)
изучу - отпишусь

... тебе на выходе нужна анимация или обязательно bge? ...
... если это у тебя работает в режиме Pose Mode, то можно попробовать просто "обновлять экран" в этом режиме ...
... во вложении есть пример с кодом обновления ...
... попробуй запустить этот год из окна текстового редактора Blender клавишами (http://blender-3d.ru/keys/Alt.png)(http://blender-3d.ru/keys/P.png) ...


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

На самом деле мне не так принципиально как именно достичь цели.
Суть:
Человек надел костюм, двигает рукой, модель руки в блендере повторяет.
Чтобы демку можно было показать, что контроллер руки работает корректно. данные я настроил, чтобы шли, осталось сделать так, чтобы конечности не разлетались из-за внутренней логики блендера.
Изучу - отпишусь.
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 10 Март 2017, 13:27:41
Оставлю ещё ссылку на одну статью:
http://www.render.ru/books/show_book.php?book_id=638
http://render.ru/book/701
 (я особо не вникал в проблему.., но трекер в Блендере есть...)
Изучил, это интересно, но не совсем то, что я ищу. У меня конечная цель не в анимировании, а демонстрации работы   физического контроллера (8 гироскопов+акселерометров). А там с камерами.
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 10 Март 2017, 13:30:32
>> Чтобы демку можно было показать, что контроллер руки работает корректно. данные я настроил, чтобы шли, осталось сделать так, чтобы конечности не разлетались из-за внутренней логики блендера.

... покажи код обработки контроллеров ...
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 10 Март 2017, 13:32:17
... некоторая модификация предыдущего скрипта ...

Очень интересно и многообещающе выглядит, мне нужно пару дней чтобы понять всю глубину идеи (я серьезно).
Обязательно отпишусь как смогу осмыслить присланное.
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 10 Март 2017, 13:36:15
>> Чтобы демку можно было показать, что контроллер руки работает корректно. данные я настроил, чтобы шли, осталось сделать так, чтобы конечности не разлетались из-за внутренней логики блендера.

... покажи код обработки контроллеров ...
у меня для одного гироскопа пока есть.
каждый датчик показывает изменение угловой скорости относительно своего состояния покоя.
Если плечо идет вверх, а кисть останется в покое, тогда плечо в модели "улетит"
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 10 Март 2017, 19:10:10
Код
     
    sp = re.split('[^0-9.-]+', line2)
    # оставляем только цифпы, точки и тире, а все остальное - разделители
    x = 0.017*float(sp[1])/40.0 # переводим в цифры
    y = 0.017*float(sp[2])/40.0 # перевлдим из градусов в радианы 0.017 коэффициент
    z = 0.017*float(sp[3])/40.0# 2000 - GyroRange. 360 - общее число градусов
... можешь более подробно прокомментировать формат данных? ...
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 10 Март 2017, 19:25:23
Код
     
    sp = re.split('[^0-9.-]+', line2)
    # оставляем только цифпы, точки и тире, а все остальное - разделители
    x = 0.017*float(sp[1])/40.0 # переводим в цифры
    y = 0.017*float(sp[2])/40.0 # перевлдим из градусов в радианы 0.017 коэффициент
    z = 0.017*float(sp[3])/40.0# 2000 - GyroRange. 360 - общее число градусов
... можешь более подробно прокомментировать формат данных? ...

микроконтроллер для одного гироскопа шлет данные раз в 50 мс в формате:
"gx, gy, gz\n"
re - очищает от всех символов и создаем массив из чисел
gx после этого находится в sp[1] и т.д.
сама формула чистой воды подгон, я поворачивал гироскоп и смотрел чтобы скорости с моделью совпадали. пытался обосновать, но не вышло.

GyroRange - это настройка на самом гироскопе, какой диапазон угловой скорости охватывать

re
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 10 Март 2017, 19:35:17
... у тебя где вся эта система установлена? в шаговой доступности? ...
... можешь засунуть все данные в один массив и сказать как они связаны с углами костей? ...
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 10 Март 2017, 19:44:25
... мне думается, что тут для пятничного вечера в целом полчаса работы :)  ...
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 10 Март 2017, 20:05:39
... у тебя где вся эта система установлена? в шаговой доступности? ...
... можешь засунуть все данные в один массив и сказать как они связаны с углами костей? ...
вообще в шаговой, но у меня сейчас уже 22 часа, я уже спать скоро буду.

датчики опрашиваются последовательно, т.к. они использую последовательную шину SPI.
формат для этого варианта таков:
"sensor_number,gx,gy,gz,ax,ay,az\n"

я просто с питоном на уровне новичка, с блендером тоже, на выходе суперновичок при пересечении этих факторов.
просить еще и комментарии написать к коду мне стремновато уже просить, но разобраться самому я думаю тут уже можно.
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 10 Март 2017, 20:24:53
>> "sensor_number,gx,gy,gz,ax,ay,az\n"
вот смотри, в модели есть кости:
bones = ['upper_arm','forearm','hand','thumb.01','palm.01','palm.02','palm.03','palm.04']

1) у тебя есть связь между sensor_number и идентификатором кости? то есть какой сенсор какой костью управляет?

bone.rotation_euler = xyz_euler_angle

2) у тебя есть для конкретной кости три угла xyz для установки euler_angle кости или тебе нужны другие углы?
 

Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 11 Март 2017, 05:32:20
Код
    readcom = cont.sensors["Read"] 
   
    line = s.readline() # берем одну строку
    line2 = str(line) # переводим в строку для питона (иначе не запускает)
     
    sp = re.split('[^0-9.-]+', line2)
    # оставляем только цифпы, точки и тире, а все остальное - разделители
... можешь показать что ходит по компорту? какие сырые данные? ...


Цитировать
каждый датчик показывает изменение угловой скорости относительно своего состояния покоя.
Если плечо идет вверх, а кисть останется в покое, тогда плечо в модели "улетит"

... у тебя есть математическая модель которая связывает угловые скорости гироскопа с положением кости? мне кажется здесь будет провал ...

Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 12 Март 2017, 11:36:35
>> "sensor_number,gx,gy,gz,ax,ay,az\n"
вот смотри, в модели есть кости:
bones = ['upper_arm','forearm','hand','thumb.01','palm.01','palm.02','palm.03','palm.04']

1) у тебя есть связь между sensor_number и идентификатором кости? то есть какой сенсор какой костью управляет?

bone.rotation_euler = xyz_euler_angle

2) у тебя есть для конкретной кости три угла xyz для установки euler_angle кости или тебе нужны другие углы?

1) Да, конкретные гироскопы к конкретной кости закрепляются
2) Есть фильтр меджвика, который в углы переводит угловые скорости, но я пока его не прикрутил
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 12 Март 2017, 11:41:53
Код
    readcom = cont.sensors["Read"] 
   
    line = s.readline() # берем одну строку
    line2 = str(line) # переводим в строку для питона (иначе не запускает)
     
    sp = re.split('[^0-9.-]+', line2)
    # оставляем только цифпы, точки и тире, а все остальное - разделители
... можешь показать что ходит по компорту? какие сырые данные? ...


Цитировать
каждый датчик показывает изменение угловой скорости относительно своего состояния покоя.
Если плечо идет вверх, а кисть останется в покое, тогда плечо в модели "улетит"

... у тебя есть математическая модель которая связывает угловые скорости гироскопа с положением кости? мне кажется здесь будет провал ...

line = s.readline()                        # 125.0,0.00,-2.75\n
line2 = str(line)                           # 125.0,0.00,-2.75\n
sp = re.split('[^0-9.-]+', line2)      #[125.0,0.00,-2.75]
x = 0.017*float(sp[1])/40.0          # 0.017*(125.0)/40.0
y = 0.017*float(sp[2])/40.0          # 0.017*(0.0)/40.0
z = 0.017*float(sp[3])/40.0          # 0.017*(-2.75)/40.0
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 12 Март 2017, 11:47:41
sp[0] = ''
пустой элемент
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: sungreen от 12 Март 2017, 15:35:50
Код
def rot_bone(name,bone_name,xyz_euler_angle):
    ob = bpy.data.objects[name]
    bone = ob.pose.bones[bone_name]
    bone.rotation_euler = xyz_euler_angle

def rig_update():
    bones = ['upper_arm','forearm','hand','thumb.01','palm.01','palm.02','palm.03','palm.04']
    for bone in bones:
        for store in ['.L','.R']:
            rot_bone('metarig',bone+store,[random.random()/5,random.random()/5,random.random()/5])


... вставь в rig_update код по обработке компортов ...
... если у тебя есть углы, попробуй вызывать rot_bone в этом обработчике для требуемого объекта, содержащего арматуру, заданной кости и углов ...
rot_bone('имя_объекта' ,'имя_кости',[x,y,z])

Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 12 Март 2017, 21:01:26
Код
def rot_bone(name,bone_name,xyz_euler_angle):
    ob = bpy.data.objects[name]
    bone = ob.pose.bones[bone_name]
    bone.rotation_euler = xyz_euler_angle

def rig_update():
    bones = ['upper_arm','forearm','hand','thumb.01','palm.01','palm.02','palm.03','palm.04']
    for bone in bones:
        for store in ['.L','.R']:
            rot_bone('metarig',bone+store,[random.random()/5,random.random()/5,random.random()/5])


... вставь в rig_update код по обработке компортов ...
... если у тебя есть углы, попробуй вызывать rot_bone в этом обработчике для требуемого объекта, содержащего арматуру, заданной кости и углов ...
rot_bone('имя_объекта' ,'имя_кости',[x,y,z])
завтра отпишусь ближе к вечеру
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 14 Март 2017, 11:45:05
по отдельности попробовал поуправлять - все работает.
сейчас почему-то Blender с COM портом бодается. Через питоновскую консоль запускаю первый раз команду на чтение. все ок. Закрываю порт. Снова не получается уже открыть порт, что-то продолжает удерживать, помогает только перезагрузка компа.
Так же не понял пока как один раз таким способом открыть порт, а когда нажимаю ESC то, чтобы порт сам закрывался.
(в версии Gyro.blend я открывал порт клавишей 'O', а закрывал 'C').
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 14 Март 2017, 11:45:43
Gyro делал на Windows 7, недавно на 10 перешел
Название: Re: Game Engine. Управление частями модели руки. Риггинг.
Отправлено: flakonov от 17 Март 2017, 11:29:41
Если кто-то будет подобное решать - в 10 винду есть процесс com surrogate.
он удерживает порт.

Прикладываю модифицированную версию, для чтения с COM порта данных для скелета. Закрытие порта происходит корректно после остановки выполнения скрипта и удержания порта не происходит.

если положение для каждой оси приходит в градусах - блендер при отправке все равно считает это за радианы. может это очевидно, но я не сразу понял.