Skip to content

Instantly share code, notes, and snippets.

@yamahigashi
Created December 24, 2014 05:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamahigashi/04a87b49a41c22db2a1d to your computer and use it in GitHub Desktop.
Save yamahigashi/04a87b49a41c22db2a1d to your computer and use it in GitHub Desktop.
motinbuilder python utility
# -*- 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