2011年11月26日
【完全無料】「Visual C++ 2010 Express」でMotionBuilderプラグインを作る(64ビット対応)【MotionBuilderは別売】
ubicast Bloggerってもう開発終わっちゃったんだろうか。ブログ書くの超面倒くせぇな、やっぱり辞めよう。
続きを読む
2011年01月01日
MotionBuilder スクリプトチュートリアル FCurveの編集1
FCurveを弄る前に選択されているモデルをログに出すスクリプトから
from pyfbsdk import *
def getSelectedModels() :
sels = FBModelList()
FBGetSelectedModels(sels)
return sels
def test() :
for s in getSelectedModels() :
print s.Name
test()
FBGetSelectedModelsで選択されているモデルを取得できる。
次はアニメーションノードの取得
from pyfbsdk import *
def getSelectedModels() :
sels = FBModelList()
FBGetSelectedModels(sels)
return sels
def getAnimationNodes(node, animNodes) :
if '' != node.Name :
animNodes.append(node)
for n in node.Nodes :
getAnimationNodes(n, animNodes)
def test() :
for s in getSelectedModels() :
print s.Name
anodes = list()
getAnimationNodes(s.AnimationNode, anodes)
for an in anodes :
print (' '+an.Name)
test()
実行結果
アニメーションノードの正体はコイツら
モデルにはデフォルトでTranslation、Rotation、Scalingのアニメーションノードがついてる。アニメーションノードってのはアニメーション可能なパラメータってことみたい。
試しにVisibilityのアニメーションをONにしてさっきのスクリプトを実行すると
Visibilityが増えてる
FCurveの編集は次回
2010年12月18日
MotionBuilder スクリプトチュートリアル GUI編2
今回ボタンの使い方の例としてスクリプトランチャを作る
ボタンを押したら他のスクリプトを実行するヤツ
MBはスクリプトの実行が面倒くさいのでよく使うと思う
まずはボタンの使い方
ボタンを2つ付けて押すとそれぞれ「Script1」「Script2」とログに出すスクリプト
from pyfbsdk import *
from pyfbsdk_additions import *
class scriptLuncher() :
def __init__(self, name, w, h) :
self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h
x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)
layout = VBoxLayout()
self.tool.SetControl('mainLayout', layout)
btn = FBButton()
btn.Caption = 'Script1'
btn.OnClick.Add(self.onClick1)
layout.Add(btn, 20)
btn = FBButton()
btn.Caption = 'Script2'
btn.OnClick.Add(self.onClick2)
layout.Add(btn, 20)
def show(self) :
ShowTool(self.tool)
def onClick1(self, ctl, event) :
print 'Script1'
def onClick2(self, ctl, event) :
print 'Script2'
scriptLuncher('MBScriptLuncher', 300, 280).show()
ボタンを押すと、OnClick.Add()で指定した関数が呼ばれる
2つ作ったので2つ関数が必要になる
が、2つ3つ程度ならコレでもいいけど10個とかになってくると面倒くさいし、動的にボタンを増やすとか出来ないのでどうにかする
from pyfbsdk import *
from pyfbsdk_additions import *
class CustomButton(FBButton) :
def __init__(self, scriptPath='') :
FBButton.__init__(self)
self.scriptPath = scriptPath
class scriptLuncher() :
def __init__(self, name, w, h) :
self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h
x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)
layout = VBoxLayout()
self.tool.SetControl('mainLayout', layout)
for i in range(2) :
btn = CustomButton('Script' + str(i+1))
btn.Caption = 'Script' + str(i+1)
btn.OnClick.Add(self.onClick)
layout.Add(btn, 20)
def show(self) :
ShowTool(self.tool)
def onClick(self, ctl, event) :
print ctl.scriptPath
scriptLuncher('MBScriptLuncher', 300, 280).show()
FBButtonクラスを継承してCustomButtonクラスを作ってscriptPathってパラメータを追加した
次はコンフィグファイルを読み込んでボタンを追加していく
↓のようにキャプションとスクリプトのパスをセミコロンで区切ったリストを書いたテキストファイルを作って「MBScriptLuncher.cfg.txt」って名前で「MBのインストールフォルダ\bin\config\」に保存
Script1;Script1.py
Script2;Script2.py
・・・
from pyfbsdk import *
from pyfbsdk_additions import *
import os
class CustomButton(FBButton) :
def __init__(self, scriptPath='') :
FBButton.__init__(self)
self.scriptPath = scriptPath
class scriptLuncher() :
def __init__(self, name, w, h) :
self.cfgpath = os.path.normpath(os.path.join(FBSystem().ApplicationPath, '..\\config\\MBScriptLuncher.cfg.txt'))
self.scriptList = list()
self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h
x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)
layout = VBoxLayout()
self.tool.SetControl('mainLayout', layout)
self.getScriptList()
for sl in self.scriptList :
btn = CustomButton(sl[1])
btn.Caption = sl[0]
btn.OnClick.Add(self.onClick)
layout.Add(btn, 20)
def show(self) :
ShowTool(self.tool)
def onClick(self, ctl, event) :
FBApplication().ExecuteScript(ctl.scriptPath)
def getScriptList(self) :
if not os.path.exists(self.cfgpath) :
return
f = open(self.cfgpath, 'rt')
while 1 :
buf = f.readline()
if '' == buf :
break
if '\n' == buf :
continue
self.scriptList.append(buf.replace('\n','').split(';'))
f.close()
scriptLuncher('MBScriptLuncher', 300, 280).show()
ここまでやると結構使えると思うけど、スクリプトファイルをドロップしてボタンが追加できると便利じゃね?
from pyfbsdk import *
from pyfbsdk_additions import *
import os
import re
class CustomButton(FBButton) :
def __init__(self, scriptPath='') :
FBButton.__init__(self)
self.scriptPath = scriptPath
class scriptLuncher() :
def __init__(self, name, w, h) :
self.cfgpath = os.path.normpath(os.path.join(FBSystem().ApplicationPath, '..\\config\\MBScriptLuncher.cfg.txt'))
self.scriptList = list()
self.tool = CreateUniqueTool(name)
self.tool.StartSizeX = w
self.tool.StartSizeY = h
x = FBAddRegionParam(0,FBAttachType.kFBAttachLeft, "")
y = FBAddRegionParam(0,FBAttachType.kFBAttachTop, "")
w = FBAddRegionParam(0,FBAttachType.kFBAttachRight, "")
h = FBAddRegionParam(0,FBAttachType.kFBAttachBottom, "")
self.tool.AddRegion('mainLayout','mainLayout', x, y, w, h)
self.tool.OnShow.Add(self.onShow)
self.layout = VBoxLayout()
self.tool.SetControl('mainLayout', self.layout)
con = FBContainer()
con.OnDragAndDrop.Add(self.onDragDrop)
self.layout.Add(con, 20)
self.getScriptList()
for sl in self.scriptList :
btn = CustomButton(sl[1])
btn.Caption = sl[0]
btn.OnClick.Add(self.onClick)
self.layout.Add(btn, 20)
def show(self) :
ShowTool(self.tool)
def onClick(self, ctl, event) :
FBApplication().ExecuteScript(ctl.scriptPath)
def getScriptList(self) :
if not os.path.exists(self.cfgpath) :
return
f = open(self.cfgpath, 'rt')
while 1 :
buf = f.readline()
if '' == buf :
break
if '\n' == buf :
continue
self.scriptList.append(buf.replace('\n','').split(';'))
f.close()
def onShow(self, ctl, event) :
if False == event.Shown :
self.saveScriptList()
def saveScriptList(self) :
f = open(self.cfgpath, 'wt')
for sl in self.scriptList :
f.write('%s;%s\n'%(sl[0], sl[1]))
f.close()
def onDragDrop(self, ctl, event) :
if FBDragAndDropState.kFBDragAndDropDrop == event.State :
for c in event.Components :
path = c.LongName
if 'py' != path.split('.')[-1] :
continue
p = re.compile('Drive ([A-Z])(.*)')
m = p.match(path)
if None == m :
continue
path = m.group(1) + ':' + m.group(2)
name = path.split('\\')[-1].split('.')[0]
self.scriptList.append([name, path])
btn = CustomButton(path)
btn.Caption = name
btn.OnClick.Add(self.onClick)
self.layout.Add(btn, 20)
scriptLuncher('MBScriptLuncher', 300, 280).show()
ファイルのドロップを受け付けるコントロールが限られているのでFBContainerを使った
レイアウトにOnDragAndDropを付けてくれればいいのに
あと、折角追加したボタンがコンフィグファイルに保存されないのはアレなのでウインドウを閉じる時に保存するようにした
次回は選択されているオブジェクトを取得してFCurveをいじる
2010年12月11日
MotionBuilder スクリプトチュートリアル GUI編1
一応書く予定は
ウインドウとかボタンやリストみたいなコントロールなどGUI
選択されているオブジェクトの取得
FCurveへのアクセスと修正
Relationコンストレインの追加
Storyのトラック、クリップの取得、修正、追加
Storyのショットトラックを参照してプレイブラストを作る
今回はウインドウの表示から基本的なレイアウトまで
続きを読む
2010年08月01日
2010年05月19日
デジハリの公開講座に行ってきた
「人の心を動かす配色術」 っていうセミナーに行ってきた。
デザインの仕事を5年くらいやってたんだが、平面構成とか色彩心理は独学というか周りの人やディレクターに教わりながら覚えたので、
ちゃんとした先生に教わるのもいいかなと思って申し込んでみた。無料だし。
多分ウェブデザイナー向けのセミナーだと思うけど、
こういうのはウェブに限らず映像制作やゲーム制作などビジュアルに関するものなら何でも有効だと思うので覚えておいて損はないかと。
こういうのを知ってると絵コンテを見て演出意図がなんとなくわかるので、リテイクは減るし、
上手くいけば監督に名前を覚えてもらえるしで良いこと尽くめですよ。
で、セミナーの内容は色紙を使った心理テストだった・・・。
無料セミナーなのでこんなもんかとは思ったものの凄ぇ損した気になったので、 勉強してきたって気分になれるように今まで覚えたものをまとめてみた。

単色だとこんな感じ。色相とトーン(彩度+明度)を分けるといちいち色の名前とか覚えなくていいのでわかりやすい。
単色ってことは滅多にないので他の色と組み合わせた時に目的の色が引き立つような配色をする。
実は、組み合わせや大きさの割合とかでイメージが変わってくるのでこんなに単純じゃないけどね。
2010年04月29日
[XSI ネットビュー] ネットビューでローカルwikiを使ってみる
今までネットビューなんて使ったことが無かったんだけど、 今の職場ではみんな好き勝手にデータを管理してるから何かトラブった時に原因究明が困難なので、 ネットビューを使ってルールを強制しちまおうと思って使い始めてみた。
続きを読む2010年01月05日
XSIスクリプト] 小物スクリプト
ここに追加。
「トラックバック受け付けるようにすれば詳しい使用法書かなくて済むじゃん」と、わざわざ実装したのにスパムまみれで挫けそうです。
・Constraint.js
ここにあるのを修正したヤツ
プログレスバーを追加して、CnsCompボタンを反映させるようにした。
・CopyNullShape.js
ヌルのサイズとアイコン?シェイプ?見た目?をコピーする。
ヌルを選択→実行→他のヌルをピック
・CopyWireColor.js
junkiさんのはいカラさんから自分の使う所だけ抜き出した。
色が微妙に変わってしまう所は直した。のでver6以降でないと使えない。
オブジェクトを選択→実行→他のオブジェクトをピック
・DuplicatePlus.js
ここにあるヤツの修正
複製の代わりにヌルに置き換える機能を追加
・LockMotion.js
移動と回転の制限を0に固定する。
書いたはいいけど使い勝手が悪すぎてあまり使ってない。
オブジェクトを選択→実行
・
MatchEnvWeight.js
同ポジにある他のメッシュのウエイト値をコピーする。
デフォーマが足らなかったら追加する。
普通ならあまり使わない類のものだけど、稀にボーンを動かすと隙間が出来るモデルを受け取った時に使う。
こういうモデルを受け取った場合は他のモデルもこんな感じなので備えあれば憂いなしって感じ。
頂点を選択→実行→メッシュオブジェクトをピック
・RemoveUnusedDeformer.js
使ってないデフォーマをエンベロープから外す。
3つくらいしかデフォーマを使ってないのに60個くらいデフォーマが付いてるメッシュがあったので。
こういうモデルを受け取った場(ry
エンベロープのついたオブジェクトを選択→実行
・RenameSequence.js
選択順に連番をつける。
Shiftを押しながら実行した場合、ベース名は最初に選択したオブジェクトの名前になる。
オブジェクトを選択→実行→パネルが開く
オブジェクトを選択→Shiftキー+スクリプトを登録したボタンを押す→最初に選択したオブジェクトを元にリネーム
・ReplaceImage.js
イメージのパスを変更する。
命名規約が変わった時に使うと便利。
イメージソースを選択→実行
・SelectIslandFromComponent.js
頂点、
エッジからポリゴンアイランドを選択する。
インストール型なので Application>Pluginsフォルダにコピーしてから使う。
一応コンポーネントモードの時の右クリックメニューで実行できるようにしてある。
頂点またはエッジを選択→実行→選択された頂点、エッジを含むポリゴンアイランドが選択される





