Skip to content

Commit 043c129

Browse files
author
Roberto De Ioris
authored
Update FixingMixamoRootMotionWithPython.md
1 parent ebf7f94 commit 043c129

1 file changed

Lines changed: 56 additions & 0 deletions

File tree

‎tutorials/FixingMixamoRootMotionWithPython.md‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,62 @@ Double click on the skeleton to open its editor and you should see the new bone
144144

145145
## Step 3: fixing skeletal mesh bone influences
146146

147+
```python
148+
149+
class RootMotionFixer:
150+
151+
...
152+
153+
def fix_bones_influences(self, mesh, old_skeleton):
154+
# get current soft vertices
155+
vertices = mesh.skeletal_mesh_get_soft_vertices()
156+
new_vertices = []
157+
# get current bone map
158+
old_bone_map = mesh.skeletal_mesh_get_bone_map()
159+
new_bone_map = []
160+
161+
# fix bones influence for each vertex
162+
for vertex in vertices:
163+
bone_ids = list(vertex.influence_bones)
164+
for index, bone_id in enumerate(bone_ids):
165+
# only fix bone with weight > 0
166+
if vertex.influence_weights[index] > 0:
167+
bone_ids[index] = self.get_updated_bone_index(old_skeleton, mesh.Skeleton, old_bone_map, new_bone_map, bone_id)
168+
vertex.influence_bones = bone_ids
169+
new_vertices.append(vertex)
170+
171+
# assign new vertices
172+
mesh.skeletal_mesh_set_soft_vertices(new_vertices)
173+
# add the new bone mapping
174+
mesh.skeletal_mesh_set_bone_map(new_bone_map)
175+
176+
# specify which bones are active and required (ensure root is added to required bones)
177+
mesh.skeletal_mesh_set_active_bone_indices(new_bone_map)
178+
if 0 not in new_bone_map:
179+
new_bone_map += [0]
180+
mesh.skeletal_mesh_set_required_bones(new_bone_map)
181+
182+
def get_updated_bone_index(self, old_skeleton, new_skeleton, old_bone_map, new_bone_map, index):
183+
"""
184+
Convert indices betwen skeletons
185+
"""
186+
# get the skeleton bone_id from the map
187+
true_bone_id = old_bone_map[index]
188+
189+
# get the bone name
190+
bone_name = old_skeleton.skeleton_get_bone_name(true_bone_id)
191+
192+
# get the new index
193+
new_bone_id = new_skeleton.skeleton_find_bone_index(bone_name)
194+
195+
# check if a new mapping is available
196+
if new_bone_id in new_bone_map:
197+
return new_bone_map.index(new_bone_id)
198+
199+
new_bone_map.append(new_bone_id)
200+
return len(new_bone_map)-1
201+
```
202+
147203
## Step 4: splitting 'Hips' track in animation
148204

149205
## Adding a context menu

0 commit comments

Comments
 (0)