Hatena::ブログ(Diary)

たこなぐりの日々

2012-05-28

Motionbuilderスクリプトあれこれ

MBのスクリプトってハードル高いよなぁ。


最近MotionBuilderのスクリプトを書く機会があったのですがザクッとぐぐってみても資料が少なかったり
sampleが少なかったりで大変だったのでちょこっと纏めてみようと思いました。
ほらまぁ、取っ掛かりって大事じゃないですか。
MBってSIと違ってログが出ないしで取っ掛かりがハードだと思うのです
(実際しんどかったし、MBとか触ったことねぇし)

準備編


勉強に使わせて頂いたり参照させていただいたサイトとかエントリとか

デジタル・フロンティア-Digital Frontier | DF TALK | モーションビルダースクリプトTips
DFさんことデジタル・フロンティアさんの開発チームのブログエントリ。
もうDFさんの開発チームの方々には日々助けられっぱなしです(;´д`)アリガトウゴザイマス

https://sites.google.com/site/jampandvn/motion-builder/py-tips
google先生の旅で巡りあったkatoriさんのサイト、
MB2010を対象とのことでしたが2012でもちゃんと動きました。
ちぅか2012で決定的に違うのってUI周りぐらいなような気がする。

リファレンスとか

リファレンスガイドが無いとさすがに作業出来ないですよね。
http://download.autodesk.com/global/docs/motionbuildersdk2012/en_US/index.html
オフシャルのスクリプトガイド。
2012になってからイチイチブラウザ立ち上がるのかな、嫌だなぁ。
2011はchmで手元にあるんだけどコレはどっかから引っ張ってきたのか元からあったのか忘れてしまった。。。。

サンプルスクリプトの置き場所

MB2012の場合
C:\Program Files\Autodesk\MotionBuilder 2012 (64-bit)\bin\config\Scripts

2012以前のサンプルスクリプトは
C:\Users\あなたのお名前\AppData\Local\Autodesk\MB2011x64\config\Scripts

スクリプトTips

簡単なスクリプトTips、コピペで即実戦投入というものではないけど参考にしてもらえれば・・・

import pyfbsdk as MB

MdlPath=r"C:\mohi\tako_model.fbx"
MB.FBApplication().FileOpen(MdlPath,False)
#fbxとかのファイルを「開く」、二番目のFalseをTrueにするとOpen optionsが表示される。



MB.FBPlayerControl().SetTransportFps(FBTimeMode.kFBTimeMode30Frames, 0.0) 
#TimeMode(フレームレート)の設定。オリジナル設定したい時はkFBTimeModeCustomを選択して0.0にその値を書く。

MB.FBPlayerControl().GotoStart() 
#コントローラをstart位置に移動

MB.FBSystem().Scene.Takes
#テイクの総数

MB.FBSystem().CurrentTake.LocalTimeSpan.GetStart().GetFrame(True)
#開始フレーム。終了フレームを知りたい時はGetStart()をGetStop()に

SetTimeSpan = MB.FBTimeSpan(FBTime(0,0,0,15),FBTime(0,0,0,350) )
MB.FBSystem().CurrentTake.LocalTimeSpan = SetTimeSpan
#時間軸の設定。この場合15フレスタート350フレ終了。

MB.FBApplication().CurrentCharacter.Name
#最近使用したキャラの名前。

2012-01-11

PPG作成時のLogicを外部参照してみた。

Logicメゾットの使用方法とか

softimageでPPG(ボタンとかテキストボックスとかGUI付きscript、でいいのかな・・・(´Д`))
を作成するとき、Logicメゾットを使用してPPGにボタンを押した時〜とかパラメータが変化した時〜
みたいな挙動は文字列で渡してね、って書いてある。例文もPPGLayout.Logic = String;とか文字列渡してねって書いてるし。

f:id:Takomaru:20120110213101j:image

こんな感じで書いてある。

そいでもってそれにしたがってコードを書くとこうなる。


from win32com.client import constants as c

LogicCode = """
def Push_OnClicked():     
     Application.LogMessage("mohi")
"""

app = Application
log = app.LogMessage

oPSet = app.ActiveSceneRoot.AddProperty("CustomProperty",False,"Test" )
oLayout = oPSet.PPGLayout
oLayout.AddButton( "Push" )
oLayout.Language = "Python"
oLayout.Logic = LogicCode

app.InspectObj( oPSet, "", "", c.siLock )

新たにSetAttributeを設定しなおしてそれをLogicとする。

挙動の部分がまるっと文字列になるわけでパッと見どこに何があるのか分からないし
logicにあたる挙動の部分を別のscriptに書いて、それを参照するような形に持っていけたら汎用性が出るんじゃないのかと思ったり。
なんかあでしょそれっぽいのと思いながらScriptingGuideをツラツラ読んでいたらこんな記述を見つけました。

f:id:Takomaru:20120110221718j:image

siPPGLayoutAttributeの部分に載っていたsiLogicFileという定数。
siUILogicの代わりに使用できて外部ファイルへのパス・・・・( ゚д゚)これ使えそう。

とりあえずmohi_func.pyって名前のpythonファイルを作成。
中身はこんな感じ。

def Push_OnClicked():
   Application.LogMessage("mofu")

ぴょろっと機能書いただけ。

んでGUIの方、

from win32com.client import constants as c

def build_MyUI():
    oPSet = Application.ActiveSceneRoot.AddProperty("CustomProperty",False,"Test" )
    oLayout = oPSet.PPGLayout
    oLayout.AddButton( "Push" )
    return oPSet

def main():
 myPPG = build_MyUI()
 myPPGLayout = myPPG.PPGLayout
 myPPGLayout.Language = "Python"
 myPPGLayout.SetAttribute( "LogicFile", "C:\ファイルの置き場所のパス\mohi_func.py" )
 Application.InspectObj(myPPG)
main()

myPPGLayout.SetAttribute( "LogicFile", "C:\ファイルの置き場所のパス\mohi_func.py" )

ここでbuild_MyUI()で設定したGUIそのものに値を追加(設定しなおす、のほうがいいのかな)
SetAttributeメゾットはPPGLayoutのメゾットで値を設定しなおす時に使う。
ここではLogicFileの値を新たに設定するからAttributeName(変更する属性)にLogicFileを指定して
AttributeValue (属性の新しい新しい値)にmohi_func.pyの置き場所のフルパスを書く。
これで外部のファイルをLogicとして認識してくれる(・∀・)
SetAttributeにはHelpFileって値もあってLogicFileの要領でパスを指定すると.chmで作成したファイルを
ヘルプファイルとして呼び出すこともできるのかなこれ、へー。

しかしまぁScriptingGuideまじめに読めばさっさと気がついたのにって話ですね(;´д`)トホホ…

2011-07-16

色空間の話

[画像処理]
「AEで色相彩度彩度を−100にしてモノクロの絵を出すと細部の陰影がまるっと潰されるのでどういう計算かけるのかしら」
Twitterにpostしたところ
@bryfulさんから「 HLSのLとYUVのYの違い」とリプライを頂いてHLSとかYUVってなんだろ、HSVとHLSって違うの?と思い調べてみた。

色空間をざっくりまとめてみた

  • HSV
    • 色相(Hue)、彩度(Saturation・Chroma)、明度(Brightness・Lightness・Value)の3つの成分
  • HLS
    • 色相(Hue)、輝度(Lightness/Luminance または Intensity)、彩度(Saturation)の3つの成分

−HSB

    • AEのカラーピッカーに入ってるアレ。
    • 色相(Hue)、彩度(Saturation・Chroma)、明度(Brightness・Lightness・Value)の3つの成分
    • HSVと一緒?あんま考えないことにする。
  • YUV
    • Y(YUV輝度)、U(Cb/青色色差)、V(Cr/赤色色差)の3つの成分。
    • 色差(輝度と青の差=U,輝度と赤の差=V)

調べれば調べるほど混沌とする(´Д`)というか分からなくなる!
ぐーぐる先生に聞いても輝度明度彩度がページによってはごっちゃになっててカオス
と思ったらこちらにまとめを書いてる方がいらっしゃったので添付。
http://www.geocities.jp/goldenhige/NiVE/colorspace/colorspace.txt

んでなんで色相彩度彩度−100にすると細部が潰れるのかって話

>>hlsで彩度-100はrgbの値の最大値と最小値の平均になる。少数以下は切り捨て。つまりチャンネルの一つは無視されるから、
モノクロ化としてはNG。だけど標準プラグインのほとんどが高速化のためhlsのLを輝度に採用してる。
実際一般人にはほとんど区別つかないらしい<<

んでぐぐってRGB->HLSの変換式を探してみました。えぇありましたとも。

RGB->HLSの変換式
H = 	  if max(R,G,B) = R then	(0+(G-B)/(max(R,G,B)-min(R,G,B)))60
	  if max(R,G,B) = G then	(2+(B-R)/(max(R,G,B)-min(R,G,B)))60
	  if max(R,G,B) = B then	(4+(R-G)/(max(R,G,B)-min(R,G,B)))60

L = (max(R,G,B)+min(R,G,B))/2
	  if L <= 0.5 then
		S = (max(R,G,B)-min(R,G,B))/(max(R,G,B)+min(R,G,B))
	  else
		S = (max(R,G,B)-min(R,G,B))/(2-max(R,G,B)-min(R,G,B))

Σ(´∀`;)ほんとだ、HLSのLってRGBの間の値を取ってる。
「チャンネルのひとつは無視される」の部分は理解不足で分からないんだけど…。
じゃあYUVだったらどうなんだろ?

RGB->YUVの変換式(HDビデオ向きYUV変換式)
Y = (0.2125R + 0.7154G + 0.0721B) x 219 + 16
U = (-0.115R - 0.386G + 0.500B) x 224 + 128
V = (0.500R - 0.454G - 0.046B) x 224 + 128

おぉ、これならRGBの情報保持されてる、人の目は緑を明るいと認識するって話だから緑の情報に輝度のウェイトが置かれてるのかしら。
だけどこれって緑&青の情報が赤の情報の3倍近くあるって事だしなぁ。
だけどこれ座学で理解するには限界あるなー(´Д`)
スクリプトなりプラグイン書いたほうがアルゴリズム吸収できるよなー・・・
AEの色相彩度なり白黒なりレンズフィルタなりってどんな演算かけるんだろ、みんな違うのかね?