在鍵盤與滑鼠都設定完成以後,接下來就是編寫主程式的時候了。
在主程式的CLASS中,在一開始的時候加入,剛剛滑鼠與鍵盤的命名空間
Using Game.Input;
增加完畢以後,增加以下屬性在主程式
Model FD; // 儲存3D Model的資訊
Camera camera; // 建立攝影機的類別
MyKeyboard keyboard; // 建立鍵盤的類別
MyMouse mouse; // 建立滑鼠的類別
float Angle =0.0f; // 旋轉的角度
float Rotation = 1.0f; // 設定每次旋轉多少角度
Vector3 move = new Vector3(); // 建立移動的向量
Vector3 Position = new Vector3(-500.0f,300.0f,-400.0f); // 觀察者的位置
在建構子裡面,需要實作三個類別
camera = new Camera();
keyboard = new MyKeyboard();
mouse = new MyMouse();
在LoadGraphicsContent方法中,加入讀取FBX 3D模型。
FD = content.Load<Model>(@”.\mesh\FD”);
在Update中,就是用來判斷,鍵盤或是滑鼠是否被按下等處理
float elapsedtime = gameTime.ElapsedGameTime.Milliseconds / 1000.0f;
// 因為電腦處理數度不同,有些電腦更新速度很快,執行的時候就會動的很快,對於醫些電腦配備不怎麼好的人,這樣對他們很不公平,所以XNA提供這個方法,可以來判斷現在用了多少時間執行那個動作。
move = Vector3.Zero;
keyboard.Update(); // 要求鍵盤資訊更新
mouse.Update(); // 要求滑鼠更新
if (keyboard.IsKeyHit(Keys.Escape)) // 判斷滑鼠是否被按下
this.Exit();
if (keyboard.IsKeyDown(Keys.Left)) // 視野旋轉
Angle += Rotation * elapsedtime; // 角度加上旋轉角,在乘上過了多久的時間
if (keyboard.IsKeyDown(Keys.Right)) // 視野旋轉
Angle -= Rotation * elapsedtime;
if (Angle > 2 * MathHelper.Pi) // 判斷是否旋轉的視野超過2PI
Angle -= (float)2 * MathHelper.Pi;
if (Angle < 2 * MathHelper.Pi)
Angle += (float)2 * MathHelper.Pi;
if (keyboard.IsKeyDown(Keys.Down)) // 視野拉近
{
move = Vector3.Normalize(Position); // 這邊作的方式,就是現在眼睛所看的地方(向量),拉近。
move += move * elapsedtime * 1000;
}
if (keyboard.IsKeyDown(Keys.Up))
{
move = Vector3.Normalize(Position);
move -= move * elapsedtime * 1000;
}
在Draw中,呼叫DrawModel的函數。
在DrawModel中
Matrix[] transforms = new Matrix[FD.Bones.Count];
FD.CopyAbsoluteBoneTransformsTo(transforms);
Matrix S = Matrix.CreateScale(2.0f, 2.0f, 1.0f);
Matrix R = Matrix.CreateRotationY(Angle);
Matrix T = Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);
Matrix World = S * R * T;
Position += move;
LookAt += move;
Vector3 Up = Vector3.Up;
camera.SetViewMatrixValue(Position, LookAt, Up);
float FOV = MathHelper.ToRadians(45.0f);
float aspectRatio = 800 / 600;
camera.SetProjectionMartixValue(FOV, aspectRatio, 1.0f, 10000.0f);
foreach (ModelMesh mesh in FD.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.World = transforms[mesh.ParentBone.Index] * World;
effect.View = camera.View;
effect.Projection = camera.Projection;
}
mesh.Draw();
}
在DrawModel方法中,與之前類別相似。所以就沒有特別說明。
編譯過後可以看到一個可以選轉拉近的3D MODEL。
範例
稍後補上

這裡忽然想到一個問題 就是滑鼠指標有沒有辦法在視窗中出現呢? 因為可能只會用到簡單的功能 例如滑鼠出現在某個位置的時候點下去會討到另一個函式中而已 感覺的範例就有點過多不必要的東西@@|||
滑鼠可以出現在視窗中,只是要寫額外的程式碼,因為預設中是關閉的狀態。
http://msdn.microsoft.com/en-us/library/bb197572.aspx 恩看到此範例了 加入this.IsMouseVisible = true;這可以顯示了 問題是裡面的X值Y值 現在我只是要當X值在多少之間和Y值多少之間然後進入其他函式去 可是XY的值好像都怪怪的 他是視窗的值還是整個螢幕的值呢@@|||
他有說是視窗的值... The mouse x and y positions are returned relative to the upper-left corner of the game window. 看來MSDN有多一些不錯的文章了... 之前1.0他們還沒有寫這麼多...2.0相關文章就多了...只是還是是英文...中文阿ORZ
請問一下你的camera對象是如何寫的呀?/ 只看到說了MyKeyboard MyMouse /沒有講camera呢/
在Keyboard的部分,主要是用到Matrix的CreateRotation這個函數去針對X、Y或Z軸做旋轉... 很多人人常常誤以為是Camera在旋轉,其實不是... 關於模型的部分使用的矩陣是World Matrix(世界矩陣) 如果要設計Camera的話,關鍵的矩陣就在View Matrix(視野矩陣) camera.SetViewMatrixValue(Position, LookAt, Up); 這一行,可以看到SetViewMatrixValue,第一個參數是位置,觀察點,Up Vector 如果你是要問Camera物件的話,這部分我沒有寫出來... 這篇文章是XNA1.0的部分,最近我會抽空寫XNA2.0以上可以用的文章 會將以前的東西重新寫過。 XNA2.0以上對於基礎的教學就不會差異很大了
1-->如何任意旋轉鏡頭而非被綁再固定的一軸 2-->如何讀取FBX檔中的動作,例如我按A鍵讀前100格的攻擊動作,按B鍵讀後100格的奔跑動作