2013年4月11日木曜日

ToolBoxのカスタマイズ(ボタン追加編)

Mayaウィンドウ左端にあるツールボックスにボタンを追加してみます。
Maya起動時に実行したい場合は、スクリプトジョブをuserSetup.pyなどで実行するのが良さそう。
※userSetup.py以外を編集できる環境、例えば直接 toolbox.mel を修正する場合は除く。

追加する事はできたものの、追加位置を変更したり、削除する方法が今のところわかってない。
※toolbox.mel を直接修正出来るのであれば、自由にカスタマイズは可能

2013年1月22日火曜日

現在開いているシーン保存フォルダを開く

 現在開いているシーンが保存されているフォルダをエクスプローラで開く

2013年1月17日木曜日

DotNet-ListViewを使用した画像一覧サンプルコード

DotNet-ListViewを使用した画像一覧サンプルコード
適当なフォルダ内にある画像から画像リストを生成します。
画像間の隙間調整をするコードと、画像のドラッグ&ドロップ並び替えコードのサンプルです。
※実行する場合は画像格納先パスを編集して下さい。

ドラッグ&ドロップ後のソーティングは無理やりやってます。
1番目のカラムの値を書き換えてソーティングしてます。


2012年12月5日水曜日

起動時のスクリプト実行プロセス

3dsMaxをファイル指定無しで起動した場合、
スクリプトファイルがどのようなプロセスで評価・実行されているかを検証。

基本的にMaxScriptヘルプの「スタートアップ スクリプト」項目を検証した内容。
※基本的にプロジェクトフォルダは検索しない<C:\Users\*\Documents\3dsMax>



(1) load Macroscript

 <C:\Program Files\Autodesk\3ds Max 2011\UI\MacroScripts\>
 <[カスタマイズ]>[システム パスの設定]>[システム]>[Additional Macros]>指定フォルダ

 ・全サブディレクトリのファイルがロードされる(コンパイルは無し)
 ・フォルダ名を半角丸カッコ()でくくると無視される

(2) stdscripts

 <C:\Program Files\Autodesk\3ds Max 2011\stdplugs\stdscripts>
 
 ・[*.ms]が実行されグローバル変数として格納される
 ・全サブディレクトリのファイルも実行される
 ・フォルダ名を半角丸カッコ()でくくると無視される
 ・[startup.ms]というファイルは無視される

(3) サードパーティプラグインパス

 <[カスタマイズ]>[システム パスの設定]>[サードパーティプラグイン]>追加パス

 ・全サブディレクトリのファイルも実行される
 ・フォルダ名を半角丸カッコ()でくくると無視される
 ・[startup.ms]というファイルは無視される

(4) 3dsMax GUI構築進捗

 ・3ds Max シーンは作成されいない
 ・ビューポートは作成されていない
 ・シーン オブジェクトは作成できない
 ・UI 関連の作業は何もできない
 ・上記の操作関数を定義できるが、呼び出しはできない

(5) Macroscript評価

 ・キーボード/ツールバー/メニュー/クアッドメニューにアサインされたマクロは、この時点でコンパイルされる。

 ※この時点で3ds Max は基本シーンとユーザ インタフェースを作成します。
 ※この時点でコンパイルされないマクロは、初回実行時にコンパイルされていると思われる。

(6)スタートアップスクリプト

 <システムスクリプトフォルダ><\startup>
 <[カスタマイズ]>[システム パスの設定]>[システム]>[Additional Startup Scripts]>指定フォルダ

 ・全サブディレクトリのファイルも実行される
 ・フォルダ名を半角丸カッコ()でくくると無視される
  
 ※スタートアップ実行するかどうかは、[カスタマイズ]>[基本設定]>[MaxScript]>[スタートアップ]設定に依存 
 ※[Additional Startup Scripts]指定フォルダ内の<\startup>は実行されない

2012年12月4日火曜日

アクティブなグローバル変数を確認する

現在のセッションで有効なグローバル変数を出力

2012年12月3日月曜日

基点位置を変更する(最大/最小)

 バウンディングボックスの座標を元に基点位置を変更する(3dsMax標準と同じ?)

2012年11月2日金曜日

詳細レベル(LOD)を操作する

 詳細レベル(LOD)を操作する方法。
 直接スクリプトで値を変更出来ないので、この方法を使用する
 ※メッセージ番号は「sendMessage listbox」といった具合で調べればなんとなくわかる。

2012年10月31日水曜日

ネームスペースの除去

ネームスペースの除去方法
 オブジェクト名を変更するのではなく、ネームスペース自体を削除する。
 ネームスペース名が入れ子になっている場合を考慮して、
 名前配列をリバースソートして子供から処理していく。

 中身の移動と削除を行うネームスペースが、
 リファレンス時に生成されたものであればエラーが発生する。
 別途エラー処理を行うか、事前にリファレンスをインポートしておく。


(参考記事)

2012年10月26日金曜日

リファレンス操作関連(referenceQuery)

リファレンス操作関連のPythonコマンド referenceQuery

 リファレンスノードとかターゲットリファレンスとかの単語の意味が  正確に理解できていないので何となくのコメント。

2012年10月18日木曜日

INIファイル用関数で扱える文字数制限について

概要

MaxScript標準で用意されているINIファイルへのアクセス関数において、
書き込んだ文字列の取得制限について

結論

下記コードで検証したところ、8192byte以上は追加出来ても文字列として取得できなかった。(max2012x64調べ)

関連情報

getINISetting ではファイル名だけを指定するとセクション名が配列で、セクション名まで指定するとキー名が配列で取得可能。
この配列取得においても、一度に取得できる要素数は 395 が上限のよう。
※setINISetting による追加、セクション名とキー名を直接指定した値の取得は問題無く行える。

パス文字記述方法

パス文字記述方法について

2012年5月29日火曜日

オブジェクトの位置・回転合わせ

初めてのMayaスクリプティング。
リグ制作の延長で必要になりそうだったアラインツールを作ってみました。

最初に選択したオブジェクトの位置/回転を合わせるという感じです。
一応フリーズされたオブジェクト間のアラインに対応しているつもりです。
※かなり手探りで作っていますので間違っているかもしれません。。。

2011年12月9日金曜日

独自メニューバーを使ってウィンドウサイズ縮小機能を実装する

ウィンドウを必要としないツールや、ボタンが数個のスクリプトだと
ほとんど実装しないメニューバー。


以前記事にしたロールアウトの開閉を使ったウィンドウサイズの変更
それのメニューバーバージョンといったものをメモしておきます。

  • メニューバー操作でウィンドウサイズを縮小できる
  • ウィンドウ縮小状態でツールの機能を実行できる
  • 一般的なメニューバーの機能を実装



結果1)コンパクトモードをクリックすると、
ウィンドウサイズがメニューバーだけの高さになります。

結果2)メニューバーからロールアウトの機能を実行できる。
結果3)一般的メニューバーの機能実装完了。

ちなみにヘルプファイルはCHMファイルを実行するようにしていますが、
SpeedHelpPad を使うと凄くラクに作成できます。

2011年12月7日水曜日

メニューバーに各種フォルダを開くメニュー項目を作成する

3dsMaxで作業を行っている際、アクセス頻度の高いフォルダがあります。
  • 現在のシーンファイルが保存されているフォルダ
  • オートバックアップフォルダ
  • スクリプト格納フォルダ(scripts)
  • スクリプト格納フォルダ(startup)
  • スクリプト格納フォルダ(usermacros)

もっとも頻度が高いのはシーンファイル保存フォルダでしょうか?
シーンファイルを履歴から開いたり、ショートカット実行で開いたりした場合、
そのファイルが存在しているフォルダを開かない場合があるからです。

また、他の人のPCにスクリプトを配布した場合、
配布先PCでデバッグが必要になる事が結構あります。
そういった場合、これらのフォルダに素早くアクセス出来ると非常に楽です。

考えた末、3dsMaxのメニューバーにフォルダを開く機能を実装しようということに。


ハイライトしている部分は、 それぞれのメニュー項目に対して
項目選択時に実行するマクロスクリプトを指定しています。

例えば、シーン保存フォルダを開くマクロスクリプトであれば、次のような簡単なものです。

つまり、事前にマクロスクリプトが配布先で有効になっている必要があります。
なので、一緒にマクロスクリプトも配布して本スクリプトを実行するような、
インストーラーを用意するなどの手段が必要です。

※Menuまわりは結構曖昧なコードになっています。
  なのでコメントがアバウト気味です (^^;

2011年12月6日火曜日

3dsMax起動時のスプラッシュウィンドウ画像を変更する

3dsMax起動時に表示される画像(スプラッシュ画面)は下記の画像を使用しています。
max2010の場合)C:\Program Files\Autodesk\3ds Max 2010\splash.bmp

画像ファイルを直接表示しているようなので、
このファイルを置き換えれば別の画像が表示出来るのでは?
そう思って試してみたら簡単に出来たので、ランダムで変更するツールにしてみました。

  • スクリプトがランダムで使用する画像を格納するフォルダを作成しておく
  • ランダムで表示する画像を用意する
  • スタートアップスクリプトとして作成したスクリプトを実行する


実際には、1回目の起動時に画像を置き換え、
次の起動時に置き換え後の画像が表示されています。

2011年12月1日木曜日

ロールアウトフロータの高さをロールアウト開閉に連動させる

ウィンドウを持つタイプのツールを作成する場合、
出来るだけウィンドウサイズをコンパクトにしたいと考えています。

基本はウィンドウは表示したままを想定した上で、
ビューポートを隠す領域を狭めたいと思うからです。

そういう場合に基本機能としてよく実装する機能が、
ロールアウトの開閉状態に合わせて、ロールアウトフロータの高さも拡大縮小させるという機能です。

そうすることで、あまり使わないロールアウトパネルは閉じておくことで、
ウィンドウの高さを縮小させる事が出来ます。
実行すると、ロールアウトの開閉状態に応じて、 ロールアウトフロータの高さが動的に変化します。

オブジェクトの名前取得ツール

MaxScriptを作成する時、よく使用するのがオブジェクト名です。

実験をおこなったり、特定オブジェクト名をコードに使用する場合、
素早くコードに適した名前を取得したいなと感じるわけです。

簡単ながら効果が非常に高いツールとして、
選択オブジェクトの名前を編集した状態で、クリップボードにコピーするというものを作成しています。
  結果的には次のような感じに。(実行後、エディタに[Ctrl+V]した状態)


 後付けで[Shift]キーが押されている場合の挙動を追加しましたが、
 実際のところ忘れている機能となっていました。。。

 ちなみに私はツールバーにボタンとして配置しています。

2011年11月28日月曜日

カウントダウン!

どうにかしてカウントダウンのようなツールが出来ないかな?
ということで、たどり着いたのが「jQuery」

なんとなくしか知りませんでしたが、使ってみると色々な事が簡単に表現できて重宝します。

スタイリッシュなカウントダウンパーツを作成するjQueryまとめ「9 Cool jQuery Countdown Scripts」

上記のサイトを参考にして、例えば「○○の締め切りまで 残り...」 という具合で、
残りの日数をカウントダウン表示できます。


3dsMaxだけでなく、他のDCCツールもHTMLを表示させることは簡単なので、
色々な応用ができるんじゃないかと思います。

2011年11月25日金曜日

実行時間の計測

処理時間の削減を行いたい時など、
作成した処理にどの程度時間がかかっているか?を調べたい時などに。

いわゆるタイムスタンプを使用する一連の処理をまとめてスクリプト化しただけですが、
時々使う気がするのでアップ。

myStopWatch.ms をMaxScriptフォルダのStartupフォルダに格納しておくと、
3dsMax起動時にタイムスタンプを扱う関数が生成されます。
タイムスタンプを計測したい場合、下記のようにします。
実行結果は下記のように出力されます。
※このツールをインストールしていないPCに
上記関数を埋め込んだままスクリプトを配布しないよう注意して下さい。

MatineeでSkeletalMeshにヘッドトラッキングをさせる

自分で調べたはいいものの、きっと忘れそうなので備忘録として。

MatineeでアニメーションさせているSkeletalMeshに
ヘッドトラッキングをさせるにはどうすればよいか?

 全体の流れ                                         
  1. 骨格コントロールを実装したAnimTreeを作成する
  2. 対象のSkeletalMeshはSkeletalMeshMATとしてレベルに配置する
  3. 作成したAnimTreeをSkeletalMeshMATに設定する
  4. Matineeを用意(以降Matinee編集)
  5. アニメーションは普通にAnimControlトラックにて設定(Slot指定)
  6. HeadTrackingトラックを追加

 1. 骨格コントロールを実装したAnimTreeを作成                   


 AnimTreeノードに骨格コントロールを追加するには、
 事前にAnimTreeノードのプロパティ設定が必要。
  • [Preview SkeletalMesh] に対象のSkeletalMeshを設定する

 設定後、AnimTreeノードを右クリックして、
 ヘッドトラッキング対象のボーンを選択していく。(骨格コントロールチェーン)


 作成されたボーンのコネクタに対して、[SkelControlLookAt]ノードを作成する。
 [SkelControlLookAt]ノードのプロパティを編集する
  • [Control Name] にいい感じの識別名を設定
  • [Look At Axis] or [Invert Look At Axis] などを調整し、正しい状態にする
  • [Max Angle] など必要であればリミットをかける

 2. 対象のSkeletalMeshはSkeletalMeshMATとしてレベルに配置         
 3. 作成したAnimTreeをSkeletalMeshMATに設定する                
 4. Matineeを用意                                     
 5. アニメーションは普通にAnimControlトラックにて設定(Slot指定)        



 6. HeadTrackingトラックを追加                              


 対象のSkeltalMeshグループに、[HeadTracking]トラックを追加する。
 トラッキング状態にしたいフレーム区間をトリガーでON/OFFしておく。
 [HeadTracking]トラックのプロパティを設定する。
  • [Track Controller Name] AnimTreeで設定した識別名(Control Name)
  • [Look At Actor Radius] ルックアット有効範囲を設定
  • [Disable beyond Limit] 有効範囲を使用するのであればチェック
  • [Target Bone Names] 特定のボーンをルックアットするなら設定

 結果確認                                          

 正面

 左へ移動

 右へ移動