MAXScript によって、ディスク上にテキスト ファイルを作成し、カスタム データを出力することができます。以下の例では、各フレームの現在のオブジェクト選択の速度と、その平均速度をテキスト ファイルへ出力する macroScript を作成します。
関連トピック:
[ファイルを保存](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 より多い場合にのみコードが実行されます。
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 = createfile output_name
次に、指定されたファイル名を使用して出力用に新規ファイルを作成します。ファイルが既に存在する場合は、上書きされます。
at time animationrange.start format "Object(s): %\n" (selection as array) to:output_file
ファイルを作成した直後に、選択されたオブジェクトの名前を書き出します。at time
コンテキストは、必ず、アニメーション内の最初のフレームに対応するオブジェクトの位置データが出力されるようにします。format
メソッドでは、フォーマット文字列が使用され、変数は % で示されます。"\\n"
は改行を示しています。
average_speed = 0
平均速度を計算するために、すべてのフレームのすべての速度値を格納する変数を初期化します。
for t = animationrange.start to animationrange.end do
(
ここで、現在のアニメーション セグメント内のすべてのフレームを巡回します。変数 t
には、シーン アニメーションの範囲内の最初から最後のフレームまでの間に変化するフレーム値が含まれます。
AnimationRange_Time_Configuration
at time t current_pos = selection.center
for
ループの変数 t
からの現在の時間を使用して、オブジェクト選択の中心の位置を読み取ります。
at time (t-1f) last_pos = selection.center
次に、現在のフレームより 1 つ前のフレームの選択の中心位置を読み取ります。
frame_speed = (distance current_pos last_pos)*FrameRate
現在のフレームのフレーム速度は、直前のフレームから選択の中心が移動した距離にフレーム番号を乗算した秒数です。これが、秒あたりの標準設定による速度です。
中間トピック 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
フレーム速度は、フレーム番号とともに出力ファイルに書き出されます。
)
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 output_file
ファイルの準備ができました。読み取り用にファイルを開く前に、いったんファイルを閉じる必要があります。
edit output_name
edit
メソッドを使用して、MAXScript エディタ ウィンドウでファイルを開きます。
)--end if
)--end if
)--end macroScript
スクリプトを評価し、[HowTo]カテゴリから[SpeedSheet]ボタンをドラッグして、ツールバーをカスタマイズします。任意の数のオブジェクトを作成して、その位置をアニメートすることができます。オブジェクトが選択されている間に[SpeedSheet]ボタンを押し、出力ファイルの名前を指定します。 結果がすぐに表示されます。
Windows のメモ帳などの外部エディタでテキスト ファイルの内容を調べたい場合は、以下の行
edit output_name
を、次の行
shellLaunch "notepad.exe" output_name
で置き換えます。この行で、該当するファイルのファイル名をパラメータとして指定して、外部アプリケーションの notepad.exe が起動されます。
標準単位の代わりに、インチ、フィート、メートルなどの実際の単位を計算して、このスクリプトを改善することもできます。
戻る