zastosować niehierarchiczne transformacje do hierarchicznego szkieletu?
Używam Blender3D, ale odpowiedź może nie dotyczyć wyłącznie API.
Mam kilka macierzy, które muszę przypisać do PoseBones. Wynikająca z tego pozycja wygląda dobrze, gdy nie ma hierarchii kości (rodzicielstwo) i jest zawalona, gdy jest.
Przesłałem archiwum z przykładową mieszanką modeli sfałszowanych, importera animacji tekstu i pliku animacji testowej tutaj:http://www.2shared.com/file/5qUjmnIs/sample_files.html
Zaimportuj animację, wybierając Armaturę i uruchamiając importera w pliku „sba”. Zrób to dla obu armatur.
W ten sposób przypisuję pozy prawdziwemu (złożonemu) importerowi:
matrix_bases = ... # matrix from file
animation_matrix = matrix_basis * pose.bones['mybone'].matrix.copy()
pose.bones[bonename].matrix = animation_matrix
Jeśli przejdę do trybu edycji, zaznacz wszystkie kości i naciśnij kombinację klawiszy Alt + P, aby cofnąć rodzicielstwo.
Dokumentacja API mówi, że PoseBone.matrix znajduje się w „przestrzeni obiektowej”, ale wydaje mi się, że z tych testów wynika, że są one relatywne do kości macierzystych.
Ostateczna matryca 4x4 po zastosowaniu ograniczeń i sterowników (obiekt przestrzeń)
Próbowałem zrobić coś takiego:
matrix_basis = ... # matrix from file
animation_matrix = matrix_basis * (pose.bones['mybone'].matrix.copy() * pose.bones[bonename].bone.parent.matrix_local.copy().inverted())
pose.bones[bonename].matrix = animation_matrix
Ale wygląda gorzej. Eksperymentowałem z kolejnością operacji, bez szczęścia ze wszystkimi.
Dla przypomnienia, w starym API 2.4 działało to jak urok:
matrix_basis = ... # matrix from file
animation_matrix = armature.bones['mybone'].matrix['ARMATURESPACE'].copy() * matrix_basis
pose.bones[bonename].poseMatrix = animation_matrix
pose.update()
Link do interfejsu API Blendera: