Created
December 24, 2014 05:36
-
-
Save yamahigashi/04a87b49a41c22db2a1d to your computer and use it in GitHub Desktop.
motinbuilder python utility
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
# MotionBulider 用のユーティリティ関数集 | |
############################################################################### | |
import pyfbsdk as fb | |
#import pyfbsdk_additions as fb_add | |
############################################################################### | |
fbsys = fb.FBSystem() | |
app = fb.FBApplication() | |
pc = fb.FBPlayerControl() | |
story = fb.FBStory() | |
time_by_frame = lambda x: fb.FBTime(0, 0, 0, x) | |
get_file_dir = lambda x: r"\\".join(x.split("\\")[0:-1]) + "\\" | |
def _get(name, get_type): | |
for t in get_type: | |
if t.Name == name: | |
return t | |
############################################################################### | |
# get_カテゴリ名(名前) でオブジェクト取得するための関数を自動生成するよ | |
# usage: | |
# the_take = util.get_take(take_name) | |
# などのように使う | |
############################################################################### | |
ELEMENTS = { | |
"ActorFaces": fbsys.Scene, | |
"Actors": fbsys.Scene, | |
"AudioClips": fbsys.Scene, | |
"Cameras": fbsys.Scene, | |
"Characters": fbsys.Scene, | |
"CharacterExtensions": fbsys.Scene, | |
"CharacterFaces": fbsys.Scene, | |
"CharacterPoses": fbsys.Scene, | |
"Components": fbsys.Scene, | |
"Constraints": fbsys.Scene, | |
"ConstraintSolvers": fbsys.Scene, | |
"ControlSets": fbsys.Scene, | |
"Devices": fbsys.Scene, | |
"Folders": fbsys.Scene, | |
"Groups": fbsys.Scene, | |
"Handles": fbsys.Scene, | |
"Lights": fbsys.Scene, | |
"MarkerSets": fbsys.Scene, | |
"Materials": fbsys.Scene, | |
"Notes": fbsys.Scene, | |
"ObjectPoses": fbsys.Scene, | |
"PhysicalProperties": fbsys.Scene, | |
"Poses": fbsys.Scene, | |
"Sets": fbsys.Scene, | |
"Shaders": fbsys.Scene, | |
"Takes": fbsys.Scene, | |
"Textures": fbsys.Scene, | |
"UserObjects": fbsys.Scene, | |
"VideoClips": fbsys.Scene | |
} | |
def _make_func_name(elem): | |
return "get_%s" % elem.lower().rstrip("s") # 複数形は単数形にする | |
def _make_function(space, elem): | |
def event_handler(name): | |
return _get(name, getattr(space, elem)) | |
event_handler.__name__ = _make_func_name(elem) | |
return event_handler | |
for elem, space in ELEMENTS.items(): | |
getter = _make_function(space, elem) | |
globals()[getter.__name__] = getter | |
############################################################################### | |
def insert_character_track(char_name): | |
chars = fbsys.Scene.Characters | |
story.Mute = False | |
track = fb.FBStoryTrack( | |
fb.FBStoryTrackType.kFBStoryTrackCharacter, story.RootFolder) | |
for i, char in enumerate(chars): | |
print(i, char.Name) | |
if char.Name == char_name: | |
track.CharacterIndex = i + 1 | |
break | |
return track | |
def insert_current_take(track=None): | |
# create a track for our character: | |
if not track: | |
track = fb.FBStoryTrack( | |
fb.FBStoryTrackType.kFBStoryTrackCharacter, story.RootFolder) | |
# assign our CurrentCharacter to the track | |
track.Details.append(app.CurrentCharacter) | |
# Insert current take in the newly created track | |
clip = track.CopyTakeIntoTrack( | |
fbsys.CurrentTake.LocalTimeSpan, fbsys.CurrentTake, | |
time_by_frame(0), False) | |
return track | |
def insert_generic_track(grp): | |
track = fb.FBStoryTrack( | |
fb.FBStoryTrackType.kFBStoryTrackAnimation, story.RootFolder) | |
return track | |
def plot_on_group(groupname, take=None): | |
""" take指定なしならカレントテイク、ありならそれ | |
groupname のグループをプロットかける """ | |
groups = fbsys.Scene.Groups | |
opt = forge_plotopt() | |
take = take if take != None else fbsys.CurrentTake | |
# deselect all at first | |
for g in groups: | |
g.Select(False) | |
for g in groups: | |
if g.Name == groupname: | |
g.Select(True) | |
take.PlotTakeOnSelected(opt.PlotPeriod) | |
g.Select(False) | |
def forge_plotopt(): | |
opt = fb.FBPlotOptions() | |
opt.ConstantKeyReducerKeepOneKey = False | |
opt.PlotAllTakes = False | |
opt.PlotOnFrame = True | |
opt.PlotPeriod = time_by_frame(1) | |
opt.PlotTranslationOnRootOnly = False | |
opt.PreciseTimeDiscontinuities = False | |
opt.RotationFilterToApply = fb.FBRotationFilter.kFBRotationFilterUnroll | |
opt.UseConstantKeyReducer = False | |
return opt | |
def deselect_all_group(): | |
for g in fbsys.Scene.Groups: | |
g.Select(False) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment