Я не вполне вкурил, что нужно...
Нужно сделать так, чтобы модель руки повторяла движения самого человека.Человек надевает одежду с вшитыми датчиками, двигается, моделька в блендере повторяет.
Спасибо! Изучу и отпишусьУже лучше работает, но только в одной комбинации, когда ставлю Generic 6 DoF и ставлю ограничение угла, причем стоит выбрать Child Object и снова все не работает.
Оставлю ещё ссылку на одну статью:изучу - отпишусь
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) ...
... то есть суть - по таймеру считываешь новые значения углов, выставляешь их для костей, обновляешь экран ...
Оставлю ещё ссылку на одну статью:Изучил, это интересно, но не совсем то, что я ищу. У меня конечная цель не в анимировании, а демонстрации работы физического контроллера (8 гироскопов+акселерометров). А там с камерами.
http://www.render.ru/books/show_book.php?book_id=638
http://render.ru/book/701
(я особо не вникал в проблему.., но трекер в Блендере есть...)
... некоторая модификация предыдущего скрипта ...
>> Чтобы демку можно было показать, что контроллер руки работает корректно. данные я настроил, чтобы шли, осталось сделать так, чтобы конечности не разлетались из-за внутренней логики блендера.у меня для одного гироскопа пока есть.
... покажи код обработки контроллеров ...
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 - общее число градусов
Код... можешь более подробно прокомментировать формат данных? ...
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 - общее число градусов
... у тебя где вся эта система установлена? в шаговой доступности? ...вообще в шаговой, но у меня сейчас уже 22 часа, я уже спать скоро буду.
... можешь засунуть все данные в один массив и сказать как они связаны с углами костей? ...
readcom = cont.sensors["Read"]
line = s.readline() # берем одну строку
line2 = str(line) # переводим в строку для питона (иначе не запускает)
sp = re.split('[^0-9.-]+', line2)
# оставляем только цифпы, точки и тире, а все остальное - разделители
каждый датчик показывает изменение угловой скорости относительно своего состояния покоя.
Если плечо идет вверх, а кисть останется в покое, тогда плечо в модели "улетит"
>> "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 кости или тебе нужны другие углы?
Код... можешь показать что ходит по компорту? какие сырые данные? ...readcom = cont.sensors["Read"]
line = s.readline() # берем одну строку
line2 = str(line) # переводим в строку для питона (иначе не запускает)
sp = re.split('[^0-9.-]+', line2)
# оставляем только цифпы, точки и тире, а все остальное - разделителиЦитироватькаждый датчик показывает изменение угловой скорости относительно своего состояния покоя.
Если плечо идет вверх, а кисть останется в покое, тогда плечо в модели "улетит"
... у тебя есть математическая модель которая связывает угловые скорости гироскопа с положением кости? мне кажется здесь будет провал ...
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])
завтра отпишусь ближе к вечеруКод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])