チュートリアル 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 座標系」を参照すること。

  1. ワールド トランスフォーム行列: このチュートリアルでは、次のサンプル コードで示すように、Matrix.RotateY メソッドを呼び出すことで、y 軸を中心にして三角形を回転させる。Matrix は汎用の Microsoft.DirectX 名前空間の一部であることに注意すること。この呼び出しでは、システムの Environment.TickCount メソッドの値をスケーリング値で割ったものを、ラジアン単位の RotateY 引数として使う。この手順により、三角形は y 軸の周りを滑らかに回転するようになる。
  2. ビュー トランスフォーム行列: ビュー トランスフォーム行列は、シーンのカメラ ビューを生成する。このサンプル コードでは、Matrix.RotateY メソッドを呼び出すことで行う。3 つの Vector3 ベクトルが、左手 (LH) 座標系ビュー行列を作成する LookAtLH メソッドの引数を形成する。3 つのベクトルは、それぞれ、目の位置、カメラの注視対象 (この場合は原点)、現在のワールドの上方を表す。
  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.