2009年4月18日:
今天开始要学习xna了,拿到了第一本关于xna的书,感觉前面还是挺简单的。现在谈谈关于前面的一些准备和一些简单的函数和结构。
在游戏开发中对矩阵的使用是很重要的,xna也不例外,它使用的是左手坐标系。在我们游戏中,常用的旋转其实是绕着y轴旋转。在xyz的比例上缩放原先的(2,3,5)倍的话,可以写成
MATRIX S=Matrix.CreateScale(2.0f,3.0f,5.0f),
MATRIX R=Matrix.CreateRotationY(MathHelp.Pi/2.0f),表示绕着y轴旋转90度
MATRIX S=Matrix.CreateTranslation(100.0f,50.0f,30.0f),表示把模型放到空间坐标(100,50,30)。
Matrix view = Matrix.CreateLookAt(new Vector3(-5.0f, 2.0f, -10.0f), Vector3.Zero, Vector3.Up);
表示在 Vector3(-5.0f, 2.0f, -10.0f)放置一个摄像机朝着Vector3.Zero看过去,Vector3.Up表示摄像机顶着的方向。
Matrix projection = Matrix.CreatePerspectiveFieldOfView((float)Math.PI / 4.0f, 800.0f / 600.0f, 1.0f, 1000.0f); 表示把3D世界中的物体正确的显示在2D画面上,这步称为投影转换。第一参数表示眼睛的视野,第二个参数表示3D画面的宽度除以高度的比例值。第三个参数表示看到的最近距离,第四个参数表示最远的距离。
3D模型都是由不同的部件组成而成的,而每个部分都是由模型网格组成的(也就是用一群三角面来评凑这个物体的外观形状)。如果要画出整个模型就要画出所有的网格模型,在每个网格模型,都可以指定一个绘画用的effect类。3D模型一般会有个根轴,当它运动时,其他部件会随着移动。
代码如下protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
Matrix world = Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);//这个函数用来建立位移矩阵,把物体移动到x,y,z位置
Matrix view = Matrix.CreateLookAt(new Vector3(-5.0f, 2.0f, -10.0f), Vector3.Zero, Vector3.Up);
Matrix projection = Matrix.CreatePerspectiveFieldOfView((float)Math.PI / 4.0f, 800.0f / 600.0f, 1.0f, 1000.0f);
Matrix[] transform=new Matrix[car.Bones.Count];
car.CopyAbsoluteBoneTransformsTo(transform);
foreach (ModelMesh mesh in car.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
// 設定內定的打光方法,所以螢幕才不會一片漆黑
effect.EnableDefaultLighting();
// 數學座標轉換運算
effect.World = transform[mesh.ParentBone.Index] * world;
effect.View = view;
effect.Projection = projection;
// 實際把賽車模型畫到正確的地方
mesh.Draw();
}
}