カメラを設定して描画する

C# DirectX で折り曲げた矩形をカメラで写して描画します。
3Dのレンダリングでは、モデルを座標中央(0,0,0) に置いて、カメラで映し出すのが基本です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 空のプロジェクトを作成して、ソースプログラムをプロジェクトに取り込んで下さい。
    詳細は DirectX 3D で Form を表示する を参照して下さい。
  2. 三角形ポリゴンを描画する では、ピクセル座標で定義して描画しましたが、一般的に3Dモデルは、回転軸の中心(ピボット)を 0,0,0 に置いた相対座標で表現します。
    相対座標で定義した折り曲げた矩形をカメラで写して描画してみましょう。
  3. DirectX3D の初期化を行う InitializeGraphics() です。
    DeviceReset に OnResetDevice を設定します。
    OnResetDevice は Object をリセットするメソッドです。
    次に OnCreateDevice() と OnResetDevice() を呼び出して準備完了です。
        public bool InitializeGraphics()
        {
            try
            {
                presentParams.Windowed=true;
                presentParams.SwapEffect = SwapEffect.Discard;
                device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
                device.DeviceReset += new System.EventHandler(this.OnResetDevice);
                this.OnCreateDevice(device, null);
                this.OnResetDevice(device, null);
                pause = false;
                return true;
            }
                  :
        
  4. 二つに折り曲げた矩形の領域を生成するメソッド OnCreateDevice() です。
    new VertexBuffer で6個の領域を確保して、OnCreateVertexBuffer で頂点座標を設定します。
        public void OnCreateDevice(object sender, EventArgs e)
        {
            Device dev = (Device)sender;
            // VertexBuffer を生成して、OnCreateVertexBuffer で座標を格納
            vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 6, dev, 0,
                                            CustomVertex.PositionColored.Format, Pool.Default);
            vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
            this.OnCreateVertexBuffer(vertexBuffer, null);
        }
        
  5. DirectX3D のリセットを行う OnResetDevice() です。
    ポリゴンの裏面も描画できるようにカリングを Cull.None に設定しています。
        public void OnResetDevice(object sender, EventArgs e)
        {
            Device dev = (Device)sender;
            // Turn off culling, so we see the front and back of the triangle
            dev.RenderState.CullMode = Cull.None;
            // Turn off D3D lighting, since we are providing our own vertex colors
            dev.RenderState.Lighting = false;
        }
        
  6. 二つに折り曲げた矩形の頂点座標を設定メソッド OnCreateVertexBuffer です。
    6個の頂点座標(X,Y,Z) と頂点の色を設定します。
    「三角形ポリゴンを描画する」の頂点座標は画面上のピクセル値でしたが、今回は三次元座標で相対的に定義します。
    三角形ポリゴンの定義と見比べて下さい。
    座標の設定は、隣り合った三角形の一辺がつながるように頂点を定義(TriangleStrip)していきます。
    頂点座標の順序は Program Guid を参照して下さい。
        public void OnCreateVertexBuffer(object sender, EventArgs e)
        {
            VertexBuffer vb = (VertexBuffer)sender;
            CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])vb.Lock(0,0);
            verts[0].X = 1.0f; verts[0].Y = -1.0f; verts[0].Z = 0.5f; verts[0].Color = System.Drawing.Color.Red.ToArgb();
            verts[1].X = 1.0f; verts[1].Y = 1.0f; verts[1].Z = 0.5f;  verts[1].Color = System.Drawing.Color.Red.ToArgb();
            verts[2].X = 0.0f; verts[2].Y = -1.0f; verts[2].Z = -0.5f;verts[2].Color = System.Drawing.Color.Yellow.ToArgb();
            verts[3].X = 0.0f; verts[3].Y = 1.0f; verts[3].Z = -0.5f; verts[3].Color = System.Drawing.Color.Yellow.ToArgb();
            verts[4].X = -1.0f; verts[4].Y = -1.0f; verts[4].Z = 0.5f;verts[4].Color = System.Drawing.Color.Green.ToArgb();
            verts[5].X = -1.0f; verts[5].Y = 1.0f; verts[5].Z = 0.5f; verts[5].Color = System.Drawing.Color.Green.ToArgb();
            vb.Unlock();
        }
        
  7. メッセージループや OnPaint() から呼び出される描画メソッドです。
    SetupMatrices() で描画環境を設定して DrawPrimitives() で描画します。
    TriangleStrip は連続した三角形ポリゴンで、4は三角形の数です。
            // Frame の描画メソッド
            private void Render()
            {
                if (device == null) return;
                if (pause)          return;
    
                //Clear the backbuffer to a blue color 
                device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
                //Begin the scene
                device.BeginScene();
                // Setup the world, view, and projection matrices
                SetupMatrices();
    
                device.SetStreamSource(0, vertexBuffer, 0);
                device.VertexFormat = CustomVertex.PositionColored.Format;
                device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 4);
                //End the scene
                device.EndScene();
                device.Present();
            }
        
  8. 描画環境を設定する SetupMatrices です。
    View 座標(カメラ)の位置とプロジェクションを設定します。
            private void SetupMatrices()
            {
                device.Transform.View = Matrix.LookAtLH(
                            new Vector3( 0.0f, 0.0f, 5.0f ),
                            new Vector3( 0.0f, 0.0f, 0.0f ),
                            new Vector3( 0.0f, 1.0f, 0.0f ) );
                device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f );
            }
        

【演習】

  1. カメラの座標を変えて描画してみて下さい。
    new Vector3( 0.0f, 0.0f, 20.0f ),正面手前
    new Vector3( 0.0f, 5.0f, 5.0f ), 正面少し上から見下ろす
    new Vector3( 0.0f, -5.0f, 5.0f), 正面少し下から見あげる
    new Vector3( 3.0f, 0.0f, 5.0f ), 正面から少し右
    new Vector3( -3.0f, 0.0f, 5.0f ),正面から少し左
    new Vector3( 0.0f, 0.0f, -5.0f ),裏側から写す

【NOTE】

  1. View 座標(カメラ)の設定です。
    device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 0.0f, 5.0f ), new Vector3( 0.0f, 0.0f, 0.0f ), new Vector3( 0.0f, 1.0f, 0.0f ) );
  2. LookAtLH() の説明です。
    引数 説明
    Vector3() 三次元ベクトルの Object Class
    (0.0f, 0.0f, 5.0f) カメラの位置を表す3次元ベクトル
    (0.0f,0.0f,0.0f) カメラの注視点を表す3次元ベクトル
    (0.0f,1.0f,0.0f) カメラの上方向を表す3次元ベクトル
  3. 透視変換の設定です。
    Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f );
  4. PerspectiveFovLH() の説明です。
    引数 説明
    (float)Math.PI / 4視野角
    1.0f アスペクト比
    1.0f これより近い(遠い)点は表示されない
    100.0f これより遠い(近い)点は表示されない

超初心者のプログラム入門(C# Frame Work)