//# //#

2015/07/20

【Max】MaxScriptメモ(その1)ファイル、パス周り

色々な言語が混じってよく分からなくなってきたのでメモ代わりに
ファイル、パスに関するコマンドをいくつか。


fileDir = maxFilePath --シーンファイルのディレクトリ取得
fileName = maxFileName --拡張子付きのファイル名取得
fileFullpath = fileDir + fileName --シーンファイルのフルパス取得
dirArray = filterString fileFullPath @"\" --パスを¥区切りで配列に変換


testFullPath = @"Z:\hoge\fuga.ext" --sample

getFilenamePath testFullPath --stringのディレクトリのみ取得
--//"Z:\hoge\"//
filenameFromPath testFullPath --stringのファイル名と拡張子を取得
--//"fuga.ext"//
getFilenameFile testFullPath --stringのファイル名のみ取得
--//"fuga"//
getFilenameType testFullPath --stringの拡張子のみ取得
--//".ext"//
doesFileExist testFullPath --ファイルの有無の確認


oRootPath = @"Z:\hoge\"
getDirectories (oRootPath + "*") --変数ディレクトリ以下のディレクトリ全てを配列で返す。
getFiles (oRootPath + "*") --変数ディレクトリ以下のファイル全てを配列で返す。


tempDir = oRootPath + @"_old"
makeDir tempDir --ディレクトリの作成
tempFile = filenameFromPath testFullPath
renameFile testFullPath (tempDir + @"\" +  tempFile) --ファイルの移動(パスのリネーム)


str = "move  " + oRootPath+ "aaa" +  " _old\\aaa" --Dosコマンド(ディレクトリをサブディレクトリ、ファイルごと移動)
hiddendoscommand str startpath:oRootPath exitCode:&exitcode --Dosを実行、実行場所をstartpathで指定、exitcodeでエラーを確認
exitcode --成功した場合0を返す。


-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2015/05/30

【Max】シーンファイルがかなり重い

Maxのシーンファイルがファイルの構造の割に異様に重く、グラフエディタなども開くとフリーズする。
さらにObjをすべて消してみても重い、新規シーンに一部だけ合成しても重いなどの場合、
シーンファイルにリタイムというリタイムツール用のアニメーショントラックが異様にたまっている可能性があります。


本来キーフレームを細かくスケーリングしたりするものに使われているものですが、
使用しているObjを消してもリタイムは残り、合成で読み込むときも読み込んだものだけでなく、
リタイムももれなくすべてついてきます……orz
この機能を使っていない時でも何故かたまるときもあるそうです。

で、肝心の消し方ですが、以下のscriptを打ち込めばOKです。

RetimerMan.numRetimers  --リタイムトラックの数の取得

RetimerMan.BakeAndDeleteLocalRetimers() --リタイムをベイクして削除
--使用していないリタイムトラックの削除

nrt=RetimerMan.numRetimers
for i = 1 to nrt do
(
 j=nrt-i+1
 n=RetimerMan.GetNthRetimer j
 
 if n!=undefined then
 (
  if n.nummarkers==0 then
  (
   RetimerMan.DeleteRetimer j
  )
 )
)


scriptも配布されていますが、バージョンのせいか上手く動作してないものもあるみたいです。
↓以下のものはMax2014で動作確認しています。他にも色々機能がついていますが……。
Cleaner
http://www.scriptspot.com/3ds-max/scripts/cleaner


-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
参考サイト
Autodesk -Technical Q&A- 意図しないリタイムのトラック増加により、ファイルサイズが肥大化してしまう
http://tech.autodesk.jp/faq/faq/adsk_result_dd.asp?QA_ID=8404

MaxScriptヘルプ
http://docs.autodesk.com/3DSMAX/16/JPN/MAXScript-Help/index.html?url=files/GUID-199BB00E-5449-4BCB-A971-4F52553517ED.htm,topicNumber=d30e240940
http://help.autodesk.com/view/3DSMAX/2015/JPN/?guid=__files_GUID_CE344EBA_D3A9_4DC2_8196_BD933941FD0B_htm

Area Removing lots of Retimers in one go with MAXScript
http://area.autodesk.com/blogs/maxstation/n170-filebloat-removing-lots-of-empty-retimers

2015/04/26

【Max】パーティクルペイントの不具合

Maxのパーティクルペイントが思ったようにいかず苦戦したので、対処法をメモ。

①ブラシの表示が崩れて、うまくパーティクルがペイント出来ない時


 

上記の画像ようにブラシでペイントしようとするとビューポートがバグる。
見た目だけでなく、ペイントも思うように出来ない。
ちなみにパーティクルペイントは正投影でないとペイントできません。

そんなときはビューポートをクリッピングして、表示範囲を狭めてやればおk。
手順は下記の画像の通り。



 ビューポート設定>ビジュアルスタイル外観>ビューポートのクリッピングにチェック



すると上記の画像上手にある三角形のものが出てきます。
これを掴んでビューポートの表示範囲を必要な箇所のみに設定します。



ブラシが先ほどのような変なガビガビのものではなく、キチンとした円になりました。
パーティクルもキチンと塗れます。


②パーティクルペイントがオブジェクトから外れてしまう時。



キチンと正投影でペイントできていると思って、ふとカメラを動かすとパーティクルがとんでもない場所に……。

そんなときは以下の方法で対処!



パーティクルペイントのレイアウトのリストしたオブジェクトをペイントにチェック
そしてパーティクルをペイントしたいオブジェクトをピックすればおk

他にも何か対処法があるとはありますが、自分は上記のように対処しました。
何か他にいい方法があれば教えていただけると助かります!

この辺のビューポート周りのバグ?はMaxではご愛嬌なんですかね……。


-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
使い方等は以下の記事をご参考に

■Zで行こう!  パーティクルシステムのお勉強 その20 3ds max 2010

■Autodesk オンラインヘルプ パーティクル ペイント


2015/03/07

【Maya】自作ツールrendLayerManager

案件によりますが、大量のレンダーレイヤがあるシーンに遭遇した時、
一々一つずつrenderableを切り替えるのが面倒だったので自作しました。

※ご使用は自己責任でお願い致します。


任意のscriptパスにいれて、【rendLayerManager】とMelで打ち込めば起動します。
簡単に使い方をご説明すると、

relode
レンダーレイヤの情報をリストに反映させます。新規でレンダーレイヤを追加、削除した際に実行してください。
sort select
ここに打ち込んだものをリストで選択します。正規表現も可能です。
list of renderLayer
シーンのレンダーレイヤのリストです。ダブルクリックするとカレントレイヤーが切り替わります。
on/off
上記のリストで選択したもののrenderableを切り替えます。リスト上で右クリックからもアクセス可能です。
all on/all off
すべてのレンダーレイヤのrenderableを切り替えます。masterLayerには影響しません。


※ご使用は自由ですが、著作権は放棄していないので二次配布等はご遠慮願います。
また何らかの損害等が発生しても責任はとれませんので、自己責任でお願いします。
バグ、要望等ありましたら、ご連絡よろしくお願いします。m(_ _)m

rendLayerManager.mel
https://www.dropbox.com/s/7aywcz80pociz7y/rendLayerManager.mel?dl=0


-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
参考サイト
チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第37回:ポリゴン数をリストアップしよう!
http://area.autodesk.jp/column/tutorial/maya_atoz/listup_number_polygon_1/

2015/01/24

【Maya】Melメモ書き

最近知った便利な文字列周りのMel(コマンドじゃないです)をメモ代わりに。


stringArrayContains
文字配列に項目が含まれる場合は true を返します。 この配列には、複数の項目が含まれる場合もあります。 このプロシージャは、最初の項目が見つかった時点で true を返します。
string $arraySample[] = {"a","b","c"};   

if(stringArrayContains ("a",$arraySample) == 1){      //もし”a”が含まれるなら実行
print "ok";
}

stringArrayRemove
第 1 文字配列に属する文字列項目を、第 2 文字配列から除去します。戻り値は、除去した項目の新しい文字配列です。第 2 引数は変更されずに返されます。
文字配列から除去されるのは、指定された文字列項目の最初の出現だけではなく、全出現であることに注意してください。文字配列に文字列項目がない場合、返される文字配列は、引数文字配列と同じになります。
string $list[]  = { "a", "b", "c", "d", "b", "e", "f", "a", "g" };
string $items[] = { "a", "c", "e", "g" };

string $diff[] = stringArrayRemove($items, $list);          //$list - $items

// Result : { b, d, b, f } //

stringArrayCatenate
指定した 2 つの文字配列を連結する結果となる、新しい文字配列を返します。
string $string1[] = {"light1", "light2"};
string $string2[] = {"light3","light4","light5"};

stringArrayCatenate($string1, $string2);       //$string1 + $string2

 // Result: light1 light2 light3 light4 light5 //

stringArrayToString
substituteAllString
stituteAllString
上から順に文字配列を文字列に指定の文字列(,)をいれて文字列へ変換。
いわゆるメモ帳の検索&置換。
文字列を指定の文字列(,)を区切りで文字配列へ変換。
For文とかでやってもいい気もするし、もっとスマートな方法がある気がする……。
string $old_Array[] = {"old_red","old_blue","old_green"};
string $searchStr = "old_";                                       //検索する文字列
string $replaceStr = "new_";                                    //置き換える文字列

string $toStr = stringArrayToString($old_Array , "," );          //文字配列から文字列へ
string $new_Str = substituteAllString($toStr,$searchStr,$replaceStr);   //文字列の置換
string $new_Array[] = stringToStringArray($new_Str , "," );          //文字列から配列へ

print $new_Array;

コマンドリファレンス(Helpメニュからも行けます)
■Mel
http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/index.html
■python
http://download.autodesk.com/global/docs/maya2014/ja_jp/CommandsPython/index.html


-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
参考サイト
http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/stringArrayContains.html
http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/stringArrayRemove.html
http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/stringArrayCatenate.html
http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/stringArrayToString.html
http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/substituteAllString.html
http://download.autodesk.com/global/docs/maya2014/ja_jp/Commands/stringToStringArray.html

2014/11/24

【Maya】フリープラグインSOUP

フリープラグインのSOUP(スップ?スープ?ソップ?ソー○?)というのがあります。
フリープラグインにしては機能も充実しており、チュートリアルや情報も結構あります。
(ボーンさんのサポートページにいくつか情報がありますね)

ダウンロードは以下のリンクから
http://www.soup-dev.com/tools.htm

※Maya2013だと古いバージョン、Maya2013Exからだと最新のものが使えます。
使えるノードの数やattributeが違っていたりします。
バージョンの互換性はありますが、最新のバージョンにしかないノード、attributeは
古いバージョンで開くと認識されません。


とりあえずどんなことが出来るのかというと適当にペタリ




他にもFluidのシミュレーションの形状をあまり変えることなく、解像度をあげるノードや
Particleの情報をわたしてくれるノードなど様々なものがあります。
Houdiniほど深くノードなかに入ったり、コネクションが柔軟ではないですが、
なかなか使いやすくて、軽いのでオススメです。何よりフリー(無料)です!!

Soupは基本的に単体で使用するというよりは用意された、たくさんのSoupノードをMaya標準のノードと組み合わせてノードを繋げていって様々なことシンプルに行えるプラグインです。
Soupを使わなくてもExpressionやMel、標準機能で実現できることも多いですが、
煩わしい長いスクリプトはほぼ書く必要もなく、簡単で動作も軽いのでとても便利です。

他の事例は公式サイトのサンプルを見てみて下さい。
http://www.soup-dev.com/examples2_1.htm


あと自分の簡単な作例をペタリ。





上記の画像は参照元の板ポリからコーンのポリゴンを生やすposition,normal,tangentを
mesh2Arrayノードで各Vertexから取り出し、その情報をcopierを使って、Instancerに渡しています。
positionだけでなく、normalとtangentをaim,upにつないでいるので、しっかりポリゴンの面に沿ってくれます。(今回の場合はNormalだけでもいいですが、参照元の板ポリの接線方向(今回の場合RotateY)を制御したい場合は必要です。)
※Copier,mesh2Array共に古いバージョンにはありません。

もちろん参照元のMeshの位置が変わってもそれについていってくれますし、数にもよりますが動作も軽くて、
差し替えも楽でバグることも基本ないです。
また、pointノード等をつかってIDを出力すれば、指定したObjのランダム配置や、
Group等つかって指定した範囲内のみスケールをかけることも結構簡単に出来ます。
コピーして配置したものをポリゴンメッシュとして扱いたい場合は、
CopierにコピーしたいObjを読み込ませて、そのままCopierを別のポリゴンのShapeノードにさしてやればOKです。(Historyを消してしまうとCopierも一緒に消えてベイクされてしまうのでポリゴンは重くなります。)

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
他の事例や詳しいやり方は公式サイトやMayaWiki、各ブログサイトに詳しくのっているので是非見てみて下さい。

■公式サイト

■MayaWiki

■雑記とことこ MAYA SOuP インストール

2014/09/21

【Maya】defaultRenderLayer1のバグ

通常デフォルトのレンダーレイヤーは【masterLayer】という名前になっていますが、
何故かここが【defaultRenderLayer1】なる名前になっている上に、名前が変更できず、サーバーに投げるとエラーでレンダリングが回らない……。

そんなとき以下のようにすれば治ります。

①.ma形式で保存。
②テクストエディタで上記のファイルを開く。
③以下の部分を置換する。

変更前
connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer1.rlid";
変更後
connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid";

④保存して完了。シーン開いてmasterLayerに名前が治っていれば成功です。


まぁ、アニメーションを書きだすなり、alembic、Gcache使って組み直せば良い話ですが……。
ちなみにデフォーマはDeformerSetsを使ってアサインし直せます。(ウエイトかかってたら更に面倒だけど)

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
参考サイト
Batch Render unable to modify overrides to the default layer maya?
https://animationrigs.zendesk.com/entries/22322051-Batch-Render-unable-to-modify-overrides-to-the-default-layer-maya-