« インパク知~♪ | トップページ | 【号外】BEST of 2010受賞!! ~北米で各賞にノミネートされました~ »

2010年12月21日 (火)スクリプト一色

おはようございます。本日の当番、モーションデザイナーのR.Iです。

今年も残すところ、あと僅かですね。
振り返ってみると色々ありましたが、今年も最後まで頑張ります。

 
さて今回はスクリプトネタも少しあるのでスクリプトの話をしたいと思います。

モーションを作った後、それをデータとして書き出すことがよくあります。
個人的に書いたスクリプトが以下になります。
言語はVBSです。
 
 
'--------------------------------------------------------------
'モーション書き出しスクリプト
'変数宣言
oChild_a_Action = ""
Set oApp = Application
Set oRoot = oApp.ActiveSceneRoot
Set oSel = oApp.Selection

'スタート、エンドフレームの取得
oStart_Def = GetValue("PlayControl.In")
oEnd_Def = GetValue("PlayControl.Out")

'名前と書き出し範囲の設定
If oSel.GetAsText = "" Then
MsgBox("何も選択されておりません")
Else
oName = InputBox("モーション名を入力してください","Input Name",oRoot.Parent)
If oName <> "" Then
oStart = InputBox("書き出し開始フレームを入力してください","Input StartFrame",oStart_Def)
End If
If oStart <> "" Then
oEnd = InputBox("書き出し終了フレームを入力してください","Input EndFrame",oEnd_Def)
End If
End If

If oEnd <> "" Then
'リグの名前取得
Set oSel_Parm = GetValue(oSel.GetAsText())

'アクションaのトップノード名の検索
Set oChild_a = oSel_Parm.FindChildren("Node_a")
Set oChild_a_Parm = GetValue(oChild_a.GetAsText())

'アクションaの子ノード名を検索
Set oChildren_a = oChild_a_Parm.FindChildren()

 
'実行部分
For Each oChild_a_Set In oChildren_a
oChild_a_Action = oChild_a_Action & oChild_a_Set & ".kine.local.posx," & oChild_a_Set & ".kine.local.posy," & oChild_a_Set & ".kine.local.posz," & oChild_a_Set & ".kine.local.rotx," & oChild_a_Set & ".kine.local.roty," & oChild_a_Set & ".kine.local.rotz,"
Next
StoreAction , oChild_a_Action , 2, oName & oPlus_a , False, oStart, oEnd, , , , oStart

End If
'--------------------------------------------------------------


個人的に使っているのでエラー回避処理が甘いですが・・・
一番上のノード(以下トップノード)を選択して実行します。
実行した後、モーションの名前を入力してモーションを書き出します。
「実行部分」で書き出すノード名(Node_a)以下の子ノードを取得し、
適切な書式にしてから、書き出し処理を行っています。

上記のスクリプトを何回か使っていると、
「トップノードを選択するのって少し手間だな」と感じます。

そこでリグの一部を選択し、そのノードからトップノードを
取得する処理を考えてみます。

XSIのSDKに「Parentメソッド」というものがあります。
「Parentメソッド」はノードの一つ上の親を戻り値として返します。
今回の場合、一つ上ではなく、一番上になるのでこのメソッド一回だけでは
取得したいノード名にはとどきません。

なので、選択したノードの親、その親・・・を繰り返していき、
最後に選択されたノード名=トップノードを取得する処理を考えます。
その処理が以下になります。
言語は同じくVBSです。

 
'--------------------------------------------------------------
'トップノード発見スクリプト
Set oApp = Application
Set oRoot = oApp.ActiveSceneRoot
Set oSel = oApp.Selection

Set oFindParent = GetValue(oSel.GetAsText())
while oFindParent <> oRoot.Name
oFindParent_Last = oFindParent
oFindParent = GetValue(oFindParent).Parent
LogMessage(oFindParent)
Wend
LogMessage("Fin")
oSel = oSel.SetAsText(oFindParent_Last)
'--------------------------------------------------------------


XSIの仕様で何もないシーンファイルにも親ノードは存在します。
その親ノードを取得するのに「Application.ActiveSceneRoot」を使います。
スクリプト上で言うと「Set oRoot = oApp.ActiveSceneRoot」がそれにあたります。
試しに「LogMessage(Application.ActiveSceneRoot)」という処理を実行すると
わかりやすいかと思います。

「while」で選択されているノードが「Application.ActiveSceneRoot」になるまで
選択したノードの親、その親・・・を繰り返していきます。
この処理によって、スケマティックビューから選択して実行しなくても
作業画面からノードを選択するだけで、そのノードが属しているトップノードを
選択することができます。

以上が今回のスクリプトの話になります。

最近、メソッドや関数などヘルプを見ながら、少しずつ理解してきました。
選択しているノードがオブジェクトなのか、モデルなのか、
また、そのノードはどんなメソッドを持っていて、
そのメソッドを使って何が取得できるのか?など普段、あまり意識しない
内部的なことをスクリプトを作ることで理解することができます。

画面に立方体一つ表示するにしても、色んな処理が内部では行われているので、
調べてみると面白いと思います。
今年、自分が書く最後のブログはスクリプト一色になってしまいましたが、
来年も一色にできそうなら、また書きたいと思います。

「えっ?また書くの?」とかは無しでお願いします。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2010/12/post-08d2.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« インパク知~♪ | トップページ | 【号外】BEST of 2010受賞!! ~北米で各賞にノミネートされました~ »

モーションデザイナー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: スクリプト一色:

« インパク知~♪ | トップページ | 【号外】BEST of 2010受賞!! ~北米で各賞にノミネートされました~ »