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] 特定のボーンをルックアットするなら設定

 結果確認                                          

 正面

 左へ移動

 右へ移動



2011年11月24日木曜日

ウィンドウ状態の保存と復元

ウィンドウ(ロールアウト・ロールアウトフロータ)を使用するツールを作成する時、
ウィンドウの状態を保存・復元するというのをよく実装します。

例えば下記のようなものを扱います
  • ウィンドウ位置
  • ロールアウトの開閉状態
  • チェックボックスのチェック状態
以上のような情報をウィンドウがクローズされたタイミングで、
設定ファイルとして保存する。

そして、次回起動時に設定ファイルの情報をもとに
前回起動時の状態を復元します。


この時、標準で読み書きが提供されているINIファイル関数を私はよく使用します。

 ウィンドウがクローズされたタイミングで情報を保存する事が多いので、 ほとんどロールアウトが閉じられた時に実行しています。
ロールアウトのmovedイベントで一時的にウィンドウ位置を変数に格納していますが、
ロールアウトを使用した場合、createDialog後にウィンドウ位置を
取得する方法がわからなかったからです(^^; )

ロールアウトフロータを使用する場合は、フロータのプロパティから
直接その時のウィンドウ位置が取得できます。


外部ファイルに何か情報を保存する際、
直接テキスト出力したり、XMLを使用する方法もありますが、
手軽なこの方法を使用する事が多いです。



2011年11月23日水曜日

ソースコード掲載にあたり、SyntaxHighlighter を設定

今後、ソースコードを貼り付けていくので、
SyntaxHighlighter のテストをしておく。


導入は下記を参考にさせていただきました。
BloggerにおけるSyntaxHighlighterの使い方


maxScriptは対応していないので、"js"を指定しておく。

※上記コードをscriptタグで表示することは出来ないようですね。
preタグで囲んで表示させています。


試し書き1:基本スタイル
local myName = ""

myName = "0303"

if myName == "0303" do (
    print "hello world!"
)  

問題なさそうですね。


下記サイトに進んだ使い方があったので参考にさせて頂きました。
ブログ上でプログラムソースを表示する方法②

試し書き2:よく使いそうなタイトル表示と行ハイライト