ポイントプリミティブの描画

XNA の Direct3D でポイントプリミティブを使って点を描画します。

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

プログラムの説明

  1. XNA では三次元座標を定義して、ポイントやラインやポリゴンを描画することが出来ます。
    最初に多角形の三次元座標を定義して、ポイントを描画してみましょう。
  2. Game1.cs を編集して、次の領域を宣言して下さい。
    graphics は2Dのときと同じです。
    viewMatrix は View 座標(カメラの位置)を設定する領域です。
    projectionMatrix は 描画環境を設定する領域です。
    basicEffect は Effect(モデルの色やテクスチャなどの付加情報)を制御する領域です。
    vertexDeclaration は頂点座標の形式を定義する領域です。
    pointList[] は三次元座標を定義する配列です。
    vertexBuffer は頂点データを描画するバッファの領域です。
    points は多角形の数で、5で五角形を描画します。
        GraphicsDeviceManager graphics; 
    
        Matrix              viewMatrix; 
        Matrix              projectionMatrix; 
        BasicEffect         basicEffect; 
     
        VertexDeclaration   vertexDeclaration; 
        VertexPositionNormalTexture[] pointList; 
        VertexBuffer        vertexBuffer; 
        int points =        5; 
        //int points =        8; 
        
  3. LoadContent() から初期化を行うメソッドを呼び出します。
        protected override void LoadContent() 
        { 
            InitializeTransform(); 
            InitializeEffect(); 
            InitializePointList(); 
        } 
        
  4. InitializeTransform() メソッドでは、viewMatrix と projectionMatrix を設定します。
    Vector3(0,0,10) は View(カメラ)の座標で、10の値を小さくするとズームアップします。
    詳細は 前田稔の超初心者のプログラム入門 から DirectX9 講座を参照して下さい。
        private void InitializeTransform() 
        { 
            viewMatrix = Matrix.CreateLookAt( 
            new Vector3( 0, 0, 10 ), Vector3.Zero, Vector3.Up ); 
            //new Vector3( 0, 0, 5 ), Vector3.Zero, Vector3.Up ); 
     
            projectionMatrix = Matrix.CreatePerspectiveFieldOfView( 
                MathHelper.ToRadians( 45 ), 
                (float)graphics.GraphicsDevice.Viewport.Width / 
                (float)graphics.GraphicsDevice.Viewport.Height, 1.0f, 100.0f ); 
        } 
        
  5. InitializeEffect() メソッドでは、basicEffect を生成します。
    DiffuseColor はモデルの色(物質の基本色)で、赤,緑,青の順に色レベルを指定します。
    View は View 座標(カメラの位置)です。
    Projection は描画環境の設定です。
        private void InitializeEffect() 
        { 
            basicEffect = new BasicEffect( graphics.GraphicsDevice, null ); 
            //basicEffect.DiffuseColor = new Vector3( 1.0f, 1.0f, 1.0f ); 
            basicEffect.DiffuseColor = new Vector3( 1.0f, 1.0f, 0.0f ); 
     
            basicEffect.View = viewMatrix; 
            basicEffect.Projection = projectionMatrix; 
        } 
        
  6. InitializePointList() メソッドでは、多角形のポイント(頂点)を描画するために座標を設定します。
    angle は多角形を生成するための回転角度です。
    pointList[0] が多角形の中央で、pointList[1] から pointList[points] が多角形の座標です。
    Z座標は、全てゼロになっています。
    pointList[] に座標が設定できたら、vertexBuffer に格納します。
        private void InitializePointList() 
        { 
            vertexDeclaration = new VertexDeclaration( graphics.GraphicsDevice, 
                VertexPositionNormalTexture.VertexElements ); 
     
            double angle = MathHelper.TwoPi / points; 
     
            pointList = new VertexPositionNormalTexture[points + 1]; 
     
            pointList[0] = new VertexPositionNormalTexture( 
                Vector3.Zero, Vector3.Forward, Vector2.One ); 
     
            for (int i = 1; i <= points; i++) 
            { 
                pointList[i] = new VertexPositionNormalTexture( 
                    new Vector3( 
                        (float)Math.Round( Math.Sin( angle * i ), 4 ), 
                        (float)Math.Round( Math.Cos( angle * i ), 4 ), 
                        0.0f ), 
                    Vector3.Forward, 
                    new Vector2() ); 
            } 
     
            // 頂点バッファを初期化し、各頂点についてメモリを割り当てます。 
            vertexBuffer = new VertexBuffer(graphics.GraphicsDevice,
                VertexPositionNormalTexture.SizeInBytes * (pointList.Length),
                BufferUsage.None); 
    
            // 頂点の配列に頂点バッファのデータを設定します。 
            vertexBuffer.SetData<VertexPositionNormalTexture>( pointList ); 
        } 
        
  7. Draw() メソッドで、ポイントプリミティブを使って点を描画します。
    PointSize は点の大きさです。
    DrawPrimitives() の PointList で点(ポイント)を描画します。
        protected override void Draw( GameTime gameTime ) 
        { 
            graphics.GraphicsDevice.Clear( Color.CornflowerBlue ); 
            graphics.GraphicsDevice.VertexDeclaration = vertexDeclaration; 
     
            basicEffect.Begin(); 
            foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) 
            { 
                pass.Begin(); 
                graphics.GraphicsDevice.RenderState.PointSize =  10;
                //graphics.GraphicsDevice.RenderState.PointSize =  4;
                graphics.GraphicsDevice.Vertices[0].SetSource( vertexBuffer, 0, 
                    VertexPositionNormalTexture.SizeInBytes );
    
                graphics.GraphicsDevice.DrawPrimitives(
                    PrimitiveType.PointList,
                    0,          // 最初に描画する頂点のインデックス 
                    points+1 ); // プリミティブの数
                pass.End(); 
            } 
            basicEffect.End(); 
     
            base.Draw( gameTime ); 
        } 
        
  8. メニューの [デバッグ] から [デバッグ開始] または [デバッグなしで開始] を選択します。
    五角形(八角形)の座標と中央に点が描画されます。

【演習】

  1. ポイントのサイズを大きく(小さく)して下さい。
  2. 五角形, 六角形, 八角形, 十二角形, 三十六角形を描画して下さい。
  3. 点の色を変えて描画して下さい。
  4. カメラを近づけて(引いて)、大きく(小さく)描画して下さい。

【NOTE】

頂点座標を定義する構造体には、次のようなものがあります。
  1. VertexPositionColor
    position Vector3 頂点の位置
    color Color 頂点の色
  2. VertexPositionColorTexture
    position Vector3 頂点の位置
    color Color 頂点の色
    textureCoordinate Vector2 頂点のテクスチャー座標
  3. VertexPositionNormalTexture
    position Vector3 頂点の位置
    normal Vector3 頂点の法線
    textureCoordinate Vector2 頂点のテクスチャー座標
  4. VertexPositionTexture
    position Vector3 頂点の位置
    textureCoordinate Vector2 頂点のテクスチャー座標
  5. 使わない領域には Vector3.Zero, Vector2.Zero, Vector3.Forward, new Vector2() などを指定して下さい。

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

超初心者のプログラム入門(XNA(C#) game program)