Автор Тема: Game Engine. Управление частями модели руки. Риггинг.  (Прочитано 4176 раз)

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
... мне думается, что тут для пятничного вечера в целом полчаса работы :)  ...
Для Кота

Оффлайн flakonov

  • Житель
... у тебя где вся эта система установлена? в шаговой доступности? ...
... можешь засунуть все данные в один массив и сказать как они связаны с углами костей? ...
вообще в шаговой, но у меня сейчас уже 22 часа, я уже спать скоро буду.

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

я просто с питоном на уровне новичка, с блендером тоже, на выходе суперновичок при пересечении этих факторов.
просить еще и комментарии написать к коду мне стремновато уже просить, но разобраться самому я думаю тут уже можно.

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
>> "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 кости или тебе нужны другие углы?
 

Для Кота

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Код
    readcom = cont.sensors["Read"] 
   
    line = s.readline() # берем одну строку
    line2 = str(line) # переводим в строку для питона (иначе не запускает)
     
    sp = re.split('[^0-9.-]+', line2)
    # оставляем только цифпы, точки и тире, а все остальное - разделители
... можешь показать что ходит по компорту? какие сырые данные? ...


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

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

Для Кота

Оффлайн flakonov

  • Житель
>> "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) Есть фильтр меджвика, который в углы переводит угловые скорости, но я пока его не прикрутил

Оффлайн flakonov

  • Житель
Код
    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

Оффлайн flakonov

  • Житель
sp[0] = ''
пустой элемент

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Код
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])

Для Кота

Оффлайн flakonov

  • Житель
Код
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])
завтра отпишусь ближе к вечеру

Оффлайн flakonov

  • Житель
по отдельности попробовал поуправлять - все работает.
сейчас почему-то Blender с COM портом бодается. Через питоновскую консоль запускаю первый раз команду на чтение. все ок. Закрываю порт. Снова не получается уже открыть порт, что-то продолжает удерживать, помогает только перезагрузка компа.
Так же не понял пока как один раз таким способом открыть порт, а когда нажимаю ESC то, чтобы порт сам закрывался.
(в версии Gyro.blend я открывал порт клавишей 'O', а закрывал 'C').

Оффлайн flakonov

  • Житель
Gyro делал на Windows 7, недавно на 10 перешел

Оффлайн flakonov

  • Житель
Если кто-то будет подобное решать - в 10 винду есть процесс com surrogate.
он удерживает порт.

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

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

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 90
Автор: LEXA ANЭGROWND
blender.png
Скачано: 97
Автор: ipv2007
4.png
Скачано: 127
Автор: hiroyukiss
2.png
Скачано: 146
Автор: hiroyukiss

Скачано: 156
Автор: Dilifa12