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

これは、「ジオメトリ データの出力 - 第 1 部」チュートリアルで作成された外部テキスト ファイルからメッシュ ジオメトリ データを読み込む基本的な例です。ファイルには、頂点と面のリストのみが含まれています。

関連トピック:

FileStream 値

Editable_Mesh : GeometryClass および TriMesh : 値

全体の流れ:

頂点と面のリストを保持する 2 つの空の配列を作成します。

入力ファイル名を定義します。

読み取り用にファイルを開きます。

ファイルが存在する場合は、ファイルから頂点と面の数を読み取ります。

すべての頂点の値を巡回して変数に読み込み、次にその変数の値を頂点の配列に付加します。

すべての面の値を巡回して変数に読み込み、次にその変数の値を面の配列に付加します。

ファイルを閉じます。

頂点と面の配列を使用して、新しいメッシュを作成します。

MAXScript

    vert_array = #()
    face_array = #()
    in_name = ((GetDir #export)+"/testmesh.dat")
    in_file = openFile in_name
    if in_file != undefined then
    (
     num_verts = readValue in_file
     num_faces = readValue in_file
     vert_array.count = num_verts
     face_array.count = num_faces
     for v = 1 to num_verts do
     (
      vert = readValue in_file
      vert_array[v] = vert
     )
     for f = 1 to num_faces do
     (
      face = readValue in_file
      face_array[f] = face
     )
     close in_file
     new_mesh = mesh vertices:vert_array faces:face_array
    )

ステップごとの解説

vert_array = #() face_array = #()

最初に、頂点と面のデータを収集する 2 つの空の配列を定義します。

配列の値

in_name = ((GetDir #export)+"/testmesh.dat")

次に、「ジオメトリの出力 - 第 1 部」チュートリアルで行ったように、入力ファイルの名前を定義します。これは現在、出力および入力の両方のスクリプト内にハードコードされた名前です。このチュートリアルの第 2 部では、ファイルを開くダイアログ ボックスからユーザがファイルを選択できるようにします。

in_file = openFile in_name

ファイル名を使用して入力用にファイルを開きます。指定されたパスが存在する場合は、fileStream 値が in_file 変数に格納されます。パスが存在しない場合は、代わりに undefined 値が格納されます。

FileStream 値

if in_file != undefined then (

上記の点から、ファイルが有効かどうかをチェックします。値が undefined でない場合、ファイルは正常に開かれています。値が undefined である場合は、ブラケットで囲まれた以降のすべての行が無視されます。

If 式

Undefined 値

num_verts = readValue in_file

ファイルの最初の行には、コンマで区切られた頂点と面の数が含まれています。readValue メソッドを使用して、ファイルから最初の値を読み取ります。その値は、num_verts 変数に格納されます。

FileStream 値

num_faces = readValue in_file

readValue メソッドを使用して、ファイルから次の値を読み取ります。その値は、num_faces 変数に格納されます。

vert_array.count = num_verts face_array.count = num_faces

ここで、ファイル内に格納されていた頂点と面の数が判明したので、頂点と面のための配列を初期化します。これで、両方の配列のために十分なメモリが確保されます。

for v = 1 to num_verts do (

次に、頂点の位置を読み取ります。変数 v が 1 から始まりファイルに格納されていた頂点の数まで変化する、新しいループを開始します。

for ループ

vert = readValue in_file

readValue メソッドを使用して、ファイルから Point3 の値を読み取ります。それらの値をユーザ変数 vert に格納します。

vert_array[v] = vert

そして、vert_array 配列の v 番目の位置に値を代入します。

)

この時点で、すべての頂点の位置が読み込まれ、配列内に配置されました。

for f = 1 to num_faces do (

num_faces 変数を使用して、面の定義も読み取ることができます。変数 f が 1 から始まりファイルに格納されていた面の数まで変化する、別のループを開始します。

face = readValue in_file

readValue メソッドを使用して、面を定義する頂点のインデックスを指定する Point3 の値をファイルから読み取ります。それらの値をユーザ変数 face に格納します。

face_array[f] = face

そして、face_array 配列の f 番目の位置に値を代入します。

)

この時点で、すべての面の定義が読み込まれ、配列内に配置されました。

close in_file

ここでファイルを閉じることができます。

new_mesh = mesh vertices:vert_array faces:face_array

最後に、ファイルから収集された頂点および面の配列を指定して、新しいメッシュを作成します。

Editable_Mesh : GeometryClass および TriMesh : 値

)

スクリプトの使い方

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

コードの最適化

前に説明したように、これはジオメトリを入力する基本コードです。このコードは、さらにコンパクトにすることができます。以下は、同じコードの短縮バージョンです。2 つのスクリプトを比較して、多少異なる表現があっても同じことを実行している理由を考えてください。

MAXScript

    vert_array = #()
    face_array = #()
    in_file = openFile ((GetDir #export)+"/testmesh.dat")
    if in_file != undefined then
    (
     num_verts = readValue in_file
     num_faces = readValue in_file
     vert_array.count = num_verts
     face_array.count = num_faces
     for v = 1 to num_verts do vert_array[v] = (readValue in_file)
     for f = 1 to num_faces do face_array[f] = (readValue in_file)
     close in_file
     new_mesh = mesh vertices:vert_array faces:face_array
    )

関連項目

「ジオメトリの入力」チュートリアルの第 2 部では、「ジオメトリの出力 第 2 部」チュートリアルで行われた変更を反映させるために、より堅牢なコードを作成し、いくつかの機能も追加します。

戻る

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

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

次へ

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

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