Share via


チュートリアル 6: メッシュの使い方

チュートリアル 6: メッシュの使い方

複雑なジオメトリは通常 3D モデリング ソフトウェアを使ってモデリングされ、ファイルに保存される。たとえば、.x ファイル フォーマットなどがある。Microsoft® Direct3D® では、メッシュを使ってこれらのファイルからオブジェクトをロードする。Meshes チュートリアル プロジェクトでは、メッシュに関するトピックを説明し、メッシュをロード、レンダリング、アンロードする方法を示す。

メッシュには、複雑なモデルに対するデータが含まれている。メッシュは、テクスチャやマテリアルなどのリソース、位置データや隣接性データなどの属性を保持する、抽象的なデータ コンテナである。メッシュは若干複雑だが、Direct3D にはメッシュの使用を容易にするメソッドが含まれている。

パス

ソースの場所 : (SDK ルート)\Samples\C#\Direct3D\Tutorials\Tutorial6

手順

Direct3D の初期化、Microsoft Windows® メッセージの処理、レンダリング、シャットダウンについては、「チュートリアル 1: デバイスの作成」を参照すること。

チュートリアル 5: テクスチャ マップの使い方」では、Direct3D オブジェクトにテクスチャを作成した。このチュートリアルでは、ファイルからのメッシュを扱う手順をチュートリアル 5 のコードに追加する。一方で、頂点バッファの作成に使われていたアプリケーション定義のメソッド OnCreateDevice とそれに関連するデバイス作成の呼び出しは削除する。ここで使う手順では、メッシュ メソッドの呼び出しの中で非明示的に頂点バッファを扱っている。

メッシュ オブジェクトの初期化

このチュートリアル プロジェクトでは、以下に示すように、複数次元のマテリアルとテクスチャ配列を初期化する。System.ComponentModel 名前空間および System.IO 名前空間の using 宣言にも注意すること。

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Direct3D = Microsoft.DirectX.Direct3D;
public class Meshes : Form
{
    Device device = null;              // Rendering device
    Mesh mesh = null;                  // Mesh object in system memory
    Direct3D.Material[] meshMaterials; // Materials for the mesh
    Texture[] meshTextures;            // Textures for the mesh
    PresentParameters presentParams = new PresentParameters();
    .
    .
    .
}

アプリケーションで定義した OnResetDevice メソッドは、Material 構造体にメッシュ ファイル データをキャプチャするために使われる ExtendedMaterial オブジェクトを初期化する。このメソッドは、ディレクトリ パスをメッシュ ファイルに設定し、デバイスを初期化し、z バッファと白のアンビエント ライトを有効にする。

public void OnResetDevice(object sender, EventArgs e)
{
    ExtendedMaterial[] materials = null;
    
    // Set the directory up to load the right data, because the
    //   default build location is Bin\debug or Bin\release.
    Directory.SetCurrentDirectory(Application.StartupPath +  @"\..\..\");
    
    Device dev = (Device)sender;
    
    // Turn on the z-buffer.
    dev.RenderState.ZBufferEnable = true;
    
    // Turn on ambient lighting.
    dev.RenderState.Ambient = System.Drawing.Color.White;
    .
    .
    .
}

メッシュ オブジェクトのロード

以下のコードで示すように、OnResetDevice メソッドは、次に、テクスチャ マップ化された 3D のトラを表すメッシュを、tiger.x ファイルからロードする。この Mesh.FromFile メソッドの呼び出しにおいて、MeshFlags 列挙の SystemMemory 定数は、通常ではデバイスからアクセスできないシステム RAM にメッシュをロードすることを示している。メッシュがロードされると、meshMaterials Material オブジェクトは、メッシュ ファイルからロードされた materials ExtendedMaterial オブジェクトの Material 構造体をメンバに設定する。マテリアルへのアンビエント色の設定も行われる。最後に、TextureLoader.FromFile メソッドの呼び出しによって、meshTextures Texture オブジェクトがテクスチャと共にファイルからロードされる。meshMaterialsmeshTextures はどちらも、ファイルからロードされた materials 構造体の次元 (Length) に初期化される。

public void OnResetDevice(object sender, EventArgs e)
{
    .
    .
    .
    // Load the mesh from the specified file.
    mesh = Mesh.FromFile("tiger.x",
                         MeshFlags.SystemMemory,
                         device,
                         out materials);
    if (meshTextures == null)
    {
        // Extract the material properties and texture names.
        meshTextures  = new Texture[materials.Length];
        meshMaterials = new Direct3D.Material[materials.Length];
        for( int i=0; i<materials.Length; i++ )
        {
            meshMaterials[i] = materials[i].Material3D;
            
            // Set the ambient color for the material. Direct3D
            // does not do this by default.
            meshMaterials[i].Ambient = meshMaterials[i].Diffuse;
            
            // Create the texture.
            meshTextures[i] = TextureLoader.FromFile(dev,
                                       materials[i].TextureFilename);
        }
    }
}

メッシュ オブジェクトのレンダリング

メッシュをロードしたら、プライベート メソッドの Render を呼び出してメッシュ オブジェクトをレンダリングする。チュートリアル 5 で行われていたように、このメソッドは、最初にシーンを開始し、アプリケーション定義のメソッド SetupMatrices を呼び出す。レンダリングするため、メッシュは、ロードされたマテリアルごとに 1 つずつのサブセットに分割されている。次のコードで示すように、ループを実行して各マテリアル サブセットをレンダリングする。ループでは、マテリアルごとに以下の処理を行う。

  • デバイスの Material プロパティに、meshMaterials Material 構造体を設定する。
  • デバイスのテクスチャ ステージ 0 に、meshTextures Texture 構造体を設定する。
  • マテリアルのサブセットを、DrawSubset メソッドで描画する。このメソッドは、BaseMesh クラスから継承する。
private void Render()
{
    .
    .
    .
    for( int i=0; i<meshMaterials.Length; i++ )
    {
        // Set the material and texture for this subset.
        device.Material = meshMaterials[i];
        device.SetTexture(0, meshTextures[i]);
        
        // Draw the mesh subset.
        mesh.DrawSubset(i);
    }
    
    // End the scene.
    device.EndScene();
    device.Present();
}

© 2002 Microsoft Corporation. All rights reserved. Terms of use.