XNA-顯示3D模型

將3D模型從3D軟體匯出之後,接下來就需要將它運用到程式中,程式中要顯示3D模型必須先將它加入到專案中,在方案總管中Content上按右鍵=>加入=>現有項目,然後你就可以選擇你要加入到專案中的模型檔案,XNA支援副檔名有X和FBX的檔案,選好後它就加入到你的專案中了,之後需在加入模型的檔案上按右鍵的屬性中命名,其中的Asset name這會在程式中使用到,所以必須命名,之後就是編寫程式碼讓3D模型顯示在螢幕上。

    在遊戲函數一開始就必須先宣告存放3D模型的變數。

Model 變數名稱;

    之後再到LoadContent函數中編寫要讀取專案中的哪個模型。

變數名稱 = content.load<Model>( "名稱")=>名稱就是在模型上取的Asset name

    然後再到Draw函數裡撰寫程式讓它顯示出來,要在3D中顯示模型會需要使用到矩陣運算、攝影機(觀測點)、投影轉換、繪圖著色最後才是真正的畫出模型,以下以XNA內建的函數來幫助我們快速的顯示模型,往後會更詳細的介紹每個細節。

    3D模型是一群數值資料,紀錄一個3D物件的形狀,而一個模型可能是由好幾個子物件所組成,每個子物件都會有自己的模型網格(mesh),也就是用一群三角面來拼湊這個子物件的外觀形狀,所以要畫出一個模型就必須把它所有的模型網格畫出來。

    這邊需要先宣告一個儲存模型骨骼的變數。

Matrix[] 變數 = new Matrix[模型變數.Bones.Count];

    然後再將模型的骨骼資訊複製到剛剛宣告的矩陣變數裡。

模型變數.CopyAbsoluteBoneTransformsTo(矩陣變數);

    之後就必須使用迴圈將模型真正的畫出來,這邊需要注意的是因為我們使用的是XNA提供的基本效果,所以才會有Draw這個成員函數可以使用,如果要使用我們自行撰寫shader程式的話,就必須使用到DrawIndexedPrimitive這個函數來繪製模型。

foreach (ModelMesh 網格變數 in 模型變數.Meshes)
{
        // 這邊使用XNA提供的基本效果來繪製模型
        foreach (BasicEffect 效果變數 in 網格變數.Effects)
        {
                 // 使用XNA提供的打光方法,才不會一片漆黑
                效果變數.EnableDefaultLighting();
                // 將模型的位置傳給效果來繪製模型
                效果變數.World = 矩陣變數[網格變數.ParentBone.Index]*世界矩陣;
                效果變數.View = 觀看矩陣;
                效果變數.Projection = 投影矩陣;
                // 實際把模型畫出來
                網格變數.Draw();
        }

}

程式範例:

  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using Microsoft.Xna.Framework;   
  5. using Microsoft.Xna.Framework.Audio;   
  6. using Microsoft.Xna.Framework.Content;   
  7. using Microsoft.Xna.Framework.GamerServices;   
  8. using Microsoft.Xna.Framework.Graphics;   
  9. using Microsoft.Xna.Framework.Input;   
  10. using Microsoft.Xna.Framework.Media;   
  11. using Microsoft.Xna.Framework.Net;   
  12. using Microsoft.Xna.Framework.Storage;   
  13.   
  14. namespace display3D   
  15. {   
  16.     public class Game1 : Microsoft.Xna.Framework.Game   
  17.     {   
  18.         GraphicsDeviceManager graphics;   
  19.         SpriteBatch spriteBatch;   
  20.         Model robot;     //宣告存放機器人的變數   
  21.   
  22.         public Game1()   
  23.         {   
  24.             graphics = new GraphicsDeviceManager(this);   
  25.             Content.RootDirectory = "Content";   
  26.         }   
  27.   
  28.         protected override void Initialize()   
  29.         {   
  30.             base.Initialize();   
  31.         }   
  32.   
  33.         protected override void LoadContent()   
  34.         {   
  35.             spriteBatch = new SpriteBatch(GraphicsDevice);   
  36.             robot = Content.Load<Model>("playerRobot");   
  37.         }   
  38.   
  39.         protected override void UnloadContent()   
  40.         {   
  41.         }   
  42.   
  43.         protected override void Update(GameTime gameTime)   
  44.         {   
  45.             base.Update(gameTime);   
  46.         }   
  47.   
  48.         protected override void Draw(GameTime gameTime)   
  49.         {   
  50.             // 首先要求XNA Framework替我們清除螢幕成淺藍色的底色   
  51.             graphics.GraphicsDevice.Clear(Color.CornflowerBlue);   
  52.             //將模型放置在遊戲世界的中心   
  53.             Matrix world = Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);   
  54.             //從離Z軸50單位的地方向著原點看   
  55.             Matrix view = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 50.0f), Vector3.Zero, Vector3.Up);   
  56.             //將3D到2D螢幕的投影轉換   
  57.             Matrix projection = Matrix.CreatePerspectiveFieldOfView((float)Math.PI / 4.0f, 800.0f / 600.0f, 1.0f, 1000.0f);   
  58.   
  59.             //宣告變數儲存機器人的骨骼資訊   
  60.             Matrix[] temprobot = new Matrix[robot.Bones.Count];   
  61.             robot.CopyAbsoluteBoneTransformsTo(temprobot);   
  62.   
  63.             //將機器人的每個部位畫出來   
  64.             foreach (ModelMesh mesh in robot.Meshes)   
  65.             {   
  66.                 // 這邊使用XNA提供的基本效果來繪製模型   
  67.                 foreach (BasicEffect effect in mesh.Effects)   
  68.                 {   
  69.                     // 使用XNA提供的打光方法,才不會一片漆黑   
  70.                     effect.EnableDefaultLighting();   
  71.                     // 將模型的位置傳給效果來繪製模型   
  72.                     effect.World = temprobot[mesh.ParentBone.Index] * world;   
  73.                     effect.View = view;   
  74.                     effect.Projection = projection;   
  75.                     // 實際把模型畫出來   
  76.                     mesh.Draw();   
  77.                 }   
  78.             }   
  79.   
  80.             base.Draw(gameTime);   
  81.         }   
  82.     }   
  83. }  

1

最後附上專案檔display3D.rar

<script></script> <script src="http://s1.dotblogs.com.tw/admentorserve.aspx?type=js&z=18&target=_top&a=11"></script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值