在前面的章节里你得到了工作的一个好的三角形和矩形,用到了迷人的颜色和酷的纹理。你准备出去并创作下一个伟大的游戏,当你23时赚到数百万的美元并退休,是吗?错了。不幸的是,我已得到了坏的消息:目前并没有一个3D三角形和矩形游戏的市场。你的“三角形战争”怎么和最新的射击游戏和角色扮演游戏竞争呢?唔...它不能。因此,为什么这些游戏有如此酷的图形画面而你的只是简单的三角形呢?但按在于三维模型。
使用3D模型
通常,当画一个复杂的物体时你使用3D模型。3D模型是一组构成基本图元的点的集合。流行的建模工具有3D Studio Max,Maya,Blender,Lightwave,和Modo。Blender是一款做得很好的免费的工具。另一款免费的工具是XSI Mod Tool,它有一个XNA插件。
XNA支持3D模型格式是.X和.FBX
添加模型到工程中
用BasicModel类绘制模型
XNA 中Model类用ModelMesh对象表示网格,Model类在它的Meshes属性里包含一列的ModelMesh对象。
一个网格能包含材质或颜色、纹理等等用于在那个网格里绘制。一个网格的各种不同部分不必以相同方式着色或贴纹理——你能在单个网格上有多种材质。为了储存这个数据,网格由多个部分组成。ModelMesh类在MeshParts属性中储存了一列ModelMeshParts,每一个MeshParts包含绘制MeshPart的材质还有效果对象。
默认使,在模型的MeshPart中用的效果类是BasicEffect类型。BasicEffect派生玉Effect类,提供一种不必创建HLSL效果文件的方式来绘制3D物体。本书后面你将写你自己的效果文件。但此刻,那太高级了,因此我们局限于BasicEffect。
最后,每个ModelMesh有一个变换,这会使网格移动到模型中的适当位置。
后面Quiz代码
1.{ 4,8,15,16,23}后的数字是42
2.飞机转向的关键代码是
Matrix eachTranslation = Matrix.Identity;
Matrix totalTranslation = Matrix.Identity;
Matrix rotation = Matrix.CreateRotationY(MathHelper.Pi/2);//我把模型旋转了90度,便于查看^_^
Vector3 speed=new Vector3(0,0,-1);
public override void Update()
{
eachTranslation = Matrix.CreateTranslation(speed);
totalTranslation *= eachTranslation;
if (totalTranslation.M43 < -400 || totalTranslation.M43>0)
{
//rotation = Matrix.CreateFromYawPitchRoll(MathHelper.Pi,0,0);
rotation *= Matrix.CreateRotationY(MathHelper.Pi);
speed.Z *= -1;
}
// rotation *= Matrix.CreateRotationY(MathHelper.PiOver4 / 180);
}