02 февраля 2012 в 19:45Рейтинг: 0
0
0
Кто-нибудь писал экспортер анимации?
В предыдущей версии было куда проще с ней, тут же моск можно сломать.
В общем, я сделал кубик с одной костью, далее выделил его и кость и сделал ctrl+p + with automatic weights т.е. у объекта создались группы вершин (читай группы влияния костей) куда записалась развесовка.
У каждой такой группы из коллекции object.vertex_groups[]
есть поле name = имя кости, и weight(index) – вес кости на вершину(), где index – индекс кости.
Я честно говоря вообще не понимаю на кой эта - object.vertex_groups[] если там вообще нечего брать кроме имен костей.
И собственно о главном, о том, что поставило меня в тупик.
Информация о развесовке храниться не только в object.vertex_groups[], но и в каждой вершине vertex.groups. Т.е. долго добираемся до вершинки через фейс.
for obj in bpy.context.scene.objects:
if obj.type in {'MESH'}:
me = obj.to_mesh(context.scene, True, 'PREVIEW')
me.transform(MATXROTATION90)
matrix = obj.matrix_world.copy()
print ("mesh name %s" % obj.name)
print ("face count %d" % len(me.faces))
print ("vertex count %d" % len(me.vertices))
"""
vesi verhin
"""
vertGroupNames = obj.vertex_groups.keys()
for faceIndex, face in enumerate(me.faces):
print ("face index %d" % faceIndex)
print ("face verts idx[%d %d %d]" % (face.vertices[0], face.vertices[1], face.vertices[2]))
print ("face len %d" % len(face.vertices))
for vi, vertex in enumerate(me.vertices):
print ("vertex index %d" % vertex.index)
if len(vertex.groups) > 0:
print ("bones influences detected, number of bones %d" % len(vertex.groups))
for i, group in enumerate(vertex.groups):
print ("bone group name %s" % (vertGroupNames[i]))
print ("bone group weight %f" % group.weight)
else:
print ("no bones groups")
vertex.groups – опять коллекция, это группа влияний на данную вершину. Грубо говоря BonesInfluenses = len(vertex.groups) мы узнаем сколько костей влияет на данную вершину. Причем суммарный вес всей коллекции уже нормализирован, т.е. если суммировать все веса коллекции будет число от 0 до 1.0.
Теперь вопрос мне нужно срезать эту коллекцию до 4-х элементов, если она больше, но перед срезом мне ее нужно еще и отсортировать. Чтобы в начале были самые большие веса(значения), т.е. при срезе терялись самые маленькие значения. Потом мне опять нужно нормализовать веса в этой усеченной коллекции и при этом всем не потерять и не запутаться какой вес к какой кости принадлежит. Есть мысли? Может кто писал?