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

これは、「ジオメトリの読み込み」チュートリアルの第 2 部です。チュートリアル - ジオメトリ データのテキスト ファイルへの出力 - 第 2 部 で開発した出力スクリプトによって書かれた拡張データを、このスクリプトで読み込むことができます。

全体の流れ:

ユーザがツールバー、クアッド メニュー、キーボード ショートカットまたはメニューとしてスクリプトを配置できるように、macroScript をパッケージ化します。

スムージング グループ、マテリアル ID、およびエッジの可視性を格納するための 3 つの配列を作成します。

開くファイルをユーザに選択してもらいます。

ユーザが有効なファイル名を選択した場合は、スクリプトの実行を続けます。

第 1 部と同様に頂点と面を読み取った後に、スムージング グループ、マテリアル ID、およびエッジの可視性も読み取ります。

ファイルを閉じます。

収集された頂点と面から、新しいメッシュを作成します。

スムージング グループ、マテリアル ID、およびエッジの可視性の値をすべての面に適用します。

この変更を反映させるためにメッシュを更新します。

MAXScript

    macroScript ImportMesh category: "HowTo"
    (
     vert_array = #()
     face_array = #()
     sgroup_array = #()
     matid_array = #()
     edge_array = #()
     in_name = getOpenFileName()
     if in_name != undefined then
     (
      in_file = openFile in_name
      if in_file != undefined then
      (
       num_verts = readValue in_file
       num_faces = readValue in_file
       for v = 1 to num_verts do
        append vert_array (readValue in_file)
       for f = 1 to num_faces do
       (
        append face_array (readValue in_file)
        append sgroup_array (readValue in_file)
        append matid_array (readValue in_file)
        edge1 = readValue in_file
        edge2 = readValue in_file
        edge3 = readValue in_file
        append edge_array #(edge1, edge2, edge3)
       )
       close in_file
       new_mesh = mesh vertices:vert_array faces:face_array
       for f = 1 to num_faces do
       (
        setFaceSmoothGroup new_mesh f sgroup_array[f]
        setFaceMatID new_mesh f matid_array[f]
        setEdgeVis new_mesh f 1 edge_array[f][1]
        setEdgeVis new_mesh f 2 edge_array[f][2]
        setEdgeVis new_mesh f 3 edge_array[f][3]
       )
       update new_mesh
      )--end if
     )--end if
    )--end macroscript

ステップごとの解説

macroScript ImportMesh category: "HowTo"
(

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

マクロ スクリプトの定義

vert_array = #()
face_array = #()

第 1 部の場合と同様に、頂点と面を保持する配列を定義します。

sgroup_array = #()
matid_array = #()
edge_array = #()

ただし、スムージング グループ、マテリアル ID、およびエッジの可視性を格納するための 3 つの配列も定義します。

配列の値

in_name = getOpenFileName()

固定された名前を読む代わりに、ユーザがファイル名を選択できるようにします。

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

if in_name != undefined then
(

選択されたファイル名が undefined でないかぎり、つまりユーザが[キャンセル] (Cancel)を押さないかぎり、続行できます。

in_file = openFile in_name
if in_file != undefined then
(
num_verts = readValue in_file
num_faces = readValue in_file
for v = 1 to num_verts do
append vert_array (readValue in_file)
for f = 1 to num_faces do
(
append face_array (readValue in_file)

読み取り用のコードのこの部分は第 1 部と同じですが、追加のデータを読む必要があります。

append sgroup_array (readValue in_file)
append matid_array (readValue in_file)

ファイルからスムージング グループの値とマテリアル ID の値を読み、配列に付加します。

edge1 = readValue in_file
edge2 = readValue in_file
edge3 = readValue in_file

さらに、3 つのエッジ可視性の値を読みます。

Editable_Mesh : GeometryClass および TriMesh : 値

append edge_array #(edge1, edge2, edge3)

後のアプリケーション用にエッジ可視性の値を格納するために、新しい配列を作成して値を付加します。

)
close in_file
new_mesh = mesh vertices:vert_array faces:face_array

この時点で、第 1 部と同様のメッシュを取得しました。ここで、結果のメッシュに追加データを適用する必要があります。

for f = 1 to num_faces do
(

これを行うために、新しいループを開始します。

setFaceSmoothGroup new_mesh f sgroup_array[f]

次に、new_mesh オブジェクトの f 番目のスムージング グループを、sgroup_array 内の f 番目の位置に格納された値に設定します。

setFaceMatID new_mesh f matid_array[f]

new_mesh オブジェクトの f 番目の面のマテリアル IDを、matid_array 内の f 番目の位置に格納された値に設定します。

setEdgeVis new_mesh f 1 edge_array[f][1]
setEdgeVis new_mesh f 2 edge_array[f][2]
setEdgeVis new_mesh f 3 edge_array[f][3]

さらに、new_mesh オブジェクトの f 番目の 3 つのエッジのそれぞれのエッジ可視性を、edge_array 内の f 番目の位置にある下位の配列に格納された値に設定します。

)
update new_mesh

最後に、内部のメッシュ キャッシュを更新して、シーン内に変更が反映されるようにします。これは、非常に重要なステップです。

)
)
)

スクリプトの使い方

スクリプトをテストするために、Output スクリプトを使用して最初にファイルを作成します。次に、MAXScript エディタのメニューからこのスクリプトを開き、[ツール] (Tools) > [評価] (Evaluate)を選択するか、[Ctrl]+[E]を押します。他のスクリプトでファイルにエクスポートされたオブジェクトがシーンに表示されます。ローカル座標とオブジェクト変換を書き出さなかったため、そのオブジェクトの位置を訂正する必要がありますが、基点はワールド座標にあることに注意してください。

関連項目

第 2 部のチュートリアルで提案されたとおりにジオメトリ出力のスクリプト内でテクスチャ座標の書き込みを実装した場合は、さらにこのスクリプトを変更して、追加のデータを読むことができます。

戻る

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

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

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

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