チュートリアル 3: 行列の使い方
チュートリアル 3: 行列の使い方
Matrices チュートリアル プロジェクトでは、行列の概念とその使い方を示す。行列は、頂点の座標をトランスフォームしたり、カメラとビューポートを設定したりするために使う。
パス
ソースの場所 : (SDK ルート)\Samples\C#\Direct3D\Tutorials\Tutorial3
手順
注 Microsoft® Direct3D® の初期化、Microsoft Windows® メッセージの処理、レンダリング、シャットダウンについては、「チュートリアル 1: デバイスの作成」を参照すること。
「チュートリアル 2: 頂点のレンダリング」では、2D の頂点をレンダリングして三角形を描画した。このチュートリアルでは、3D 頂点トランスフォームを使って三角形を回転する処理を、チュートリアル 2 のコードに追加する。
このプロジェクトでは三角形のオブジェクトにトランスフォームを適用するので、チュートリアル 2 で既にトランスフォームした 2D ウィンドウ座標を使うのではなく、以下のコードで示すように、CustomVertex.PositionColored 構造体で頂点バッファを初期化する。
Device dev = (Device)sender;
// Now create the vertex buffer.
vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored),
3,
dev,
0,
CustomVertex.PositionColored.Format,
Pool.Default);
さらに、プライベートの Render メソッドにおいて、デバイスの頂点フォーマットを PositionColored フォーマットに初期化する。ジオメトリをレンダリングする前に、アプリケーションで定義した SetupMatrices メソッドを Render から呼び出す。このメソッドは、三角形オブジェクトの 3D 行列トランスフォームを作成して設定する。
private void Render()
{
.
.
.
// Set up the world, view, and projection matrices.
SetupMatrices();
device.SetStreamSource(0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.PositionColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
// End the scene.
device.EndScene();
device.Present();
}
通常、3D シーンには 3 種類のトランスフォームが設定される。トランスフォームはすべて、Device.Transform プロパティからアクセスする Transforms オブジェクトのプロパティとして定義される。いずれも、Direct3D の標準的な左手座標系を使う。「3D 座標系」を参照すること。
- ワールド トランスフォーム行列: このチュートリアルでは、次のサンプル コードで示すように、Matrix.RotateY メソッドを呼び出すことで、y 軸を中心にして三角形を回転させる。Matrix は汎用の Microsoft.DirectX 名前空間の一部であることに注意すること。この呼び出しでは、システムの Environment.TickCount メソッドの値をスケーリング値で割ったものを、ラジアン単位の RotateY 引数として使う。この手順により、三角形は y 軸の周りを滑らかに回転するようになる。
- ビュー トランスフォーム行列: ビュー トランスフォーム行列は、シーンのカメラ ビューを生成する。このサンプル コードでは、Matrix.RotateY メソッドを呼び出すことで行う。3 つの Vector3 ベクトルが、左手 (LH) 座標系ビュー行列を作成する LookAtLH メソッドの引数を形成する。3 つのベクトルは、それぞれ、目の位置、カメラの注視対象 (この場合は原点)、現在のワールドの上方を表す。
- 射影トランスフォーム行列: 射影トランスフォーム行列は、3D ビュー空間から 2D ビューポート空間にジオメトリをトランスフォームする方法を定義する。このサンプル コードでは、左手座標系の PerspectiveFovLH メソッドから返される行列から形成する。メソッドに対する引数は、視野角 (ラジアン単位)、アスペクト比 (空間の高さを幅で割った値)、近クリップ面の距離、遠クリップ面の距離である。
トランスフォーム行列を作成する順序は、シーン内のオブジェクトのレイアウトには影響しない。ただし、Direct3D は、上記の順序でシーンに行列を適用する。
private void SetupMatrices()
{
// WORLD MATRIX: Just rotate the object about the y-axis.
device.Transform.World = Matrix.RotationY(
Environment.TickCount / 150.0f );
// VIEW MATRIX: A view matrix can be defined given an eye point,
// a point to look at, and a direction for which way is up. Here, set the
// eye five units back along the z-axis and up three units, look at the
// origin, and define "up" to be in the y-direction.
device.Transform.View = Matrix.LookAtLH(
new Vector3( 0.0f, 3.0f,-5.0f ),
new Vector3( 0.0f, 0.0f, 0.0f ),
new Vector3( 0.0f, 1.0f, 0.0f ) );
// PROJECTION MATRIX: Set up a perspective transform (which
// transforms geometry from 3-D view space to 2-D viewport space), with
// a perspective divide making objects smaller in the distance. To build
// a perspective transform, use the field of view (1/4 pi is common),
// the aspect ratio, and the near and far clipping planes (which define
// at what distances geometry should be no longer be rendered).
device.Transform.Projection = Matrix.PerspectiveFovLH(
(float)Math.PI / 4, 1.0f, 1.0f, 100.0f );
}
レンダリングの特性は、RenderStates クラスのプロパティを設定することで制御する。次のコードで示すように、この処理はアプリケーションで定義したメソッド OnResetDevice で行っている。
public void OnResetDevice(object sender, EventArgs e)
{
Device dev = (Device)sender;
// Turn off culling, so the user sees the front and back of the triangle
dev.RenderState.CullMode = Cull.None;
// Turn off Direct3D lighting, since object provides its own vertex colors
dev.RenderState.Lighting = false;
}
この場合、背面カリングと Direct3D ライティングはどちらもオフになっている。この設定により、全深度で 3D オブジェクトはオブジェクト自体の色で表示される。
© 2002 Microsoft Corporation. All rights reserved. Terms of use.