11 from pyfbsdk
import FBApplication, FBSystem, FBFindModelByLabelName, FBBodyNodeId, FBTime, FBTake
23 def loadScene(sceneFile):
25 if (
not application.FileOpen(sceneFile,
False)):
29 def getFullPrefix(name):
30 if len( name.split(
":") )>1:
31 lastPref = name.split(
":")[-2]
32 firstPref = name.split(lastPref)[0]
33 fullPrefix = firstPref+lastPref
38 def addAllGroupMembers(group, members):
39 for member
in group.Items:
40 if member.ClassName() == str(
"FBGroup"):
41 addAllGroupMembers(member, members)
43 members.append(member)
45 def addAllSetMembers(set, members):
46 for member
in set.Items:
47 if member.ClassName() == str(
"FBGroup"):
48 addAllGroupMembers(member, members)
49 elif member.ClassName() == str(
"FBSet"):
50 addAllSetMembers(member, members)
52 members.append(member)
54 def getGroupMembers(groupName, members):
55 for group
in FBSystem().Scene.Groups:
56 if group.Name == groupName.split(
":")[-1]:
57 for item
in group.Items:
58 if not getFullPrefix(item.LongName):
60 elif getFullPrefix(item.LongName) == groupName.split(
":")[-2]:
61 addAllGroupMembers(group, members)
67 def getSetMembers(setName, members):
69 if set.Name == setName.split(
":")[-1]:
70 for item
in set.Items:
71 if not getFullPrefix(item.LongName):
73 elif getFullPrefix(item.LongName) == setName.split(
":")[-2]:
74 addAllSetMembers(set, members)
78 def getHierarchy (modelName, rotationModels, translationModels):
82 if not model.ClassName() == str(
"FBModel"):
84 rotationModels.append(model)
85 for child
in model.Children:
86 getHierarchy(child.LongName, rotationModels,
None)
88 if not translationModels ==
None:
89 translationModels.append(model)
93 def getCharacterModels(character, models, transModels):
98 if char.Name == character:
99 for nodeID
in FBBodyNodeId.values.values():
100 mod = char.GetModel(nodeID)
104 if nodeID == FBBodyNodeId.kFBHipsNodeId:
105 transModels.append(mod)
106 countTrans = countTrans + 1
111 def getModel(modelName, models):
116 def mineCurve(start, end, fcurve, modifier):
119 while counter <= end:
120 frameTime =
FBTime(0,0,0,counter)
121 value = fcurve.Evaluate(frameTime) * modifier
122 curveData[frameTime.GetFrame()] = value
123 counter = counter + 1
126 def exportAnimData(animNodes, prefix, start, end, outData, modifier = 1.0):
127 if animNodes ==
None:
130 for animNode
in animNodes:
131 curveName = prefix + animNode.Name
132 curveData = mineCurve(start, end, animNode.FCurve, modifier)
133 outData[curveName] = curveData
135 exportAnimData(animNode.Nodes, prefix, start, end, outData)
138 def PlotModels(models, start, end):
141 print "1.Plot the models!"
142 print "1.1. Select the models:"
150 take.SetCurrentLayer(0)
153 print "1.2. Plot models from frame", start,
"to frame", end
156 take.PlotTakeOnSelected(period)
159 print "1.3. Unselect all ploted models!"
164 def GetRotationAnimation(models, start, end, allData):
165 print "2. Rotation models has: ", len( rotationModels),
"models."
169 nodeAnim = mod.AnimationNode
170 for nodeAnimNode
in nodeAnim.Nodes:
171 if "Lcl Rotation" in nodeAnimNode.Name:
172 if len(nodeAnimNode.Nodes) > 0:
173 exportAnimData(nodeAnimNode.Nodes, mod.FullName +
"__Rotation", start, end, allData, math.pi/180.0)
176 print "2. Get valid rotation animation from: ", count,
" models."
178 def GetTranslationAnimation(models, start, end, allData):
179 print "2. Translation models has: ", len( translationModels),
"models."
184 nodeAnim = mod.AnimationNode
185 for nodeAnimNode
in nodeAnim.Nodes:
186 if "Lcl Translation" in nodeAnimNode.Name:
187 if len(nodeAnimNode.Nodes) > 0:
188 exportAnimData(nodeAnimNode.Nodes, mod.FullName +
"__Translation", start, end, allData)
191 print "2. Get valid translation animation from: ", count,
" models."
193 def ExportAnimationData(outFile, allData):
194 print "3. Output animation data into file: ", outFile,
"\n"
197 output = open (outFile,
'w')
198 output.write(
'########### Animation Data ###########\n')
199 for keyModelName,curveDict
in allData.items():
200 output.write(
'%s\n'%(keyModelName))
202 keylist = curveDict.keys()
204 for keyFrame
in keylist:
205 output.write(
'%s: %s\n'%(keyFrame, curveDict[keyFrame]))
209 def ExportModelsAnimation(outFile, rotationModels, translationModels, start, end):
210 PlotModels( rotationModels, start, end )
211 PlotModels( translationModels, start, end )
214 GetRotationAnimation( rotationModels, start, end, allData )
215 GetTranslationAnimation( translationModels, start, end, allData )
217 ExportAnimationData( outFile, allData )
232 inFile = os.path.realpath(os.path.abspath(os.path.join(
FBSystem().ApplicationPath,
"../../OpenRealitySDK/Scenes/StoryExample.fbx" )))
233 outFile = os.path.realpath(os.path.abspath(os.path.join( tempfile.gettempdir(),
"StoryExample_output.txt" )))
236 if not loadScene(inFile):
237 sys.stderr.write(
'Could not load file %s' % inFile)
238 raise Exception(
'quitting')
244 rotationModels = list()
245 translationModels = list()
251 getCharacterModels(
"Skeleton_Model", rotationModels, translationModels)
255 getHierarchy (
"Skeleton_Model:Hips", rotationModels, translationModels)
256 getHierarchy (
"Character_Ctrl:HipsEffector", rotationModels, translationModels)
260 getGroupMembers(
"KNIGHT:RightThighArmorLowBeltBuckle", rotationModels)
266 getSetMembers("MyNamespace:MySet", models)
271 getModel(
"KNIGHT:Hips", rotationModels)
272 getModel(
"KNIGHT:Hips", translationModels)
273 getModel(
"Character_Ctrl:HipsEffector", translationModels)
276 print "0. Totally get", len(rotationModels),
"models to export their rotation."
279 print "0. Totally get", len(translationModels),
"models to export their translations."
284 if len(rotationModels) == 0 & len(translationModels) == 0:
285 sys.stderr.write(
'No models were found.')
286 raise Exception(
'quitting')
289 ExportModelsAnimation(outFile, rotationModels, translationModels, start, end)
291 print "The animation data for from frame ", start,
" to frame ", end,
" have been exported to file: \n", outFile