チュートリアル - オブジェクト データのファイルへの出力
MAXScript によって、ディスク上にテキスト ファイルを作成し、カスタム データを出力することができます。以下の例では、各フレームの現在のオブジェクト選択の速度と、その平均速度をテキスト
ファイルへ出力する macroScript を作成します。
関連トピック:
Macro Script の定義
[ファイルを保存](Save File)ダイアログ ボックス
テキスト ファイルの作成および出力
全体の流れ:
|
ボタン、メニュー項目またはショートカットとして使用できる macroScript としてコードをパッケージ化します。
|
情報を保存する出力ファイルの名前をユーザに指定してもらいます。
|
選択したすべてのオブジェクトのリストをファイル ヘッダとして書き出します。
|
現在のアニメーション セグメント内のすべてのフレームを巡回し、現在のフレームとその前のフレームの選択オブジェクトの位置を取得して、フレームあたりの速度を計算します。
|
各フレームの結果を書き出します。
|
すべてのフレーム速度値を収集し、それをアニメーション セグメントの長さで割って、平均速度を出します。
|
結果の平均速度を書き出します。
|
エディタ内でファイルを開き、結果をユーザに示します。
|
MAXScript
|
macroScript SpeedSheet category:"HowTo"
(
if selection.count > 0 then
(
output_name = getSaveFileName caption:"SpeedSheet File" types:"SpeedSheet (*.ssh)|*.ssh|All Files (*.*)|*.*|"
if output_name != undefined then
(
output_file = createfile output_name
at time animationrange.start format "Object(s): %\n" (selection as array) to:output_file
average_speed = 0
for t = animationrange.start to animationrange.end do
(
at time t current_pos = selection.center
at time(t-1f) last_pos = selection.center
frame_speed = (distance current_pos last_pos)*FrameRate
average_speed += frame_speed
format "Frame %: %\n" t frame_speed to:output_file
)
average_speed /= (animationrange.end-animationrange.start)
format "Average Speed: %\n" average_speed to:output_file
close output_file
edit output_name
)--end if
)--end if
)--end macroScript
|
ステップごとの解説:
MacroScript SpeedSheet category:"HowTo"
(
[HowTo]カテゴリに表示される SpeedSheet という新規 macroScript を作成します。
マクロ スクリプトの定義
if selection.count > 0 then
(
このスクリプトは、選択されたオブジェクトが少なくとも 1 つある場合にのみ機能します。現在のシーン選択内のオブジェクトの数がチェックされ、その数が 0 より多い場合にのみコードが実行されます。
ObjectSet 値
output_name = getSaveFileName caption:"SpeedSheet File" types:"SpeedSheet (*.ssh)|*.ssh|All Files (*.*)|*.*|"
次に、標準ウィンドウのファイル保存のダイアログ ボックスをユーザに表示します。このダイアログ ボックスのタイトル バーには、カスタムのキャプション文字列である「SpeedSheet
File」が表示されます。既定のファイル タイプは、.SSH (SpeedSheet) ファイルとして指定します。ユーザがファイル名を入力すると、ダイアログ ボックスで指定したこの拡張子が自動的に追加されます。
ファイルを開くおよび保存する標準のダイアログ ボックス
if output_name != undefined then
(
[名前を付けて保存](Save File Name)ダイアログ ボックスでユーザがファイル選択を取り消すと、output_name 変数には undefined が含まれます。このような場合は、この出力コード全体をスキップする必要があります。ファイル名が有効な場合は、次に進みます。
output_file = create output_name
次に、指定されたファイル名を使用して出力用に新規ファイルを作成します。ファイルが既に存在する場合は、上書きされます。
FileStream 値
at time animationrange.start format "Object(s): %\n" (selection as array) to:output_file
ファイルを作成した直後に、選択されたオブジェクトの名前を書き出します。 at time コンテキストは、必ず、アニメーション内の最初のフレームに対応するオブジェクトの位置データが出力されるようにします。 format メソッドでは、フォーマット文字列が使用され、変数は % で示されます。 「¥n」 は改行を示しています。
at time
3ds Max システム グローバル
FileStream 値
平均速度を計算するために、すべてのフレームのすべての速度値を格納する変数を初期化します。
for t = animationrange.start to animationrange.end do
(
ここで、現在のアニメーション セグメント内のすべてのフレームを巡回します。変数 t には、シーン アニメーションの範囲内の最初から最後のフレームまでの間に変化するフレーム値が含まれます。
for ループ
AnimationRange_Time_Configuration
at time t current_pos = selection.center
for ループの変数 t からの現在の時間を使用して、オブジェクト選択の中心の位置を読み取ります。
at time
ObjectSet 値
at time (t-1f) last_pos = selection.center
次に、現在のフレームより 1 つ前のフレームの選択の中心位置を読み取ります。
frame_speed = (distance current_pos last_pos)*FrameRate
現在のフレームのフレーム速度は、直前のフレームから選択の中心が移動した距離にフレーム番号を乗算した秒数です。これが、秒あたりの標準設定による速度です。
Distance_Point3
中間トピック ID: FrameRate_Time_Configuration
average_speed += frame_speed
average speed 変数は、すべてのフレーム速度値を収集します。同じことが、 average_speed = average_speed + frame_speed という完全指定の形式でも表現できます。
Format "Frame %: %\n" t frame_speed to:output_file
フレーム速度は、フレーム番号とともに出力ファイルに書き出されます。
FileStream 値
)
average_speed /= (animationrange.end - animationrange.start)
ループが終了した後に、すべてのフレーム速度の合計値をフレーム数で除算して、平均速度を計算することができます。同じことを、 average_speed = average_speed / (animationrange.end-animationrange.start) としても表現できます。
AnimationRange_Time_Configuration
format "Average Speed: %\n" average_speed to:output_file
結果が出力ファイルに出力されます。
ファイルの準備ができました。読み取り用にファイルを開く前に、いったんファイルを閉じる必要があります。
close_fileStream
edit メソッドを使用して、MAXScript エディタ ウィンドウでファイルを開きます。
edit_MAXScript_Editor
)--end if
)--end if
)--end macroScript
スクリプトの使い方
スクリプトを評価し、[HowTo]カテゴリから[SpeedSheet]ボタンをドラッグして、ツールバーをカスタマイズします。任意の数のオブジェクトを作成して、その位置をアニメートすることができます。オブジェクトが選択されている間に[SpeedSheet]ボタンを押し、出力ファイルの名前を指定します。
結果がすぐに表示されます。
関連項目
Windows のメモ帳などの外部エディタでテキスト ファイルの内容を調べたい場合は、以下の行
を、次の行
shellLaunch "notepad.exe" output_name
で置き換えます。この行で、該当するファイルのファイル名をパラメータとして指定して、外部アプリケーションの notepad.exe が起動されます。
標準単位の代わりに、インチ、フィート、メートルなどの実際の単位を計算して、このスクリプトを改善することもできます。
戻る
「チュートリアル」のインデックス ページ