摘要:實作XNA FRAMEWORK中的INPUT操作 (三)
在鍵盤與滑鼠都設定完成以後,接下來就是編寫主程式的時候了。
在主程式的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。
範例
稍後補上