チュートリアル - ジオメトリ データのテキスト ファイルへの出力 - 第 2 部

これは、「ジオメトリ データの出力」チュートリアルの第 2 部です。第 1 部で開発したスクリプトを拡張して、スムージング グループ、マテリアル ID、およびエッジ可視性をサポートします。

関連トピック:

Macro Script の定義

ヒットによるシーン ノードの選択

全体の流れ:

第 1 部からスクリプトをロードします。

ジオメトリ オブジェクト用のフィルタ関数を作成します。

ユーザにシーン オブジェクトを選択してもらい、それにフィルタ関数を適用します。

ユーザが有効なオブジェクトを選択した場合は、ファイルを保存するためのダイアログ ボックスを取得して、ターゲット名をユーザに尋ねます。

ファイル名が有効な場合は、頂点を書き出します。

面の書き出し用コード内で、スムージング グループ値、マテリアル ID およびエッジ可視性を収集します。

収集された値を単一行として出力します。

ファイルを閉じます。

確認のためにファイルを開きます。

MAXScript

    macroScript ExportMesh category: "HowTo"
    (
    fn GetGeometry o = (
     Superclassof o == Geometryclass and classof o != TargetObject )
    obj = pickobject filter:GetGeometry
    if isValidNode obj then
    (
     tmesh =snapshotAsMesh obj
     out_name = GetSaveFileName()
     if out_name != undefined then
     (
      out_file = createfile out_name
      num_verts = tmesh.numverts
      num_faces = tmesh.numfaces
      format "%,%\n" num_verts num_faces to:out_file
      for v = 1 to num_verts do
       format "%," (getVert tmesh v) to:out_file
      format "\n" to:out_file
      for f = 1 to num_faces do
      (
       face = getFace tmesh f
       sgroup = getFaceSmoothGroup tmesh f
       matid = getFaceMatId tmesh f
       edge1 = getEdgeVis tmesh f 1
       edge2 = getEdgeVis tmesh f 2
       edge3 = getEdgeVis tmesh f 3
       format "%,%,%,%,%,%\n" face sgroup matid edge1 edge2 edge3 to:out_file
      )
      close out_file
      edit out_name
     )--end if
    )--end if
    )--end macroscript

ステップごとの解説

MacroScript ExportMesh category:"HowTo"
(

ExportMesh という名前の macroScript を定義します。スクリプトを使用する場合は、[カスタマイズ] (Customize)に移動してスクリプトを[HowTo]カテゴリからツールバー、メニュー、またはクアッド メニューにドラッグするか、キーボード ショートカットを割り当てることができます。

マクロ スクリプトの定義

fn GetGeometry o = (
Superclassof o == Geometryclass and classof o != TargetObject )

特定のオブジェクト タイプの選択だけを許可するフィルタ関数が必要です。この例では、パラメータとして渡されるオブジェクトのスーパークラスが GeometryClass で、渡されたオブジェクトのクラスが TargetObject でない場合にのみ、関数は true を返します (TargetObject は、メッシュなしの唯一のジオメトリ オブジェクトです)。

カスタム関数の定義

obj = pickobject filter:GetGeometry

ここで、ユーザに 2 番目のオブジェクトを選択してもらい、マウス ポインタの下にあるすべてのオブジェクトにフィルタを適用します。マウス ポインタは、シーン オブジェクトのクラスがフィルタ関数内で定義されたクラスに一致する場合にのみ、シーン オブジェクトの選択を許可します。

ヒットによるシーン ノードの選択

if isValidNode obj then
(

ユーザが有効なオブジェクトを選択した場合(つまり、右クリックしてキャンセルせず、Escも押さなかった場合)、スクリプトの残りの部分を実行します。 そうでない場合は、以降の行をスキップします。

isValidNode

tmesh = snapshotAsMesh obj

これは、第 1 部のコードと同じです。選択されたオブジェクトからメッシュを取得します。

out_name = GetSaveFileName()

ハードコードされたパスを指定する代わりに、ユーザにファイル名を入力してもらいます。

ファイルを開くおよび保存する標準のダイアログ ボックス

if out_name != undefined then
(

ユーザが有効な名前を指定した場合、つまり[キャンセル] (Cancel)を押さなかった場合は、実行を続けます。

out_file = createfileout_name
num_verts = tmesh.numverts
num_faces = tmesh.numfaces
format "%,%\n" num_verts num_faces to:out_file

第 1 部と同様に、新しいファイルを作成して頂点と面の数を出力します。

for v = 1 to num_verts do
format "%," (getVert tmesh v) to:out_file
format "\n" to:out_file

次に、第 1 部のコンパクト バージョンと同様に、頂点を書き込みます。

for f = 1 to num_faces do
(

面のループでは、今回の方が多くのデータを書き出します。各面には、スムージング グループの値、マテリアル ID の値、および 3 つのエッジ可視性の値があります。このすべてを単一のパスで書き出します。

face = getFace tmesh f

最初に、面を取得します。

sgroup = getFaceSmoothGroup tmesh f

次に、同じ面からスムージング グループ値を取得します。

matid = getFaceMatId tmesh f

次は、マテリアル ID 値です。

edge1 = getEdgeVis tmesh f 1
edge2 = getEdgeVis tmesh f 2
edge3 = getEdgeVis tmesh f 3

さらに、3 つの面エッジのそれぞれのエッジ可視性です。

Editable_Mesh : GeometryClass および TriMesh : 値

format "%,%,%,%,%,%\n" face sgroup matid edge1 edge2 edge3 to:out_file

これで、すべての値を取得したので、それらの値すべてを単一行で出力します。行の最後に改行文字を追加します。 これで、各面に 1 つの行が対応します。

FileStream 値

)
close out_file

面のループの準備ができたら、出力ファイルを閉じます。

edit out_name

そして、新しいファイルを開き、結果をチェックします。

)--end if
)--end if
)--end macroscript

スクリプトの使い方

スクリプトをテストするため、MAXScript エディタのメニューから[ツール] (Tools) > [評価] (Evaluate)を選択するか、[Ctrl]+[E]を押します。次にツールバーをカスタマイズし、スクリプトを[HowTo]カテゴリからドラッグします。ボタンを押して、シーンからジオメトリ オブジェクトを選択します。Patch、NURBS、手続き型オブジェクトなど、任意のジオメトリ オブジェクトを選択することができます。

立方体の出力例

    8,12
    [-50,-50,0],[50,-50,0],[-50,50,0],[50,50,0],[-50,-50,100],[50,-50,100],[-50,50,100],[50,50,100],
    [1,3,4],2,2,true,true,false
    [4,2,1],2,2,true,true,false
    [5,6,8],4,1,true,true,false
    [8,7,5],4,1,true,true,false
    [1,2,6],8,5,true,true,false
    [6,5,1],8,5,true,true,false
    [2,4,8],16,4,true,true,false
    [8,6,2],16,4,true,true,false
    [4,3,7],32,6,true,true,false
    [7,8,4],32,6,true,true,false
    [3,1,5],64,3,true,true,false
    [5,7,3],64,3,true,true,false

関連項目

ここで拡張された出力を入手したので、対応する入力スクリプトに進んでそれを拡張して、新しいデータ フォーマットを読み戻し、すべての面プロパティを持つ新しいシーン オブジェクトを作成します。

後で、たとえばテクスチャ座標のサポートなどを追加して、自分でこのスクリプトを拡張することができます。

戻る

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

チュートリアル - ジオメトリ データのテキスト ファイルからの読み取り - 第 1 部

チュートリアル - ジオメトリ データのテキスト ファイルへの出力 - 第 1 部

次へ

チュートリアル - ジオメトリ データのテキスト ファイルからの読み取り - 第 2 部