チュートリアル - オブジェクト データのファイルへの出力

チュートリアル > オブジェクト データのファイルへの出力

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 値

average_speed = 0

平均速度を計算するために、すべてのフレームのすべての速度値を格納する変数を初期化します。

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 output_file

ファイルの準備ができました。読み取り用にファイルを開く前に、いったんファイルを閉じる必要があります。

close_fileStream

edit output_name

edit メソッドを使用して、MAXScript エディタ ウィンドウでファイルを開きます。

edit_MAXScript_Editor

)--end if
)--end if
)--end macroScript

スクリプトの使い方

スクリプトを評価し、[HowTo]カテゴリから[SpeedSheet]ボタンをドラッグして、ツールバーをカスタマイズします。任意の数のオブジェクトを作成して、その位置をアニメートすることができます。オブジェクトが選択されている間に[SpeedSheet]ボタンを押し、出力ファイルの名前を指定します。 結果がすぐに表示されます。

関連項目

Windows のメモ帳などの外部エディタでテキスト ファイルの内容を調べたい場合は、以下の行

edit output_name

を、次の行

shellLaunch "notepad.exe" output_name

で置き換えます。この行で、該当するファイルのファイル名をパラメータとして指定して、外部アプリケーションの notepad.exe が起動されます。

標準単位の代わりに、インチ、フィート、メートルなどの実際の単位を計算して、このスクリプトを改善することもできます。

戻る

「チュートリアル」のインデックス ページ