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

Оффлайн Bulbash

  • Житель
Спасибо Striver.

Оффлайн Bulbash

  • Житель
По непонятной мне причине Blender стал ругаться на строку: T = bone.matrix_local[0] + bone.matrix_local[5] + bone.matrix_local[10] + 1.
Пишет array index out of range (я так понял это выход за границы массива), но как тут может быть выход за границы массива если у меня матрица 4х4, 16 элементов а максимальный индекс до которого я пытаюсь достучаться 10?

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
>> 16 элементов а максимальный индекс до которого я пытаюсь достучаться 10?
для теста сделай до этой команды
print(bone.matrix_local)
Для Кота

Оффлайн Bulbash

  • Житель
Очередная загадочная ошибка. Код:
Код
               Vertex_Counter = 0
               while Vertex_Counter < (MeshSize[counter] / 12) :
                   GroupsCounter = 0
                   File.write(np.int32(VertexGroupsCount[counter][Vertex_Counter])) # записываю количесто групп для вершин
                   while GroupsCounter < VertexGroupsCount[counter][Vertex_Counter]:
                       
                        File.write(np.int32(Weightes_Indexes[counter][Vertex_Counter][GroupsCounter *2])) # индекс вертекс группы
                        File.write(np.float32(Weightes_Indexes[counter][Vertex_Counter][(GroupsCounter *2) + 1])) # вес
                       
                        GroupsCounter += 1
                   
                   
                   Veretex_Counter = Veretex_Counter + 1

Оффлайн Striver

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

Ошибка здесь переводится как "Локальная переменная 'Veretex_Counter' используется до присвоения". Т.е. ты первый раз используешь эту переменную, ещё не присвоив ей значения.
Так-то понятно, что у тебя лишняя буква e в названии переменной затесалась, и должно быть 'Vertex_Counter'. Исправь имя переменной.

Оффлайн Bulbash

  • Житель
Понятно. Извините, нелепая ошибка.

Оффлайн Striver

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

Оффлайн Bulbash

  • Житель
Фух, наконец-то я добрался до анимации. Мне подсказывали код на счет кривых в экспозиционном листе.

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 ключевому кадру этой кривой

Узнал что такое экспозиционный лист(Dope Sheet). Но так и не смог понять что вы имели ввиду под кривыми. Поясните пожалуйста.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
Но так и не смог понять что вы имели ввиду под кривыми
Открой редактор графов и увидишь. (Хотя, судя по всему, предпочитаешь английский интерфейс, тогда это называется Graph Editor). Каждая кривая соответствует какой-либо координате, участвующей в движении. А какая именно - сказано здесь:
Цитировать
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
Именно здесь хранится (или перевычисляется) информация о том, как меняются эти координаты при движении кости (или любого другого объекта).



Оффлайн Bulbash

  • Житель
Пробовал вывести len(fcu). И выходило что для скелета в котором было 21 кость возвращало 210, а в котором было 7 костей возвращало 70. Это значит что для каждой кости по 10 дуг? Почему это зависит от количесва костей а не от количества движений?

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
Это значит что для каждой кости по 10 дуг?
Пишу в третий раз:
Цитировать
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
3 параметра для location, 3 параметра для scale, 4 параметра для rotation_quaternion - всего 10 для каждой кости. Если делать ключи только для rotation_quaternion, т.е. только для вращения (а для костей в большинстве случае случаев этого хватает), то будет по 4 параметра, а не по 10.

Оффлайн Bulbash

  • Житель
Цитировать
Это значит что для каждой кости по 10 дуг?
Пишу в третий раз:
Цитировать
fcu[0].array_index - индекс этой кривой: для location, scale 0-x, 1-y, 2-z; для rotation_quaternion 0-w, 1-x, 2-y, 3-z
3 параметра для location, 3 параметра для scale, 4 параметра для rotation_quaternion - всего 10 для каждой кости. Если делать ключи только для rotation_quaternion, т.е. только для вращения (а для костей в большинстве случае случаев этого хватает), то будет по 4 параметра, а не по 10.
Спасибо вам БОЛЬШОЕ что вы повторяете по 3 раза, и все же мне совершенно не понятно. Вы писали ранее:

"fcu[n] - кривая анимации номер n у арматуры
список кривых такой же, как в окне Экспозиционного листа
всего кривых"

Что в вашем понимании анимация номер n? Это изменения кости номер n?

Оффлайн Samovar

  • Житель
Bulbash, звиняй что влезаю, но у тебя есть понимание о том, что такое массив (список в Python)?
Массив - это набор однотипных переменных (список). В Переменные однотипны, но  могут быть любого типа, в том числе и указателями.

Striver пишет:
Цитировать
3 параметра для location
значит:
location[0] соответствует Х координате
location[1] соответствует Y координате
location[2] соответствует Z координате


Надеюсь, ясно...

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Цитировать
Что в вашем понимании анимация номер n? Это изменения кости номер n?
Нет, не кости номер n. У костей вообще нет постоянных номеров, есть имена, коллекция костей эмулирует словарь, это я тоже уже писал.
повторю то, что писал две страницы назад:
Код
>>> 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
pose.bones["Bone.001"].rotation_quaternion index= 0
pose.bones["Bone.001"].rotation_quaternion index= 1
pose.bones["Bone.001"].rotation_quaternion index= 2
pose.bones["Bone.001"].rotation_quaternion index= 3
В данном случае у меня 2 кости. У кости "Bone" ключи определены для перемещения, масштаба и поворота, поэтому у неё 10 кривых. Для кости "Bone.001" определены только повороты, у неё 4 кривые. Всего у этой арматуры 14 кривых.
Посмотреть, за что отвечает кривая номер n, можно вызвав fcu[n].data_path и fcu[n].array_index (в своём коде я вызываю это в цикле).

Оффлайн Bulbash

  • Житель
Подскажите, где можно внятно почитать об понятии кривой в Blender?
Может есть возможность просто получить данные о скелете в режиме позы, т.е в принципе не пользоваться кривыми, а просто узнать положение и поворот кости в определённый кадр?

 


Яметрика

* По форуму

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

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

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

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