« 2013年1月 | トップページ | 2013年3月 »

2013年2月

2013年2月28日 (木)

GetFullChinPath。

某所で話が出ていて俺も脊髄反射的に書き始めたが出遅れてしまい、そしてあまりにも気品があり過ぎるスクリプトであるためにここでしか書けないから書いておきますとかなんとか。




GetFullChinPath (JScript )
-----------------------------------------------------------------

//フルチンパス表示ループ

for ( var i=0; i<Selection.count; i++ )
{
    var oObj = Selection(i);
    FullChinPath = GetFullChinPath( oObj );
    Logmessage( oObj.Name + " --> " + FullChinPath ); // べろ~ん
}



//    シーンルートにたどり付くまでさかのぼる
function GetFullChinPath( oObj )
{
    var oParent = oObj.Parent;
    FullChinPath = oObj.Name;
    while( oParent.Name != ActiveSceneRoot.Name )
    {
        FullChinPath = oParent.Name + "." + FullChinPath;
        if ( oParent.Name == ActiveSceneRoot.Name )    break;
        else var oParent = oParent.Parent;
    }

    FullChinPath = ActiveSceneRoot.Name + "." + FullChinPath;
    return FullChinPath;
}


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

このスクリプトのダウンロード  (右クリックで保存)





オブジェクトを選んで(複数可)実行すると、そのオブジェクトのフルパス(シーンルートからの親子構造をたどったパス)がスクリプトエディタに表示されます。 フルですよ。 べろ~んと、恥ずかしげもなく、いつぞやの草薙くんのように、フルフルで表示されます。実に男らしい。 


そんだけのスクリプトです。




このような感じ↓

Full1





3Dオブジェクトじゃなくとも、プロパティとかオペレータとかでも効くみたい。

Full2

要は Parent プロパティが効けばなんでもいいってことね。たぶん。







今日はなんだかブログをよく書く日だなあ。
仕事の進捗とは逆2乗則ですね。 ええ。





べろ~ん





.

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

オブジェクトをぬるる~んとヌルに置き換える。

Mox さんが、アニメーションやらコンストレインやらを保持したままオブジェクトを全てヌルに置き換えるスクリプトを開発なさったそうです。

http://mox-motion.com/info/moxreplacenull.html




で、けっこう難儀して開発したという話を開発が終わってから読んだんですが、もしかしたらあの現象を利用すれば意外と簡単にできるんじゃないのかな、とふと思いついて書いてみたというだけのアレです。


あの現象とは、子供がいるオブジェクトを削除しようとすると削除されずにヌルに置き換わるという現象です。 手動で削除しようとすると、子供がいるときは削除できませんよね。 この現象です。 現象というより仕様ですわね。 だって親を亡くしたら子供は生きていけませんもの。 子供が階層からカットされるまでは、つまり親から自立するまでは親は死ぬことを許されず、責任持って子供を養育せねばなりません。 子供思いの XSI 様の慈悲仕様です。 



というのをスクリプトでやってみたら、できたように見える、というアレです。



ぬるるん
(JScript)
------------------------------------------------------------------------

//    処理対象になるオブジェクトを oAll にブチ込む(ブランチ選択なら階層全て)
var oCol = XSIFactory.CreateObject( "XSI.Collection" );
oCol.items = Selection;
var oAll = oCol.expand();

//    ダミー子供ヌル格納容器
oDummyChildNulls = XSIFactory.CreateObject( "XSI.Collection" );

//    処理対象オブジェクトをループ
for ( var i=0; i<oAll.count; i++ )
{

    var oObj = oAll(i);
    var oFurtherChildren = oObj.Children;//    更に子供がいるかどうか

   

//    子供が居ない → つまり階層の一番下 → 削除されてしまう → (゚д゚)マズー → ダミーの子供を出産
    if ( oFurtherChildren.count == 0 )    oDummyChildNulls.Add( oObj.AddNull() );

   

//この時点で必ず子供がいる状態になっているので、安心して親ブチ殺し→子供がいるから削除されずヌルに変身
    DeleteObj( oObj );
}

//    最後にダミーの子供を殺害して終了
DeleteObj( oDummyChildNulls );

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

このスクリプトのダウンロード(右クリックで保存)





例えばこういう状態。

Nulllun1

階層があって、それぞれFカーブを持っていたり、エクスプレッションが入っていたり、コンストレインされていたりします。カスタムパラメータを持っているものもあります。


次にブランチ選択します。

Nulllun2

ブランチセレクトしているとその階層に含まれるオブジェクト全てが対象になります。 グループを選択しているとグループのメンバが対象になります。

で、スクリプトを実行すると、

Nulllun3

ヌルに置き換わりました。スケマティックやエクスプローラのアイコンがヌルに変わっているのがわかると思います。 PPG を表示させても、ちゃんとヌルが持つプロパティを持っています。

で、Fカーブもエクスプレッションもコンストレインもカスタムプロパティもそのまんま保持されているように見えます。 もちろんオブジェクトの名前もです。 Mox さんの方では再現できてないというワイヤカラーも保持されてますね。 ほんと、すべてそのままで、単にジオメトリがヌルに置き換わっただけという風に見えます。 どうでしょうか Mox さん。 これで目的のことはできますかね・・・・?


スケルトン階層や Model やカメラがヌルに置き換えられないというのは、Mox さんのと同じですね。 これはもう仕方ないと思います。 その部分だけ違う方法で特別にヌルに置き換えていくルーチンを書かなければいけませんね。




スクリプト的には、解説する必要もないほどシンプルだと思います。


冒頭、Expand の魔法でブランチ選択とかノード選択とかによる対象オブジェクトの選別をやっています。

あとは、対象オブジェクトをループして、子供がいるかどうかを調べます。子供がいれば、何もせずただ削除します。 削除と言っても、上で書いたように子供がいるなら親は殺されないという現象を利用した削除ですので、実際は削除されずにヌルに置き換わります。

子供がいなかった場合は、そいつは階層の一番下にいるオブジェクトだということですね。 こいつを削除しようとすると、そのまんま削除されます。 養育すべき子供を持たない奴であれば死んで良しという、XSI 様による悪魔仕様です。 でも死なれたら困るので、ダミー子供としてヌルを出産させます。 こうして養育すべき子供を持ったので、安心して削除にかけることができます。もう子供がいるから、削除されずにヌルに変身します。

そして最後にダミーの子供達は丸ごと殺害します。用済みだからです。


という風に、子供がいると削除されずにヌルに置き換わり、もろもろの属性はそのまんま保持されているらしいという現象に100%依存したスクリプトです。 5分かそこらで書けましたが、Mox さんの話も聞かずに勝手に書いたものですから、これが Mox さんのやりたかったことと合致するかどうかは XSI 様のみぞ汁です。


どうでしょうかね。

.

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

余白なカメラ。

これもまた、何年か前に書いたツールなんですけど・・・・。




余白付きでレンダしたいことって、よくありますよね。 2D画ブレ対応とか画像端っこのボケバレ防止とかそういう時に、10%増しとか20%増しのサイズになるよう余白を付けたりするじゃないですか。 それをやるツールです。


余白なカメラ。

http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html






最初から余白付きのカメラで作業してるぜ
、という人には要りませんね。 俺なんかは、まず最初はあまり深く考えずラフにカメラをやって、その時は当然余白のことなんて気にもせずに作業して、最後の最後に余白を付けたい場合が多いんですよね。 


あるいは、たとえ最初から余白つきのカメラで作業していたとしても、その余白の部分も見える状態で作業していると絶対にパース感を間違えてしまうので、余白部分は隠したいわけです。 AE などで本来のフレームの大きさのコンポに入れたとき、つまり余白を切り取った状態で見たときに、「あれっ もっとワイドな絵にしたつもりだったのに、なんか狭いぞっ」 と感じてしまうわけですよ。 そりゃそうですわね、余白の分だけ画角が広い状態で見ているわけですからね。 なので、カメラをいじっている間は余白無しのぴったり最終サイズで作業するか、余白部分はマスキングして隠したいわけです。


また、レンズ(FOV)のアニメーション( = ズームアニメーション)をしないのであれば、余白無しで作業しておいて最後にカメラの Projection Plane で広げてやればいいので、まあ手でやってもそんなに大変ではないかな、とは思いますが、ズームが入るとね、FOV がイコールじゃないわけで、そこにエクスプレッションなどが必要になると思います。 それを毎回書くのは面倒なのでね。



とかなんとかのツールです。
既存のカメラに対して、余白付きの新しいカメラを作ります。
余白部分は見えないように板オブジェクトで隠すみたいなこともできます。





ところで余談ですが余白ってタテヨコ10%増しとかいう場合が多いように見えるけど、個人的にはタテヨコを同じパーセンテージで拡張するのは違和感があります。 16:9 なり 4:3 なりの横長の映像をやっているんだから、%が同じだとタテとヨコで余白のピクセル数が違ってきてしまいます。 そしてなぜ余白が必要なのかという目的を考えたときに、タテの余白がヨコよりも小さくても良い合理的な理由が、俺には思いつかないのです。

なので俺なんかは、タテヨコで同じピクセル数だけ余白を付けることが多いです。

この方法のデメリットは、余白付きの画像のアスペクトレシオが元とは違ってきてしまうために分かりにくいことでしょうかね。 オリジナルと余白付きで同じ比率だった方が間違いは少ないでしょうね。 でもまあ、余白ってそういうもんじゃないか。






最近はレンダの解像度もでかいですから、余白が増えるのも馬鹿にならないですよね。余白付けるのはタダじゃないってことですよ。 4K とか 8K とかいう時代になったら、余白の有り無しでレンダ時間やファイルサイズにどれくらい影響があるんでしょう。ああ恐ろしい。そんなひどい時代が来る前にCGなんて仕事は辞めてしまいましょうねみなさん。 ええ、そうしましょう。




.

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

2013年2月25日 (月)

GAP。 (XPOP普及委員会その17)

すんげえ昔に書いたツールを、一応ね、投下してみます。
超俺様仕様なツールですけどね・・・・。





GAP。 アニメーションを撃滅するプラグイン。

http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html



内容はビデオの通り、選択したオブジェクトからアニメーションを削除するというツールです。 XSI 標準のやり方が気に入らなかったので書いたといういつものアレです。





しかし、今さら XPOP2 を使うなんて、ねえ。 しかもダウンロードページで書いてますが、今どきの 64bit 環境だと、RCTools から単体でぶっこ抜いた XPOP のコマンドが必要っぽいという、実に面倒なことになってます。

ま、このツール書いたのはもう数年前ですからね。 その頃は XPOP2 黄金期でした(俺的に)。

っていうか今でも XPOP2 は素晴らしく便利ですよ。 軽いのがいい。 XPOP は 3 になってから重くなっちゃいましたからね。  まだまだ XPOP2 で行けますよ



いずれ XPOP3 バージョンや、XPOP 非依存バージョンを作るかも。 俺の体的には、もはや無いと生きていけないツールになっちゃってます。  まあ、超俺様仕様過ぎて万人向けではないよなあ。。。。




.


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

2013年2月21日 (木)

さよならロトスコープ。

またもや小ツールを・・・・。





ロトスコープ画像とさよならするツールです。
シーン内の全てのカメラからロトスコープ画像を取り除きます。

もしくはロトスコープ画像が設定されているカメラを選択します。




さよならロトスコープ
http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Sayonararoto_menu



ほとんどの用途は、例によってシーン整理のためですね。 人から渡されたシーンだと、特に。


例えば不要のイメージソースとか削除する時に、どのマテリアルにも使われていないはずなのに、Delete Unused Image Sources とかでヒットしてくれず、いつまでもシーンに残ったままのイメージソースってよくあるじゃないですか。 こういう時、大抵はどっかのカメラにロトスコープ画像として使われている場合だと思います。 そういうのを一気に殲滅、もしくは選択するためのツールであります。











.

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

2013年2月18日 (月)

命名カメラリグ。

カメラの名前に合わせてカメラリグ(カメラルート、インタレスト)の名前をリネームするスクリプトなんですがね。


JScript
---------------------------------------------------------------------
//    命名カメラリグ


//    ここを好みに差し替える
PrefixRoot = "";
PostfixRoot = "_CamRoot";
PrefixInt = "";
PostfixInt = "_Int";


//    リネームしたオブジェクトを格納する箱
var oResults = XSIFactory.CreateObject( "XSI.Collection" );
oResults.Unique = true;

for ( var i=0; i<Selection.count; i++ )
{

    // 選択していたものがカメラじゃなきゃ警告  カメラなら処理
    if ( Selection(i).type != "camera" ) Logmessage( Selection(i).Name + " --> それはカメラじゃないくさい", siError );
    else
    {
        var oCam = Selection(i);

       
        //    CamRoot 見つけるって親の Type を調べるくらいしか方法ないんじゃない?
        var oParent = oCam.Parent;
        if ( oParent.type == "CameraRoot" )
        {
            oParent.Name = PrefixRoot + oCam.Name + PostfixRoot;
            oResults.Add( oParent );
        }
        else Logmessage( oCam.Name + " --> CameraRoot 見つかんないくさい", siWarning );

       
        //    Interest の方は Interest プロパティの戻り値が null かどうかで判断できそう
        var oInt = oCam.Interest;
        if ( oInt )
        {
            oInt.Name = PrefixInt + oCam.Name + PostfixInt;
            oResults.Add( oInt );
        }
        else Logmessage( oCam.Name + " --> Interest が無いくさい", siWarning );
    }
}


//    結果を選択  なんもなければ警告
if ( oResults.count != 0 ) SelectObj( oResults );
else Logmessage( "何も仕事してないくさい", siError );

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

このスクリプトファイルのダウンロード MeiMeiCameraRig.js




カメラを選んで実行すると、インタレストやルートの名前がリネームされ、リネームされた子たちは選択状態になります。 

名前の法則はスクリプト冒頭を好みに合わせて書き換えるというものです。 Prefix + もとのカメラの名前 + Postfix という、3つを連結した名前になります。 無文字のままにすると無文字が連結されます(つまり何も足されない)。 ルートとインタレスト別々に指定します。


以上。





スクリプティング的にちと疑問なんですが、 カメラオブジェクトからカメラルートにたどり着くことはできるんでしょうかね? 

上のスクリプトの場合、カメラの Parent を取得し、その Type が "CameraRoot" かどうかで判断しています。 しかし、カメラの親子をカメラルートから切り離してしまった場合、もはや手がかりがないと思うんです。 親子が切り離されてシーンの全然違うところに居るルートと、もとのカメラをリンクさせる情報が、見つからない。 知っている方教えて下さい。



また、親子が生きている間は、ルート側からカメラをたどることができるように見えます。 カメラルートに対し Camera プロパティを使ってやると、カメラオブジェクトが返って来るからです。

  Logmessage( CamerRoot.Camera );

などと書けばOK。

しかし、これも親子が切り離されてしまうと効かなくなってしまいます。ルートとカメラの親子間に別オブジェクトが挟まってもダメです。カメラがルートの直近の子供の時しか効きません。

ってことで、ルートとカメラの関係を、親子に関係なくリンク付けられる方法を知っている方がいらっしゃいましたら、どうぞその方法をご教示くださいませ。





.

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

2013年2月15日 (金)

男キューブ。

前から作ろうと思ってたんですが、ついに作っちまいました orz


Xsimancube


なんだか見にくいなあ。 小さくなっても見やすいデザインを考えるべきなんでしょうが、まあ、そこまで手を入れる気は毛頭無いという。






これを使っていつでも彼と一緒に仕事をしたいという変態の人のために、ファイルは投下しておきますね。

ダウンロード XSIManCube.zip (190.3K)






インストール方法:


XSI のインストールパス/Application/AutoCam/Texturesフォルダに行き、必要なファイルを上書きする。 以上。

システムファイルを上書きするわけですから、当然自分の責任でやらねばなりません。 何がどうなっても俺は知りません。 先にバックアップをとっておくことを激しくおすすめします。






一応、補助としてこんなスクリプトを書いてみました。
JScript
----------------------------------------------------------------
FactoryPath = Application.InstallationPath( siFactoryPath );
Path = FactoryPath + "\\Application\\AutoCam\\Textures";
var oFSO = new ActiveXObject( "Scripting.FileSystemObject" );
if ( oFSO.FolderExists( Path ) ) XSIUtils.LaunchProcess( "explorer /e," + Path );
else Logmessage( "なにやらおかしいので帰って下さい", siError );
----------------------------------------------------------------



いや、上記のフォルダをウインドウズのエクスプローラで開くというだけなんですがね・・・・。

ま、ともかくこの JScript を実行すると、上記のフォルダが現れるはずです。 で、ここにある PNG ファイル全部、そして ENU と JPN フォルダを丸ごと、適当にバックアップをとります。 


そして、ZIP を解凍して出てきたファイルを上書きします。
VCcompasstext.png VCfacetext.png だけは、ENU と JPN フォルダの中に上書きします。

Viewcubeimagefolder

上記の ZIP ファイルはフォルダごと圧縮していますから、このフォルダ構造ごと解凍できるのであれば、JPN とか ENU はそのまんまフォルダごと上書きしてしまえばいいと思います。




後は XSI を起動し直せばOKです。 これで彼といつでも一緒にいられます。




最初は超馬鹿にしていたビューキューブですが、いやあ、すいませんでした。便利です。 ビューをぐりぐり回すのとかには使わないんですが、上下・左右・前後、逆方向からパッと見れるのが便利ですよね。 あと、あたかもカンバスを90度回転させるかのごとく、Z方向を画面の横方向に向けるだとかね。 モデリングでも便利だし、スクリーンショットやらビューポートキャプチャやらで説明のための絵などを作る時にも重宝しています。



あとはこいつのオンオフボタンが UI 上にあれば言うこと無しなんですがね。 まあ、俺はスクリプトでやっていますが。





参考リンク:

https://groups.google.com/forum/?fromgroups=#!topic/xsi_list/WOVxIAle-vM

http://www.si-community.com/community/viewtopic.php?f=36&t=986
.
↑ジョーカーさんとかスポンジ野郎とかのビューキューブデータもあります。

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

2013年2月13日 (水)

誰が使こてはりますのん。

このマテリアル、誰が使こてはりますのん?



というのを調べるツールです。






誰が使こてはりますのん。

http://homepage3.nifty.com/jjj/XSIFiles/Plugin/JJJ_XSI_Plugins.html

Darega_menu2


マテリアルを選んで実行すると、そのマテリアルを使っている3Dオブジェクト、クラスタ、グループ、レイヤ、パーティションが選択され、ログを残します。

Darega_log

ところで、3Dオブジェクト、クラスタ、グループ、レイヤ、パーティション以外でマテリアルを持てるものって、XSI シーンにありますかね? 現状、こいつらのみをチェックしてるのですが、もしそれ以外の要素が見つかれば追加するかも知れませんので教えて下さい。





まあ、いつものアレですよ。
他人様から受け取ったデータで、
いったいこのシーンは、どういうポリシーでマテリアルを適用してあるんだ?
オブジェクトごとか? それともグループか?
もしかしてその両方が混在してる?

とかなんとか、データ整理の方針がわからないシーンを解析して自分の支配下におさめるために使ったりするわけです。



マテリアルマネージャに Who Uses? という便利な機能があるので、まあ、そちらを使う人が多いと思うんですけどね、俺はこの Who Uses? がどうしても必要な時以外は、まずマテリアルマネージャを開かない人なので、手軽に実行できる誰が使ってんの機能が欲しかったわけですよ。







ともかくシーンは統一されたポリシーで整理しましょうね。
人に渡すデータが綺麗だと、それだけで信頼されますよ。


とかなんとか。






.

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

« 2013年1月 | トップページ | 2013年3月 »