チュートリアル 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 オブジェクトがテクスチャと共にファイルからロードされる。meshMaterials と meshTextures はどちらも、ファイルからロードされた 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.