« 2012年4月 | トップページ | 2012年6月 »

2012年5月

2012年5月18日 (金)

木馬責めの彼。

いや、作ったのは俺じゃないですってばw



クラシカルな煙草の看板の上で、
ひとり木馬責めの愉悦に浸るあの男。
しかも今日は全裸デフォルトPhongではなく、
テクスチャ着ててちょっとオサレ。


XSI だけでなく、
AE の発展にも協力するあの男。
国民栄誉賞をあげたい。
っていうか住民票をあげたい。

住所は、


  嘔吐デスク国 DCC県 3DCG郡 XSI村 大字プリミティブ 字キャラクタ 69番地


でいいでしょうかね?





.

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

2012年5月17日 (木)

テクスチャリンク切れはもううんざりですよね。

ええ、うんざりです。





ひとまずやっつけで。



JScript
----------------------------------------------------------------

DefPath = "";


var oImageSources = FilterImageSource( Selection );
if ( oImageSources.count == 0 )
{
    Logmessage( "ドルァ" );
}
else
{
    var oP = XSIFactory.CreateObject( "CustomProperty" );
    oP.name = "テクスチャリンク切れはもううんざりですよね。";
    oP.AddParameter2( "sPath", siString, DefPath );
    var oL = oP.PPGLayout;
    oL.AddSpacer( 0, 150 );
    var oItem = oL.AddItem( "sPath", "Path", siControlFolder );
    oItem.SetAttribute( siUINoLabel, true );
   
    Inspect = InspectObj( oP, null, null, siModal, false );
    if ( !Inspect )
    {
        PicPath = oP.sPath.value;
        for ( var i=0; i<oImageSources.count; i++ )
        {
            var oSrc = oImageSources(i);
            OldPath = oSrc.FileName.value;
            aPath = OldPath.split( "\\" );
            NewPath = PicPath + "\\" + aPath[ aPath.length-1 ];

            Logmessage( OldPath + " -> " + PicPath + aPath[ aPath.length-1 ] );   
            oSrc.FileName.value = NewPath;
        }
    }
    else
    {
        Logmessage( "モルァ" );
    }
}


function FilterImageSource( in_Objs )
{
    var oCol = XSIFactory.CreateObject( "XSI.Collection" );
    for ( var i=0; i<in_Objs.count; i++ )
    {
        if ( in_Objs(i).type == "ImageSource" )
        {
            oCol.Add( in_Objs(i) );
        }
    }
    return oCol;
}

----------------------------------------------------------------



使い方。
ExplorerSources/Clips モードにします。
テクスチャのリンクが切れている Image Source を選択します(複数可)。
スクリプトを実行します。
ダイアログで、テクスチャがあるフォルダを選択してOK押します。
するとテクスチャのリンクが指定したフォルダ以下のその画像ファイルに貼り直されます。
以上。



エラーチェックも何もしていません。 そのフォルダに実際にそのテクスチャ画像ファイルがあろうとなかろうと、強制的に Image Source の FileName パラメータを書き換えます。 
なので目的の画像ファイルが存在しないフォルダを選んでしまうと、そもそもリンク切れではなかったものがリンク切れになってしまうことすらあり得ます。


基本的に、テクスチャ画像ファイルのファイル名は同一のままフォルダだけ移動させたとかそういう時に使います。そのフォルダ以下に、元のファイル名と同名でテクスチャ画像ファイルがあると分かっている時以外は、使ってはいけません。かえっておかしくなります。





いずれ改良するつもりですが、現状は最低限仕様です。危険です。


ちなみにスクリプトの冒頭でデフォルトのフォルダPathを書いておけば、起動した時にその Path が既に入力されている状態になっているので、少し楽かも知れません。

  DefPath = "";


この "" の中に、C:\\junki\\Pictures などと書いておけばいいということです。 なぜかバックスラッシュは2個 \\ と書かねばなりません。 これ、なぜなのでしょう。 エスケープなんとか? 違いますか。



今後の改良点:

フォルダの存在の有無のチェック
フォルダ選択だけでなく、ファイル選択によっても Path を選べるようにする
テクスチャ画像ファイルが無かった場合はスルー
ImageSource 以外のものを選んでいても動くようにする
(例えば ImageClip とか、MatLib とか)


とかなんとか。
やるかも知れません。やらないかも知れません。分かりません。



ではでは。

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

2012年5月16日 (水)

最優秀クラウド賞。

今年のアカデミー賞 VFX 最優秀クラウド賞はこれに決定したそうです。






こんなの作ってたのかw
やるなおっちゃんw
このヘッドバンギングの感じ、なんだっけ、こういう人形みたいなのなかったっけ。





しかしこの男は、レンダすると本当にスケキヨに見えますね。
水中逆立ちが得意、とか。




.

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

2012年5月15日 (火)

ヌルとかの方向でポン2。

コメント欄で sara さんが教えてくれますた。




Nulldirtovector


こんな簡単なのー




ヌルの方向を、ICE の何らかのベクタに突っ込む方法。
まあ、もちろんヌルじゃなくても、3Dオブジェクトなら何でもいいんですが。


Global Transform
をゲットして、 4x4 Matrix to 3D Vector とやらにつなぎ、3つあるアウトプットの Vector を任意のベクタにつなぐだけ。

Vector 1, 2, 3 がそれぞれ、ヌルのグローバルのローテーション X, Y, Z に対応しているようです。 つまり Vector 3 を使えば、ヌルのZ方向が得られます。

上の作例では、Emit というオレンジ色のヌルをエミッションの方向に、 Wind という青いヌルを Wind Force の方向につないでいます。 うん、これが楽ちんでいいね。





以前の記事でも、ひと様がやっていたツリーを猿真似しただけでしたが、
今回も猿真似です。
でももう、深く考えない。
覚えてしまう。






sara さん、ありがとござました(゚∀゚)





.

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

2012年5月 9日 (水)

嘔吐 Actions。

Action の Export って、複数をイッキにできないですよね。


XSI のモーションモジュールで、 Tools > Import/Export > Export Action ってのがあって俺はよく使うのですが、一度にひとつの Action Source しか吐き出せません。 複数の Action Source をイッキに吐き出してはくれないわけです。 それどころか、複数の Action を選んだ状態で ExportAction を実行すると、意味不明のエラーを吐きます。


ほら。

Exportmultipleactions

「すいませんが、アクションは、ひとつだけ選んでおいてもらえますかね」 とかエラーを出すならまだしも、Unexpected failure ですからね。 予期せぬ失敗だそうです。 いわゆるソーテーガイってやつですね。 複数選んでいる状態はソーテーできなかったということでしょうか。 
それくらいソーテーしろよ( ^∀^)ゲラゲラ




ほんと XSI って、値段高いくせに、こういう細かいところで不親切ですよね。不親切というより、なんつうか、頭弱いですよね。 アクションの吐き出し機能を付けるなら、普通、複数いっぺんに出来るようにするでしょう? 俺でも気付くよそんなこと。 まあ、そこは置いといたとしても、このエラーメッセージは無いでしょう。ちゃんとエラー処理しなさいよもう。


まあ、XSI は Maya 様や Max 様のプラグインなのだから、仕方ないとは思いますけどね。



別にバグとかそういうわけではないでしょうね。一度に1つしか書き出せない仕様なわけですよ。  「マニュアルにもいっぺんに複数吐き出せるとは書いてないので、マニュアルに反してないという意味で、不具合ではありません」  とか、 「メニューの表記も Export Action であって Export Actions ではないから、これでいいのです」 とか言うのかな嘔吐デスク様は。 まあ、いいです。 普通に仕様です。 何もおかしくはありません。 実に興味深い仕様ですけどね。



ちなみにアクションのインポートも、ファイルダイアログを通すと一度に1つしか実行できないという謎仕様です。 これって、もしかして XSI のダイアログの設計上の制限かな? XSI 作業の他の場面でも、複数のファイルをいっぺんに選択できるってのは無いですよね? あの XSI 専用入出力ダイアログが、ファイルの複数選択に対応してないということなんでしょうか? どうなのでしょう。

ま、アクションのインポートは Windows の Explorer から複数をいっぺんにドラッグ&ドロップできるので、そんなには困りませんけどね。




ともかくだ、複数の Action Source をいっぺんに吐き出すスクリプトは、過去に数回書きました。 昨日またそれが必要になって、いつものクセでスクリプトエディタを開いて書き始めたら、過去に何回か書いたことをふと思い出してHDD をひっくり返してみたら出てきたので、今回は無駄なコード書きを避けられました。  あ、これ、タコ親父のアクションを吐き出す時に書いたやつだな。 リグの都合上、触手1本ごとに違う Model だったので、アクションのストアもいっぺんにできないし、書き出しもいっぺんにできない。しかたないから色々ツールを書いたんだった。 龍司、今日もちゃんとタコ焼いてるか。 目と目の間をひと突きだぞ。



ま、ともかくそのスクリプトにちょっと改良を加えたので、一応載せておきます。


JScript
------------------------------------------------------------------
//    嘔吐 Actions

//    デフォルト値取得
DefRemove = GetGlobal( "bOutoActions_RemoveEani" );
if ( DefRemove == null ) DefRemove = true;

DefModelName = GetGlobal( "bOutoActions_ModelName" );
if ( DefRemove == null ) DefRemove = true;

DefPath = GetGlobal( "sOutoActions_Path" );
if ( DefPath == null ) DefPath = Application.ActiveProject2.path + "\\Actions\\";



//    PPG
var oP = XSIFactory.CreateObject( "CustomProperty" );
oP.name = "嘔吐Actions";
oP.AddParameter2( "bRemoveEani", siBool, DefRemove );
oP.AddParameter2( "bAddModelName", siBool, DefModelName );
oP.AddParameter2( "sPath", siString, DefPath );

var oL, oItem;
oL = oP.PPGLayout;
oL.AddGroup();
    oL.AddRow();
        oL.AddGroup( "", false, 55 );
            oItem = oL.AddItem( "bRemoveEani", "Remove " + '"' + "eani" + '"' + " from Name" );
        oL.EndGroup();
        oL.AddGroup( "", false, 45 );
            oItem = oL.AddItem( "bAddModelName", "Add Model Name");
        oL.EndGroup();
    oL.EndRow();
    oL.AddRow();
    oItem = oL.AddItem( "sPath", "Path", siControlFolder );
    oItem.SetAttribute( siUINoLabel, true );
    oItem = oL.AddButton( "OpenExplorer", "Explorer" )
    oL.EndRow();
oL.EndGroup();

oL.AddSpacer( 0, 10 );
oItem = oL.AddButton( "Export", "げろっ" );
oItem.SetAttribute( siUICX, 0 );

oL.Language = "JScript";
oL.Logic =    Export_OnClicked.toString( ) +
            OpenExplorer_OnClicked.toString( ) +
            FilterAction.toString( ) +
            DoTheFuckExport.toString( );

function OpenExplorer_OnClicked()
{
    var oFSO = new ActiveXObject( 'Scripting.FileSystemObject' );
    FolderPath = PPG.sPath.value;
    if ( oFSO.FolderExists( FolderPath ) )
//    フォルダ存在
    {
        XSIUtils.LaunchProcess ( "explorer /e," + FolderPath);
    }
    else
    {
        Logmessage( "そんなフォルダは無いので帰って下さい。", siError );
    }
}

function Export_OnClicked( )
{
    var oFSO = new ActiveXObject( 'Scripting.FileSystemObject' );
    FolderPath = PPG.sPath.value;
    if ( oFSO.FolderExists( FolderPath ) )
//    フォルダ存在
    {
        var oExportingActions = FilterAction( Selection );
//ActionSource収集
        if ( oExportingActions.count == 0 )
        {
            Logmessage( "Action Source が選択されてなかったので帰って下さい。", siError );
        }
        else
        {
            for ( i=0; i<oExportingActions.count; i++ )
            {
                DoTheFuckExport( oExportingActions(i) );
//Action嘔吐実行
            }

            SelectObj( oExportingActions );
            //    デフォルト値上書き
            SetGlobal( "bOutoActions_RemoveEani", PPG.bRemoveEani.value );
            SetGlobal( "bOutoActions_ModelName", PPG.bAddModelName.value );
            SetGlobal( "sOutoActions_Path", PPG.sPath.value );
        }
    }
    else
    {
        Logmessage( "そんなフォルダは無いので帰って下さい。", siError );
    }   
}


//    嘔吐実行ファンクション
function DoTheFuckExport( oAction )
{
    ActionName = oAction.name;
    if ( PPG.bRemoveEani.value )   
//    名前から _eani 削除
    {
        ActionName = ActionName.replace( "_eani", "" );
    }
    if ( PPG.bAddModelName.value )   
//    名前に Model名を付加
    {
        ActionName = oAction.Model.name + "_" + ActionName;
    }
    Path = FolderPath + "\\" + ActionName + ".eani";
    ExportAction( oAction, Path );
    Logmessage( "Action ゲロ完了す。 --> " + Path );
}


//    Action のみを返すファンクション
function FilterAction( in_Objs ){
    var oCol = XSIFactory.CreateObject( "XSI.Collection" );
    for ( var i=0; i<in_Objs.count; i++ ){
        if ( in_Objs(i).type == "Action" ){
            oCol.Add( in_Objs(i) );
        }
    }
    return oCol;
}

InspectObj( oP, null, null, siLock );


------------------------------------------------------------------




Outoactions

Explorer から、ActionSource を選びます。もちろん複数可能。 っていうか複数じゃないときはこのツールを使う意味は全くないと思います。

で、スクリプトエディタにこのコードをペーストして起動し、PPG の中で嘔吐先の Path を入力してゲロボタンを押すと、そのフォルダに Action を全部ゲロします。




Explorer ボタンを押すと、嘔吐先の Path を Windows の Explorer で開きます。

Remove "eani" from Name をチェックしておくと、もともとのアクション名に "_eani" が含まれていた場合、それを削除した名前にします。 インポートによって作られた Action Source って、その名前にファイルの拡張子が付いちゃうんですよね。 eani ファイルをよくインポートするので、xxxx_eani という名前のアクションになることが多いです。 普段は放置したりもするけど、改めて書き出すときは削除したいので、この機能を付けました。

Add Model Name
をチェックしておくと、ゲロするファイルの名前の冒頭に "Model名_" が付加されます。 これは、複数 Model 以下で同じ名前の Action Source を書き出そうとした場合、このスクリプトは次々に上書きして行ってしまうため、ゲロしたはずのファイルが見当たらない、という事態になります。単に同じ名前で上書きされていただけなんですがね。 これを避けるために、 Model 名を付加する機能を付けました。







スクリプティング的に特筆するべきことは、まあ、ないですかね。

Get / SetGlobal を使ってその XSI セッション中は PPG に入力した値を覚えていて、次に起動したときに前回の設定がデフォルト値として入っているようにしています。 最近の自分の中での流行りですね。 Preference に残すほどでもないけど、起動するたびに設定がスクリプトにハードコーディングされた固定値に戻ってしまうのは嫌だ、という場合にこうしています。







しかし、もともとはすごく小さいスクリプトだったのに、ちょっとした機能を付けようとしただけで、なんか長くなっちゃいますねえ。


アクションがらみの細かいスクリプトも溜まってきているので、そのうちまとめたツールセットにしたいんだけど、今のところとっ散らかってます。






それではごきげんよう。




.

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

2012年5月 1日 (火)

なんで 1+18 とか好きなんですか。

今日、カットの尺に関わる色んなことをやってて、
ふと思いついてババっと書いてみました。
書きたてほやほや。



なかなか便利だと思うんですがどうですか。
アニメな仕事をしてると特に。


アニメの世界って、 1 + 18 とか、そういう書き方するじゃないですか。
アニメじゃなくてもそうだっけ?



で、 1 + 18 って、いったい何フレームになるんだ? とか、一瞬で出てこないこともあるじゃないですか。


あるいは、「42枚」 っていうトータルフレーム数が先に分かってて、何らかの都合で 秒 + フレーム のフォーマットでテキストを書かなければいけないとか、そういう時。 一瞬で 42枚が 1 + 18 に脳内変換できればいいんですが、まあ 1 + 18 は仮になんとかなったとしてもですよ、例えば 「181枚」 とか言われたら俺はお手上げです。




そういう時に使うスクリプトです。

 小数点付き総秒数

 総フレーム数

 秒 + フレーム数

の3つの書き方の変換を自動でやってくれるという、そういうスクリプトです。




JScript
------------------------------------------------------------------

//    なんで 1+18 とか好きなんですか。

var oP = XSIFactory.CreateObject( "CustomProperty" );
oP.name = "なんで 1+18 とか好きなんですか。";
oP.AddParameter2( "dFrameRate", siDouble, 24 );
oP.AddParameter2( "iIntSeconds", siInt4, 1 );
oP.AddParameter2( "iDecFrames", siInt4, 12 );
oP.AddParameter2( "dTotalSeconds", siDouble, 1.500 );
oP.AddParameter2( "iTotalFrames", siInt4, 36 );

var oItem, oL;
oL = oP.PPGLayout;

oL.AddRow();
    oL.AddGroup( "", false, 50);
        oL.AddSpacer( 0, 50 );
        oL.AddStaticText( "                (・∀・)?" );
    oL.EndGroup();

    oL.AddGroup( "", true, 50);
        oItem = oL.AddItem( "dFrameRate", "Frame Rate" );
        UIUI( oItem, 40 );

        oL.AddGroup( "Duration Total" );
            oItem = oL.AddItem( "dTotalSeconds", "in Seconds" );
            UIUI( oItem, 60 );
            oItem.SetAttribute( siUIDecimals, 4 );
            oItem = oL.AddItem( "iTotalFrames", "in Frames" );
            UIUI( oItem, 60 );
            oItem.SetAttribute( siUIDecimals, 4 );
        oL.EndGroup();
        oL.AddGroup( "", false, 25);
        oL.EndGroup();

        oL.AddGroup( "Seconds + Frames" );
            oL.AddRow();
                oItem = oL.AddItem( "iIntSeconds", "Seconds + Frames" );
                UIUI( oItem, 35 );
                oItem.SetAttribute( siUINoLabel, true );

                oL.AddStaticText( "+" );

                oItem = oL.AddItem( "iDecFrames", "bb" );
                UIUI( oItem, 35 );
                oItem.SetAttribute( siUINoLabel, true );
            oL.EndRow();
        oL.EndGroup();
    oL.EndGroup();
oL.EndRow();

//    ####################################################
InspectObj( oP, null, null, siLock );

//    ####################################################
function UIUI( oItem, X )
{
    oItem.SetAttribute( siUINoSlider, true );
    oItem.SetAttribute( siUICX, X );
}

//    ####################################################

oL.Language = "JScript";
oL.Logic =    OnInit.toString()+
            dFrameRate_OnChanged.toString()+
            DurationTotalToSecFrame.toString()+
            SecFrameToDurationTotal.toString()+
            iIntSeconds_OnChanged.toString()+
            iDecFrames_OnChanged.toString()+
            iTotalFrames_OnChanged.toString()+
            dTotalSeconds_OnChanged.toString();

function OnInit()
{
    dFrameRate_OnChanged();
}
function dFrameRate_OnChanged()
{
    SecFrameToDurationTotal();
}
function dTotalSeconds_OnChanged()
{
    fps = PPG.dFrameRate.value;
    Seconds = PPG.dTotalSeconds.value;
    Frames = Seconds * PPG.dFrameRate.value;   
    PPG.iTotalFrames.value = Frames;
    DurationTotalToSecFrame( Frames, fps );
}
function iTotalFrames_OnChanged()
{
    fps = PPG.dFrameRate.value;
    Seconds = PPG.iTotalFrames / PPG.dFrameRate.value;
    Frames = Seconds * PPG.dFrameRate.value;   
    PPG.dTotalSeconds.value = Seconds;
    DurationTotalToSecFrame( Frames, fps );
}
function iIntSeconds_OnChanged()
{
    SecFrameToDurationTotal();
}
function iDecFrames_OnChanged()
{
    SecFrameToDurationTotal();
}

function DurationTotalToSecFrame( Frames, fps )
{
    Seconds = Frames / fps;
    IntSeconds    = Math.floor( Seconds );
    DecSeconds    = Seconds - IntSeconds;
    DecFrames     = Math.round( DecSeconds * fps );
    PPG.iIntSeconds.value = IntSeconds;
    PPG.iDecFrames.value = DecFrames;
}
function SecFrameToDurationTotal(  )
{
    fps = PPG.dFrameRate.value;
    IntFrames = PPG.iIntSeconds.value * fps;
    TotalFrame = IntFrames + PPG.iDecFrames.value;
    PPG.iTotalFrames.value = TotalFrame;
    PPG.dTotalSeconds.value = TotalFrame / fps;
}


------------------------------------------------------------------


Nande


どっかの値を書き換えると連動してそれ以外の値もアップデートされます。 そんだけです。


ちなみにフレームレートを変更したときは、PPG の右下 「 秒 + フレーム 」の情報を基準に、それ以外の値をアップデートします。





今まで、こういうツール、ありましたかね?
俺は見つけたことなくて。
アニメ屋さんにありそうですよね。




書きたて過ぎて、いかにも不具合ありそうです。 特に、29.97fps とか、小数点付きフレームレートにした時にどうなるかあんまり考えてません。

スクリプティング的に特筆すべきことは、すいません、何もないかな。。。。












ところでアニメのコンテを見ているとよく思うんですが、1 + 18 とか 2 + 18 とか、18枚が好きな演出家さんが多い気がしませんか? 18 コマってのはよく見る数字だと思うんですよね。 同様に 1 + 06 とかも多いかな。 

12 なら1秒の半分だからキリが良くてまだわかるのですが、なぜ 6 なのでしょう? さらにその半分、つまり4分の1だから? 18 はその3倍、つまり4分の3だから?

いまひとつスッとわかりません。なんでだろう。




ちなみに上の 6 とか 12 の話は、24fps を基準に言ってますよもちろん。
俺のカラダは完全に 24fps に蝕まれています。
30fps の PAN とか見ると気絶しそうになります。
表現は難しいですが、あえて例えると、
よく冷やした絹ごし豆腐を背中に密着させてつつつーーとスライドさせたような、
そんな気分になります。
卒倒します。

誰だ俺のカラダをこんなにしたのは。
元に戻せ。
俺のカラダにして返せ。



.

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

« 2012年4月 | トップページ | 2012年6月 »