Cone.x を描画する

XNA で3Dモデル(Cone.x) を回転しながら描画します。

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

プログラムの説明

  1. XNA で3Dモデル(Cone.x) を回転しながら描画します。
    メニューから [ファイル][新規作成][プロジェクト] で新しいプロジェクトを作成して下さい。
  2. 3Dモデルのファイル(Cone.x) をプロジェクトの Content のフォルダーに格納して下さい。
    Cone.x は 前田稔の超初心者のプログラム入門 の「DirectX10/X-FILE の頂点データを定義する」 からダウンロード出来ます。
  3. プロジェクト(Cone) を立ち上げて下さい。
    ソリューションエクスプローラで Content を右クリックして [追加][既存の項目] をクリックします。
    プロジェクトの Content のフォルダーに格納した Cone.x を選択するとソリューションエクスプローラに表示されます。
    ソリューションエクスプローラの Cone.x を選択してプロパティを表示します。
    Asset Name に表示されている "Cone" が Cone.x をロードする時の ID です。
  4. Game1.cs を編集して3Dモデルを回転しながら描画するプログラムを作成します。
    class Game1 で、次の領域を宣言して下さい。
    myModel は、3Dモデルの領域です。
    aspectRatio はアスペクト比(縦横比)を計算する領域です。
    modelPosition はモデルを配置する座標です。
    modelRotation はモデルの回転係数を設定する領域です。
    cameraPosition はカメラを置く座標です。
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
    
            Model myModel; 
            float aspectRatio;      // アスペクト比
            Vector3 modelPosition = Vector3.Zero; 
            float modelRotation = 0.0f; 
            Vector3 cameraPosition = new Vector3( 0.0f, 1.0f, 5f ); 
        
  5. LoadContent() メソッドに myModel を生成するコードを追加します。
    "Cone" は Asset Name に表示されていた ID です。
    ウインドウのサイズから縦横比を計算して aspectRatio に設定します。
            protected override void LoadContent()
            {
                // Create a new SpriteBatch, which can be used to draw textures.
                spriteBatch = new SpriteBatch(GraphicsDevice);
    
                // TODO: use this.Content to load your game content here
                //※追加するコード
                myModel = Content.Load<Model>("Cone"); 
                aspectRatio = graphics.GraphicsDevice.Viewport.Width/graphics.GraphicsDevice.Viewport.Height; 
        
  6. Update() メソッドでタイマの値を取得して、自動的に回転します。
    回転速度は MathHelper.ToRadians(0.1f) で調整して下さい。
            protected override void Update(GameTime gameTime)
            {
                // Allows the game to exit
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed ||
                    Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
                // TODO: Add your update logic here
                modelRotation += (float)gameTime.ElapsedGameTime.TotalMilliseconds * MathHelper.ToRadians( 0.1f ); 
    
                base.Update(gameTime);
            }
        
  7. Draw() メソッドに3Dモデルを描画するコードを追加します。
            protected override void Draw(GameTime gameTime)
            {
                graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
                // TODO: Add your drawing code here
                Matrix[] transforms = new Matrix[myModel.Bones.Count]; 
                myModel.CopyAbsoluteBoneTransformsTo( transforms ); 
    
                // モデルを描画します。モデルは複数のメッシュを持つことができるので、ループします。  
                foreach (ModelMesh mesh in myModel.Meshes) 
                { 
                    // メッシュの向きが設定される場所です。カメラおよび射影の向きも設定されます。  
                    foreach (BasicEffect effect in mesh.Effects) 
                    { 
                        effect.EnableDefaultLighting(); 
                        effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY( modelRotation ) 
                                            * Matrix.CreateTranslation( modelPosition ); 
                        effect.View = Matrix.CreateLookAt( cameraPosition, Vector3.Zero, Vector3.Up ); 
                        effect.Projection = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians( 45.0f ), 
                                            aspectRatio, 1.0f, 1000.0f ); 
                    } 
                    // 上記で設定されたエフェクトを使用してメッシュを描画します。 
                    mesh.Draw(); 
                }
    
                base.Draw(gameTime);
        
  8. メニューの [デバッグ] から [デバッグ開始] または [デバッグなしで開始] を選択します。
    コンパイルされ、エラーが無ければコーンのモデルが回転しながら描画されます。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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

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