四面体を回転しながら描画する

C# DirectX で四面体の座標を定義して、回転しながら描画します。

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

プロジェクトの設定

  1. DirectX 3D で Form を表示 に習って、プロジェクトを作成します。
    プログラムファイルをダウンロードして、プロジェクトに取り込んで下さい。
    ファイル名 説明
    DXMen4.cs 四面体を回転しながら描画
  2. カメラを設定して描画する の応用で、四面体の座標を定義して描画します。
    そのままでは面白くないので WORLD 座標をY軸で回転しながら描画してみました。
  3. 四面体の領域を生成するメソッド OnCreateDevice() です。
    四面体の頂点の個数は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);
            }
        
  4. DirectX3D のリセットを行う OnResetDevice() です。
    カリングを Cull.None に設定すると、ポリゴンの裏面も描画されて半透明のような画像が表示されます。
    カリングと座標系の説明は Windows Guid を参照して下さい。
        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;
        }
        
  5. 四面体の頂点座標を設定メソッド OnCreateVertexBuffer です。
    6個の頂点座標(X,Y,Z) と頂点の色を設定します。
        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 = -0.577f; verts[0].Z = 0.577f; verts[0].Color = System.Drawing.Color.Blue.ToArgb();
            verts[1].X = 1.0f; verts[1].Y = -0.577f; verts[1].Z = 0.577f; verts[1].Color = System.Drawing.Color.Red.ToArgb();
            verts[2].X = 0.0f; verts[2].Y = 1.15f; verts[2].Z = 0.0f; verts[2].Color = System.Drawing.Color.White.ToArgb();
            verts[3].X = 0.0f; verts[3].Y = -0.577f; verts[3].Z = -1.15f;verts[3].Color = System.Drawing.Color.Green.ToArgb();
            verts[4].X = -1.0f; verts[4].Y = -0.577f; verts[4].Z = 0.577f; verts[4].Color = System.Drawing.Color.Blue.ToArgb();
            verts[5].X = 1.0f; verts[5].Y = -0.577f; verts[5].Z = 0.577f;  verts[5].Color = System.Drawing.Color.Red.ToArgb();
    
            vb.Unlock();
        }
        
  6. 描画環境を設定する SetupMatrices です。
    MatrixRotationY() でY軸を中心にワールド座標を回転します。
    fAngle で回転角度が決まります。
    レンダリング関数はメッセージループから直接呼び出されるので、マシンの性能によって呼び出される間隔が異なります。
    高性能のマシンでは、1秒間に百回以上も呼び出されることもあれば、低性能のマシンでは十回を切るかも知れません。
    そこで TickCount を使って、呼び出される間隔が違っても回転速度が変わらないようにします。
    性能の低いマシンでは多少動きが荒くなるかも知れませんが、同じよう回転することができます。
    Math.PI は円周率で 2πラジアン=360度になります。
    5000.0f の値を変えて回転速度を変えてみて下さい。
    LookAtLH で View 座標(カメラ)を、PerspectiveFovLH でプロジェクションを設定します。
    詳細は カメラを設定して描画する を参照して下さい。
        // ワールド座標の回転と描画環境の設定
        private void SetupMatrices()
        {
            int  iTime  = Environment.TickCount % 5000;
            float fAngle = iTime * (2.0f * (float)Math.PI) / 5000.0f;
            device.Transform.World = Matrix.RotationY( fAngle );
    
            device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 1.0f,4.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. 回転速度を遅く(速く)して描画して下さい。
  2. カメラの座標を変えて(真上・真下・正面・左上・右下)描画してみて下さい。
  3. カメラの注視点を変えて試してみて下さい。
  4. 上方向を表す3次元ベクトルを変えて試してみて下さい。
  5. カリングを Cull.None に設定すると、ポリゴンの裏面も描画されて半透明のような画像が表示されます。

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