Автор Тема: Небходима помощь по написанию экспрта в свой формат на языке Python.  (Прочитано 24654 раз)

Оффлайн LanuHum

  • Житель
Присмотрелся к этому коду повнимательнее, попробовал. Ошибок не выдает но почему то  lenfaces всегда 0. Поясните пожалуйста что я мог сделать не так.
У тебя написано calc_tessface=True? Ноль будет, если calc_tessface= False
Цитировать
Выцепил из стороннего кода работу с uv развертками
Опять 25...
Ищи автора этого кода и пытай его. :) :) :)

Оффлайн Bulbash

  • Житель
Новый вопрос. Я получил мэш, собственно тут я все сделал правильно, но в блендере есть также Rotation и Scale для каждого объекта, и у меня мэш приходит без учета этих параметров. Как получить мэш с учтенными  Rotation и Scale?

Оффлайн LanuHum

  • Житель
Новый вопрос. Я получил мэш, собственно тут я все сделал правильно, но в блендере есть также Rotation и Scale для каждого объекта, и у меня мэш приходит без учета этих параметров. Как получить мэш с учтенными  Rotation и Scale?
co = ob.matrix_world * vert.co

Оффлайн Bulbash

  • Житель
Подскажите пожалуйста. Как извлекать скелетную анимацию? В каком формате будут данные о скелетной анимации, на выходе?

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
Как извлекать скелетную анимацию?
Почитай эту страничку. Там про работу с костями и действиями.
http://blender3d.org.ua/book/Code_Snippets_25/Actions%20and%20drivers.html

Цитировать
В каком формате будут данные о скелетной анимации, на выходе?
Ты же, вроде, свой собственный движок пишешь. Как твоему движку требуется, в таком виде и экспортируй.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Попробовал поэкспериментировать с единственной костью в арматуре, задал ей пару ключевых кадров:
Код
>>> ob=bpy.data.objects['Armature']
>>> action = ob.animation_data.action
>>> fcu=action.fcurves
>>> for fc in fcu:
...     print(fc.data_path, "index=", fc.array_index)
...     
pose.bones["Bone"].location index= 0
pose.bones["Bone"].location index= 1
pose.bones["Bone"].location index= 2
pose.bones["Bone"].rotation_quaternion index= 0
pose.bones["Bone"].rotation_quaternion index= 1
pose.bones["Bone"].rotation_quaternion index= 2
pose.bones["Bone"].rotation_quaternion index= 3
pose.bones["Bone"].scale index= 0
pose.bones["Bone"].scale index= 1
pose.bones["Bone"].scale index= 2

Соотвествие индексов: 0 - x, 1 - y, 2 - z

Численные значения координат:

Код
>>> for frame in range(10):
...     print ("кадр=", frame, "x=", fcu[0].evaluate(frame))
...     
кадр= 0 x= 0.0
кадр= 1 x= 0.0
кадр= 2 x= 0.0018280739895999432
кадр= 3 x= 0.007335450500249863
кадр= 4 x= 0.016550853848457336
кадр= 5 x= 0.029494034126400948
кадр= 6 x= 0.046174466609954834
кадр= 7 x= 0.06658995151519775
кадр= 8 x= 0.09072526544332504
кадр= 9 x= 0.1185506209731102

Оффлайн Bulbash

  • Житель
Striver
Можно ли экспорт анимации реализовать по следующему плану:
1) Перебирать в цикле все объекты.
2) Узнавать, есть ли в них арматура.
3) Если есть, узнать общее количество кадров для этой арматуры, узнать какие из них ключевые.
4) Перебирать в цикле все ключевые кадры.
5) Перебирать в цикле все кости арматуры.
6) Получать характеристики той или иной кости в определенный ключевой кадр.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
1) Перебирать в цикле все объекты.
Я думал, что с этим-то ты разобрался
Код
for ob in bpy.data.objects:
что-то сделать с ob
Хотя я, если когда-нибудь буду делать экспортёр, не стану перебирать в цикле все объекты, буду работать только с одним, активным объектом, мне кажется, так правильно.

Цитировать
Узнавать, есть ли в них арматура.
Код
for mod in ob.modifiers.values():
if mod.type == 'ARMATURE':
значит mod - это арматура, что-то с ней сделать

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
3) Если есть, узнать общее количество кадров для этой арматуры, узнать какие из них ключевые.
Код
# amt - объект арматуры, его получение см п.2
act=amt.animation_data.action # действия арматуры
# в act.frame_range находится 1 и последний кадры этой арматуры

как найти ключевые кадры, я так и не понял

Цитировать
5) Перебирать в цикле все кости арматуры.

Код
#данные по костям в режиме редактирования:
# amt - объект арматуры, его получение см п.2
amtd=amt.data # данные арматуры
for bone in amtd.bones:
что-то делать с костью bone
   
Код
#данные по костям в режиме позы:
for bone in amt.pose.bones:
что-то делать с костью bone
   
получение координат в режиме позы я описал вчера:

Код
fcu=act.fcurves
fcu[n] - кривая анимации номер n у арматуры
список кривых такой же, как в окне Экспозиционного листа
всего кривых - len(fcu)

для кривой №0:
fcu[0].data_path - название этой кривой (внутри есть название кости, его можно выцепить оттуда)
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
fcu[0].range() - 1 и последний кадры этой кривой
fcu[0].keyframe_points - список ключевых кадров этой кривой
fcu[0].keyframe_points[0].co - данные по 1 ключевому кадру этой кривой

Оффлайн Bulbash

  • Житель
Striver, извиняюсь за глупый вопрос, но не разобрался что вы имели ввиду под "# amt - объект арматуры, его получение см п.2" . Если п.2 - это пункт 2 , то как связаны выражение :
Код
 
for mod in ob.modifiers.values():
    if mod.type == 'ARMATURE':
 
и amt?

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Ну да, я не связал их, извини
если mod - модификатор арматуры у меш-объекта, то его объект-арматура получается так:

Код
amt=mod.object

или, если объединить со 2 пунктом:
Код
for mod in ob.modifiers.values():
    if mod.type == 'ARMATURE':
        amt=mod.object


Оффлайн Bulbash

  • Житель
Striver большое спасибо вам за помощь. Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ? И fcu я так понял это собственно и есть анимации, те кривые по которым двигаются кости.

Оффлайн LanuHum

  • Житель
Striver большое спасибо вам за помощь. Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ? И fcu я так понял это собственно и есть анимации, те кривые по которым двигаются кости.
Режим редактирования не даёт полезных данных об анимации. Это всего лишь начальные свойства кости.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ?
Цитировать
Это всего лишь начальные свойства кости.
Не так уж и "всего лишь". Я не представляю, как можно писать движок, не используя эти начальные свойства.
Кости в режиме редактирования - первоначальная поза арматуры.
Кости в режиме позы - арматура в конкретной позе, она разная для разных действий и кадров.

Я в своём "недодвижке" до скелетной анимации так и не дошёл, но уверен, что там понадобится и то, и другое.

Цитировать
И fcu я так понял это собственно и есть анимации, те кривые по которым двигаются кости.
Я это и написал:
Цитировать
fcu[n] - кривая анимации номер n у арматуры
список кривых такой же, как в окне Экспозиционного листа

Оффлайн LanuHum

  • Житель
Не так уж и "всего лишь". Я не представляю, как можно писать движок, не используя эти начальные свойства.
Я плохо понимаю, собственно, сам вопрос
Цитировать
Подскажите, в чем разница между данными по костям в режиме редактирования и в режиме позы ?
Практически, в Блендере нет данных по костям в отдельных режимах. Есть, просто, данные.

 


Яметрика

* По форуму

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

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

1 (1).png
Скачано: 68
Автор: LEXA ANЭGROWND
blender.png
Скачано: 78
Автор: ipv2007
4.png
Скачано: 100
Автор: hiroyukiss
2.png
Скачано: 122
Автор: hiroyukiss

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