-
Notifications
You must be signed in to change notification settings - Fork 756
/
Copy pathfbx_curves_extractor.py
73 lines (62 loc) · 2.84 KB
/
fbx_curves_extractor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from unreal_engine import FbxManager, FbxIOSettings, FbxImporter, FbxScene
import unreal_engine as ue
class FbxCurvesExtractor:
def __init__(self, filename):
self.manager = FbxManager()
io_settings = FbxIOSettings(self.manager, 'IOSROOT')
self.manager.set_io_settings(io_settings)
importer = FbxImporter(self.manager, 'importer')
importer.initialize(filename, io_settings)
self.scene = FbxScene(self.manager, 'scene')
importer._import(self.scene)
def get_objects_by_class(self, name):
objects = []
for i in range(0, self.scene.get_src_object_count()):
obj = self.scene.get_src_object(i)
if obj.get_class_name() == name:
objects.append(obj)
return objects
def get_members_by_class(self, parent, name):
members = []
for i in range(0, parent.get_member_count()):
member = parent.get_member(i)
if member.get_class_name() == name:
members.append(member)
return members
def get_anim_stacks(self):
return self.get_objects_by_class('FbxAnimStack')
def get_anim_layers(self, stack):
return self.get_members_by_class(stack, 'FbxAnimLayer')
def get_properties(self, obj):
prop = obj.get_first_property()
while prop:
yield prop
prop = obj.get_next_property(prop)
def get_anim_curves(self, layer):
curves = []
for i in range(0, self.scene.get_src_object_count()):
obj = self.scene.get_src_object(i)
# retrieve object properties
for prop in self.get_properties(obj):
curve_node = prop.get_curve_node(layer)
if not curve_node:
continue
channels = []
for chan_num in range(0, curve_node.get_channels_count()):
# always get the first curve
curve = curve_node.get_curve(chan_num, 0)
if not curve:
continue
keys = []
for key_id in range(0, curve.key_get_count()):
keys.append((curve.key_get_seconds(key_id), curve.key_get_value(key_id)))
channels.append({'name': curve_node.get_channel_name(chan_num), 'keys': keys})
curves.append({'object': obj.get_name(), 'class': obj.get_class_name(), 'property': prop.get_name(), 'channels': channels})
return curves
filename = 'C:/Users/roberto/Downloads/testCam/testCam.fbx'
#filename = 'C:/Users/Roberto/Desktop/Kaiju_Assets/Slicer/Animations/slicer_attack.fbx'
extractor = FbxCurvesExtractor(filename)
for stack in extractor.get_anim_stacks():
for layer in extractor.get_anim_layers(stack):
for curve in extractor.get_anim_curves(layer):
ue.log(curve)