自打零3D基础入门XNA 4.0(2)——模型与BasicEffect从零3D基础入门XNA 4.0(2)——模型和BasicEffect

以及使用Model类的Draw方法将模型绘制到屏幕上,以及使用Model类的Draw方法将模型绘制到屏幕上

【题外话】

【题外话】

齐同一篇稿子介绍了3D开发基础和XNA开发顺序的共同体布局,以及采用Model类的Draw方法将模型绘制到屏幕上。本文就上亦然首文章继续,介绍XNA中范的构造、BasicEffect的采取与用户输入和界面显示的道等,本文尽量将遇到的定义都分析清楚,但以避开复杂的数学方面的学识,希望对从未点了3D开发之同校有助。

齐一致首文章介绍了3D开发基础及XNA开发顺序的总体结构,以及下Model类的Draw方法将模型绘制到屏幕及。本文就上同首文章继续,介绍XNA中范的构造、BasicEffect的利用及用户输入和界面显示的措施等,本文尽量将遇到的定义都分析清楚,但与此同时避开复杂的数学方面的文化,希望对莫接触了3D开发之同窗有帮助。

 

 

【系列索引】

【系列索引】

  1. 从零3D基础入门XNA
    4.0(1)——3D开发基础
  2. 由零3D基础入门XNA
    4.0(2)——模型与BasicEffect
  1. 打零3D基础入门XNA
    4.0(1)——3D开发基础
  2. 于零3D基础入门XNA
    4.0(2)——模型和BasicEffect

 

 

【文章索引】

【文章索引】

  1. Model模型的组织
  2. BasicEffect效果的设置
  3. XNA的用户输入
  4. XNA界面的显示方式
  1. Model模型的构造
  2. BasicEffect效果的安装
  3. XNA的用户输入
  4. XNA界面的显示方式

 

 

【一、Model模型的构造】

【一、Model模型的组织】

达到等同篇稿子以Model自带的Draw方法实现了第一手将载入的Model绘制到指定的职位上,但是有时绘制出来的效力并无相符我们的预料,比如下图(下图的范是透过Maya创建的一个房):

达成亦然篇稿子使Model自带的Draw方法实现了第一手以载入的Model绘制到指定的职位上,但是有时绘制出来的功用并无抱我们的料,比如下图(下图的模子是透过Maya创建的一个房):

澳门蒲京网址 1

澳门蒲京网址 2

通过ILSpy查看Microsoft.Xna.Framework.Graphics.Model,可以看到那Draw方法的代码如下:

透过ILSpy查看Microsoft.Xna.Framework.Graphics.Model,可以见见该Draw方法的代码如下:

澳门蒲京网址 3澳门蒲京网址 4

澳门蒲京网址 5澳门蒲京网址 6

 1 public void Draw(Matrix world, Matrix view, Matrix projection)
 2 {
 3     int count = this.meshes.Count;
 4     int count2 = this.bones.Count;
 5     Matrix[] array = Model.sharedDrawBoneMatrices;
 6     if (array == null || array.Length < count2)
 7     {
 8         array = new Matrix[count2];
 9         Model.sharedDrawBoneMatrices = array;
10     }
11     this.CopyAbsoluteBoneTransformsTo(array);
12     for (int i = 0; i < count; i++)
13     {
14         ModelMesh modelMesh = this.meshes[i];
15         int index = modelMesh.ParentBone.Index;
16         int count3 = modelMesh.Effects.Count;
17         for (int j = 0; j < count3; j++)
18         {
19             Effect effect = modelMesh.Effects[j];
20             if (effect == null)
21             {
22                 throw new InvalidOperationException(FrameworkResources.ModelHasNoEffect);
23             }
24             IEffectMatrices effectMatrices = effect as IEffectMatrices;
25             if (effectMatrices == null)
26             {
27                 throw new InvalidOperationException(FrameworkResources.ModelHasNoIEffectMatrices);
28             }
29             effectMatrices.World = array[index] * world;
30             effectMatrices.View = view;
31             effectMatrices.Projection = projection;
32         }
33         modelMesh.Draw();
34     }
35 }
 1 public void Draw(Matrix world, Matrix view, Matrix projection)
 2 {
 3     int count = this.meshes.Count;
 4     int count2 = this.bones.Count;
 5     Matrix[] array = Model.sharedDrawBoneMatrices;
 6     if (array == null || array.Length < count2)
 7     {
 8         array = new Matrix[count2];
 9         Model.sharedDrawBoneMatrices = array;
10     }
11     this.CopyAbsoluteBoneTransformsTo(array);
12     for (int i = 0; i < count; i++)
13     {
14         ModelMesh modelMesh = this.meshes[i];
15         int index = modelMesh.ParentBone.Index;
16         int count3 = modelMesh.Effects.Count;
17         for (int j = 0; j < count3; j++)
18         {
19             Effect effect = modelMesh.Effects[j];
20             if (effect == null)
21             {
22                 throw new InvalidOperationException(FrameworkResources.ModelHasNoEffect);
23             }
24             IEffectMatrices effectMatrices = effect as IEffectMatrices;
25             if (effectMatrices == null)
26             {
27                 throw new InvalidOperationException(FrameworkResources.ModelHasNoIEffectMatrices);
28             }
29             effectMatrices.World = array[index] * world;
30             effectMatrices.View = view;
31             effectMatrices.Projection = projection;
32         }
33         modelMesh.Draw();
34     }
35 }

View Code

View Code

里头可见,Draw方法通过遍历模型的Mesh,然后重新遍历每个Mesh的Effect,并对每个Effect进行安装,最后以Mesh的Draw方法将该绘制到屏幕上。

个中可见,Draw方法通过遍历模型的Mesh,然后重新遍历每个Mesh的Effect,并针对性每个Effect进行安装,最后以Mesh的Draw方法将那绘制到屏幕及。

为打探Model的渲染,我们率先要了解Model的构造。实际上,在一个Model对象吃,包含Bone集合(model.Bones)、Mesh集合(model.Meshes)以及根Bone(model.Root)三单特性,其布局与涉如下:

为打探Model的渲染,我们率先需了解Model的布局。实际上,在一个Model对象被,包含Bone集合(model.Bones)、Mesh集合(model.Meshes)以及根Bone(model.Root)三个属性,其结构与关联如下:

澳门蒲京网址 7

澳门蒲京网址 8

可以看出对于每个ModelMesh,包含一组ModelMeshPart与一个ParentBone。其中,

可以看于每个ModelMesh,包含一组ModelMeshPart与一个ParentBone。其中,

  • ModelMesh表示单个可以独自运动的大体对象。例如,一个car的Model可以蕴涵一个车体(body)的ModelMesh、四只车轱辘(wheel)的ModelMesh与一对门(door)的ModelMesh。
  • ModelMeshPart表示单个无异于材料的部件,其表示一个独自的绘图调用(draw
    call)。例如,上述车身可以涵盖在质的外部、使用环境映射(environment
    mapping)效果的挡风玻璃以及以法线贴图(normalmap
    texture)效果的座椅等等。
  • ModelBone表示了对应之ModelMesh如何变换,其富含一个Transform的易矩阵。ModelBone是以树形存储的,每个ModelBone都发一个父节点以及多单子节点。上述的每个ModelMesh都发出一个ParentBone,ModelMesh可以依据ModelBone的变来规定最后显示的位置等。例如,上述车门的ModelBone与车轮的ModelBone是车身的子节点等等。
  • ModelMesh表示单个可以单独运动的物理对象。例如,一个car的Model可以涵盖一个车体(body)的ModelMesh、四独轮子(wheel)的ModelMesh与一对门(door)的ModelMesh。
  • ModelMeshPart表示单个平材料的预制构件,其代表一个独门的绘图调用(draw
    call)。例如,上述车身可以分包着品质之外部、使用环境映射(environment
    mapping)效果的挡风玻璃以及用法线贴图(normalmap
    texture)效果的座椅等等。
  • ModelBone表示了对应之ModelMesh如何变换,其蕴含一个Transform的转换矩阵。ModelBone是因树形存储的,每个ModelBone都起一个父节点以及几独子节点。上述的每个ModelMesh都有一个ParentBone,ModelMesh可以根据ModelBone的转移来规定最终显示的职务等。例如,上述车门的ModelBone与车轮的ModelBone是车身的子节点等等。

故而遍历一个Model中有所的ModelMesh,然后遍历其中有的ModelMeshPart,并且根据ModelMesh的ParentBone来以各一个ModelMeshPart绘制到指定的职及就得绘制有总体的Model。

为此遍历一个Model中有的ModelMesh,然后遍历其中拥有的ModelMeshPart,并且根据ModelMesh的ParentBone来拿诸一个ModelMeshPart绘制到指定的岗位及便可绘制有一体化的Model。

唯独对于每个ModelMeshPart,其实际渲染的职能还设有Effect的性被,对于默认来说,Effect都为BasicEffect。此外,对于ModelBone,其易矩阵都是对立其本身的Parent来的,不过Model类也供了一个方,即CopyAbsoluteBoneTransformsTo(),即可将每个Bone相对于RootBone的转移矩阵复制到一个矩阵数组中,然后拿其下到Effect中即可。这种方式同上述提到的Model.Draw类似,不过好写的语虽足以打定义每个ModelMeshPart渲染之法力,当然为堪设置每个ModelMeshPart的渲染位置。

可对每个ModelMeshPart,其实际渲染之功效都设有Effect的性被,对于默认来说,Effect都为BasicEffect。此外,对于ModelBone,其转移矩阵都是相对其本身的Parent来之,不过Model类也供了一个艺术,即CopyAbsoluteBoneTransformsTo(),即可将每个Bone相对于RootBone的易矩阵复制到一个矩阵数组中,然后以那个以至Effect中即可。这种措施同上述涉的Model.Draw类似,不过好写的说话就是可打定义每个ModelMeshPart渲染的效用,当然为堪设置每个ModelMeshPart的渲染位置。

那接下就按照此思路去落实,同时在安装各一个Effect时,使用Effect提供的用默认光照的方法EnableDefaultLighting(),启用后效果如下:

那接下去便比如此思路去落实,同时在装置各一个Effect时,使用Effect提供的使用默认光照的方法EnableDefaultLighting(),启用后效果如下:

澳门蒲京网址 9

澳门蒲京网址 10

然的法力就达成了我们的预想,按上述的艺术实现之代码如下:

这般的作用就直达了俺们的预料,按上述的方法实现之代码如下:

澳门蒲京网址 11澳门蒲京网址 12

澳门蒲京网址 13澳门蒲京网址 14

 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up);
 2 
 3 Matrix[] transforms = new Matrix[model.Bones.Count];
 4 this.model.CopyAbsoluteBoneTransformsTo(transforms);
 5 
 6 foreach (ModelMesh mesh in model.Meshes)
 7 {
 8     Int32 boneIndex = mesh.ParentBone.Index;
 9 
10     foreach (ModelMeshPart part in mesh.MeshParts)
11     {
12         BasicEffect effect = part.Effect as BasicEffect;
13         
14         effect.EnableDefaultLighting();
15         effect.World = transforms[boneIndex] * world;
16         effect.View = cameraView;
17         effect.Projection = cameraProjection;
18     }
19 
20     mesh.Draw();
21 }
 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up);
 2 
 3 Matrix[] transforms = new Matrix[model.Bones.Count];
 4 this.model.CopyAbsoluteBoneTransformsTo(transforms);
 5 
 6 foreach (ModelMesh mesh in model.Meshes)
 7 {
 8     Int32 boneIndex = mesh.ParentBone.Index;
 9 
10     foreach (ModelMeshPart part in mesh.MeshParts)
11     {
12         BasicEffect effect = part.Effect as BasicEffect;
13         
14         effect.EnableDefaultLighting();
15         effect.World = transforms[boneIndex] * world;
16         effect.View = cameraView;
17         effect.Projection = cameraProjection;
18     }
19 
20     mesh.Draw();
21 }

View Code

View Code

但就和刚刚张的Model.Draw的代码并不相同。实际上,XNA为了简化操作,已经拿ModelMeshPart的每个Effect放到了ModelMesh的Effects集合中,只待遍历这个集就好,而随便需还遍历ModelMeshPart,再得到Effect了。所以上述代码可以简化为如下的代码:

而就与方相的Model.Draw的代码并不相同。实际上,XNA为了简化操作,已经以ModelMeshPart的每个Effect放到了ModelMesh的Effects集合中,只待遍历这个集就好,而不论是需再遍历ModelMeshPart,再赢得Effect了。所以上述代码可以简化为如下的代码:

 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up);
 2 
 3 Matrix[] transforms = new Matrix[model.Bones.Count];
 4 this.model.CopyAbsoluteBoneTransformsTo(transforms);
 5 
 6 foreach (ModelMesh mesh in model.Meshes)
 7 {
 8     Int32 boneIndex = mesh.ParentBone.Index;
 9     
10     foreach (BasicEffect effect in mesh.Effects)
11     {
12         effect.EnableDefaultLighting();
13         effect.World = transforms[boneIndex] * world;
14         effect.View = cameraView;
15         effect.Projection = cameraProjection;
16     }
17 
18     mesh.Draw();
19 }
 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up);
 2 
 3 Matrix[] transforms = new Matrix[model.Bones.Count];
 4 this.model.CopyAbsoluteBoneTransformsTo(transforms);
 5 
 6 foreach (ModelMesh mesh in model.Meshes)
 7 {
 8     Int32 boneIndex = mesh.ParentBone.Index;
 9     
10     foreach (BasicEffect effect in mesh.Effects)
11     {
12         effect.EnableDefaultLighting();
13         effect.World = transforms[boneIndex] * world;
14         effect.View = cameraView;
15         effect.Projection = cameraProjection;
16     }
17 
18     mesh.Draw();
19 }

 

 

【二、BasicEffect效果的设置】

【二、BasicEffect效果的安】

首先用ILSpy查看下BasicEffect的EnableDefaultLighting()的代码:

首先用ILSpy查看下BasicEffect的EnableDefaultLighting()的代码:

public void EnableDefaultLighting()
{
    this.LightingEnabled = true;
    this.AmbientLightColor = EffectHelpers.EnableDefaultLighting(this.light0, this.light1, this.light2);
}
public void EnableDefaultLighting()
{
    this.LightingEnabled = true;
    this.AmbientLightColor = EffectHelpers.EnableDefaultLighting(this.light0, this.light1, this.light2);
}

里面this.light0-2为BasicEffect的DirectionalLight0-2,即BasicEffect可以下的老三独光源。而EffectHelpers的EnableDefaultLighting是这般写的:

中this.light0-2为BasicEffect的DirectionalLight0-2,即BasicEffect可以下的老三独光源。而EffectHelpers的EnableDefaultLighting是这般描绘的:

澳门蒲京网址 15澳门蒲京网址 16

澳门蒲京网址 17澳门蒲京网址 18

 1 internal static Vector3 EnableDefaultLighting(DirectionalLight light0, DirectionalLight light1, DirectionalLight light2)
 2 {
 3     light0.Direction = new Vector3(-0.5265408f, -0.5735765f, -0.6275069f);
 4     light0.DiffuseColor = new Vector3(1f, 0.9607844f, 0.8078432f);
 5     light0.SpecularColor = new Vector3(1f, 0.9607844f, 0.8078432f);
 6     light0.Enabled = true;
 7     light1.Direction = new Vector3(0.7198464f, 0.3420201f, 0.6040227f);
 8     light1.DiffuseColor = new Vector3(0.9647059f, 0.7607844f, 0.4078432f);
 9     light1.SpecularColor = Vector3.Zero;
10     light1.Enabled = true;
11     light2.Direction = new Vector3(0.4545195f, -0.7660444f, 0.4545195f);
12     light2.DiffuseColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);
13     light2.SpecularColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);
14     light2.Enabled = true;
15     return new Vector3(0.05333332f, 0.09882354f, 0.1819608f);
16 }
 1 internal static Vector3 EnableDefaultLighting(DirectionalLight light0, DirectionalLight light1, DirectionalLight light2)
 2 {
 3     light0.Direction = new Vector3(-0.5265408f, -0.5735765f, -0.6275069f);
 4     light0.DiffuseColor = new Vector3(1f, 0.9607844f, 0.8078432f);
 5     light0.SpecularColor = new Vector3(1f, 0.9607844f, 0.8078432f);
 6     light0.Enabled = true;
 7     light1.Direction = new Vector3(0.7198464f, 0.3420201f, 0.6040227f);
 8     light1.DiffuseColor = new Vector3(0.9647059f, 0.7607844f, 0.4078432f);
 9     light1.SpecularColor = Vector3.Zero;
10     light1.Enabled = true;
11     light2.Direction = new Vector3(0.4545195f, -0.7660444f, 0.4545195f);
12     light2.DiffuseColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);
13     light2.SpecularColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);
14     light2.Enabled = true;
15     return new Vector3(0.05333332f, 0.09882354f, 0.1819608f);
16 }

View Code

View Code

足见到在启用默认光照里实际是于条件光AmbientLightColor以及三束定向光(包括光线的大势、漫反射颜色与镜面反射颜色)设置了事先定义好的水彩,并启用了这些光源,这三羁绊定向光的颜色(Light1的漫反射光的水彩如下,但那镜面反射光的颜料吗黑色)和方向大约如下。

可以看到在启用默认光照里实际是深受条件光AmbientLightColor以及三束定向光(包括光线的动向、漫反射颜色和镜面反射颜色)设置了优先定义好的水彩,并启用了这些光源,这三束缚定向光的颜色(Light1的漫反射光的颜色如下,但其镜面反射光的水彩也黑色)和可行性大约如下。

澳门蒲京网址 19

澳门蒲京网址 20

下图第一只为启用了默认光照后底范(上一样篇稿子被的dude),第二、三、四只呢就启用默认光照的环境光及0、1、2叔绳定向光后的范,第五个也没启用默认光照的模型(如同上同篇产生的效用等同):

产图第一只呢启用了默认光照后的型(上平等首稿子中之dude),第二、三、四单吗单启用默认光照的环境光及0、1、2老三约定向光后的型,第五独为无启用默认光照的范(如同上一致首产生的成效一样):

澳门蒲京网址 21

澳门蒲京网址 22

当,在广大状态下(比如户外的阳光等),我们只是需要一个光源,届时我们设禁用(DirectionalLight*.Enabled
= false)其他两个定向光即可,当然我们兴许还得修改光源的颜料等等。

自,在很多状下(比如户外的日光等),我们特需要一个光源,届时我们只要禁用(DirectionalLight*.Enabled
= false)其他两个定向光即可,当然我们或许还得修改光源的水彩等等。

而外利用EnableDefaultLighting,BasicEffect还提供了比较丰富的参数可以装。首先来拘禁下上述例子中Effect默认的习性:

除开用EnableDefaultLighting,BasicEffect还提供了比较丰富的参数可以安装。首先来拘禁下上述例子中Effect默认的性:

澳门蒲京网址 23

澳门蒲京网址 24

中间和光线有关的:

里头与光线有关的:

  • LightingEnabled:是否开启光照(默认也false)。
  • PreferPerPixelLighting:是否开启逐像素的光照(默认为false,为逐顶点光照),逐像素光照相对于逐点光照效果还好,但速度也再缓慢,同时还亟需显卡支持Pixel
    Shader Model 2.0,如果显卡不支持的语会自行使用逐顶点光照代替。
  • AmbientLightColor:环境光颜色(默认为Vector3.Zero)。为了以局部光照模型(模型中的光照互不影响)中增进真实感,引入了环境光的概念。环境单纯不依靠任何光源,但那个影响所有物体。
  • DiffuseColor:漫反射颜色(默认也Vector3.One)。光线照到物体后,物体进行漫反射,其颜色与光线的势头有关。
  • SpecularColor:镜面反射颜色。光线照交物体后,物体进行全反射,其颜色不仅同光线的主旋律有关,还跟考察(相机)的矛头有关。
  • EmissiveColor:放射颜色(默认为Vector3.Zero)。放射光是依物体发出之光芒,但在一些光照模型中,实际上不见面指向任何物体产生震慑。
  • DirectionalLight0、DirectionalLight1、DirectionalLight2:三束定向光(每束都不外乎光线的势头、漫反射颜色和镜面反射颜色)。
  • LightingEnabled:是否打开光照(默认为false)。
  • PreferPerPixelLighting:是否被逐像素的普照(默认也false,为逐顶点光照),逐像素光照相对于逐点光照效果又好,但速度吗再慢,同时还得显卡支持Pixel
    Shader Model 2.0,如果显卡不支持之话语会自动使用逐顶点光照代替。
  • AmbientLightColor:环境光颜色(默认为Vector3.Zero)。为了在有些光照模型(模型中的普照互不影响)中增强真实感,引入了环境光的定义。环境就不负任何光源,但彼震慑所有物体。
  • DiffuseColor:漫反射颜色(默认也Vector3.One)。光线照及物体后,物体进行漫反射,其颜色与光线的可行性有关。
  • SpecularColor:镜面反射颜色。光线照交物体后,物体进行全反射,其颜色不仅同光线的倾向有关,还跟考察(相机)的动向有关。
  • EmissiveColor:放射颜色(默认为Vector3.Zero)。放射光是依赖物体发出之光线,但当局部光照模型中,实际上不会见指向任何物体产生影响。
  • DirectionalLight0、DirectionalLight1、DirectionalLight2:三束定向光(每束都囊括光线的可行性、漫反射颜色与镜面反射颜色)。

里头需要专注的是,在XNA中,颜色的储存并无是使的Color(ARGB或ABGR),而是采用的Vector3(或Vector4)。对于Vector3,其x、y、z三单重存储的独家是R、G、B分别除以255的浮点值(Vector4的w分量存储的凡Alpha通道除以255之浮点值),所以Vector3.Zero即为黑色,而Vector3.One为白色。当然XNA也提供了一个Color类,并且Color也供了提供了直白换为Vector3(或Vector4)的方法ToVector3()(或ToVector4())。

中间需要留意的凡,在XNA中,颜色的囤并无是应用的Color(ARGB或ABGR),而是以的Vector3(或Vector4)。对于Vector3,其x、y、z三独重存储的个别是R、G、B分别除以255的浮点值(Vector4的w分量存储的凡Alpha通道除以255底浮点值),所以Vector3.Zero即为黑色,而Vector3.One为白色。当然XNA也提供了一个Color类,并且Color也供了提供了直换为Vector3(或Vector4)的点子ToVector3()(或ToVector4())。

除却,BasicEffect还支持设置雾的法力:

除去,BasicEffect还支持设置雾的效用:

  • FogEnabled:是否打开雾的功用(默认为false)。
  • FogColor:雾的水彩(默认为Vector3.Zero)。
  • FogStart:雾距离相机的启(最近)值(默认为0.0F),这个离内的物不让雾的熏陶。
  • FogEnd:雾距离相机的了(最远)值(默认为1.0F),这个距离之外的东西了看无到底。
  • FogEnabled:是否被雾的意义(默认也false)。
  • FogColor:雾的颜料(默认为Vector3.Zero)。
  • FogStart:雾距离相机的始(最近)值(默认为0.0F),这个距离内的物不深受雾的震慑。
  • FogEnd:雾距离相机的收(最远)值(默认为1.0F),这个距离之外的事物了看无清。

也就是说,雾以见面在离开相机(FogStart –
FogEnd)的地方发,这个离要依据物体所于的职位决定。设Distance为体距离相机的相距,则Distance<FogStart<FogEnd时,物体不给雾的熏陶,与从不雾时一样;当FogStart<FogEnd<Distance时,物体完全看无根本(即物体全部为雾的颜色);当FogStart<Distance<FogEnd时,物体受雾的影响,物体离FogEnd越接近则更看无到底。

也就是说,雾以会晤在相距相机(FogStart –
FogEnd)的地方时有发生,这个离要依据物体所于的位置决定。设Distance为体距离相机的离,则Distance<FogStart<FogEnd时,物体不吃雾的震慑,与从不雾时一样;当FogStart<FogEnd<Distance时,物体完全看无清(即物体全部也雾的水彩);当FogStart<Distance<FogEnd时,物体受雾的影响,物体离FogEnd越近则越来越看不到头。

像当人的模子在(0, 0, 0),相机在(120, 120,
120)处,雾的颜色为Gray。下图第一单呢无加雾的效应,第二只为FogStart –
FogEnd为200 – 300,第三独也1 – 300,第四个也1 – 100。

比如说当人的型在(0, 0, 0),相机在(120, 120,
120)处,雾的颜料为Gray。下图第一只呢无加雾的职能,第二独为FogStart –
FogEnd为200 – 300,第三个也1 – 300,第四单吗1 – 100。

澳门蒲京网址 25

澳门蒲京网址 26

 

 

【三、XNA的用户输入】

【三、XNA的用户输入】

每当默认生成XNA程序中之Update方法里,有一个取得GamePad的状态,当用户1的GamePad按下了“Back”键后拿会退出程序。微软针对用户输入的支撑都在Microsoft.Xna.Framework.Input中,除了GamePad之外,微软还支持获取Keyboard、Mouse这片种植的状态。此外在Microsoft.Xna.Framework.Input.Touch中,还有TouchPanel可以得触摸的状态。与GamePad相同,其他的这些状态吧都是由此微软供给类中的GetState()方法开展得。

在默认生成XNA程序中的Update方法里,有一个得到GamePad的状态,当用户1的GamePad按下了“Back”键后拿会脱离程序。微软对用户输入的支持都在Microsoft.Xna.Framework.Input中,除了GamePad之外,微软还支持获取Keyboard、Mouse这有限种的状态。此外在Microsoft.Xna.Framework.Input.Touch中,还有TouchPanel可以抱触摸的状态。与GamePad相同,其他的这些状态吧都是经过微软资给类中的GetState()方法开展得。

例如要抱键盘与鼠标的状态,我们可由此如下方式:

诸如要拿走键盘与鼠标的状态,我们得经如下方式:

KeyboardState kbState = Keyboard.GetState();
MouseState mouseState = Mouse.GetState();
KeyboardState kbState = Keyboard.GetState();
MouseState mouseState = Mouse.GetState();

对判断键盘的按键,可以由此如下的法门取是否按下了点名按键:

对判断键盘的按键,可以透过如下的法获得是否遵循下了指定按键:

Boolean pressed = kbState.IsKeyDown(Keys.Enter);
Boolean pressed = kbState.IsKeyDown(Keys.Enter);

假使对于鼠标的按键,则需看清按键的ButtonState才可,例如判断鼠标左键是否按照下:

比方对于鼠标的按键,则需要看清按键的ButtonState才得以,例如判断鼠标左键是否以下:

Boolean pressed = (mouseState.LeftButton == ButtonState.Pressed);
Boolean pressed = (mouseState.LeftButton == ButtonState.Pressed);

除,如果只要判断鼠标是否在程序区域外,可以由此如下的主意判断

而外,如果要一口咬定鼠标是否在程序区域外,可以经如下的方判断

if (this.GraphicsDevice.Viewport.Bounds.Contains(mouseState.X, mouseState.Y))
{
    //TODO
}
if (this.GraphicsDevice.Viewport.Bounds.Contains(mouseState.X, mouseState.Y))
{
    //TODO
}

虽在多数场面下,如果为用户操作鼠标的话语会当次外显示一个自定义的指针。但有时候写个小程序,为了简单希望直接用系统的指针,我们得以于先后的自由位置(构造方法、Initialize甚至Update也可)写如下的代码,就可显示鼠标指针了,反的则足以藏:

虽在大部分动静下,如果为用户操作鼠标的言辞会当次外展示一个自定义的指针。但有时候写单稍程序,为了简单希望一直利用系统的指针,我们可当先后的轻易位置(构造方法、Initialize甚至Update也可)写如下的代码,就足以显示鼠标指针了,反的则足以隐藏:

this.IsMouseVisible = true;
this.IsMouseVisible = true;

 

 

【四、XNA界面的显示方式】

【四、XNA界面的显示方式】

默认情况下,运行XNA的次会自动为800*480底分辨率显示,若一旦修改显示的分辨率,其实非常简单,仅需以Game的构造方法中添加如下代码即可:

默认情况下,运行XNA的顺序会活动为800*480底分辨率显示,若要修改显示的分辨率,其实非常简单,仅得以Game的构造方法中添加如下代码即可:

graphics.PreferredBackBufferWidth = 1024;
graphics.PreferredBackBufferHeight = 768;
graphics.PreferredBackBufferWidth = 1024;
graphics.PreferredBackBufferHeight = 768;

如此XNA的顺序即使会按我们设定的分辨率显示了。除此之外,如果我们愿意XNA的先后能够全屏显示,我们尚得长如下的代码:

这么XNA的次第就算能够按照我们设定的分辨率显示了。除此之外,如果我们盼望XNA的次能够全屏显示,我们还好添加如下的代码:

graphics.IsFullScreen = true;
graphics.IsFullScreen = true;

自然我们还足以叫用户来切换全屏与窗口化,但是这行代码写在Update()中凡是不起作用的,不过XNA提供另外一个办法,就是graphics.ToggleFullScreen()。例如我们用依照F键进行全屏与窗口化的切换,可以编制如下的代码:

当我们尚可以为用户来切换全屏与窗口化,但是这行代码写以Update()中凡是不起作用的,不过XNA提供另外一个艺术,就是graphics.ToggleFullScreen()。例如我们得按F键进行全屏与窗口化的切换,可以编写如下的代码:

KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.F))
{
    graphics.ToggleFullScreen();
}
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.F))
{
    graphics.ToggleFullScreen();
}

 

 

【相关链接】

【相关链接】

  1. Model
    Class:http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.Model.aspx
  2. Models, meshes, parts, and
    bones:http://blogs.msdn.com/b/shawnhar/archive/2006/11/20/models-meshes-parts-and-bones.aspx
  3. What Is a Model
    Bone?:http://msdn.microsoft.com/en-us/library/dd904249.aspx
  4. BasicEffect
    Lighting:http://rbwhitaker.wikidot.com/basic-effect-lighting
  5. BasicEffect Fog:http://rbwhitaker.wikidot.com/basic-effect-fog
  6. 联机学WP7 XNA游戏开发(七.
    3d基本光源):http://www.cnblogs.com/randylee/archive/2011/03/09/1978312.html
  7. 【D3D11玩耍编程】学习笔记十二:光照模型:http://blog.csdn.net/bonchoix/article/details/8430561
  1. Model
    Class:http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.Model.aspx
  2. Models, meshes, parts, and
    bones:http://blogs.msdn.com/b/shawnhar/archive/2006/11/20/models-meshes-parts-and-bones.aspx
  3. What Is a Model
    Bone?:http://msdn.microsoft.com/en-us/library/dd904249.aspx
  4. BasicEffect
    Lighting:http://rbwhitaker.wikidot.com/basic-effect-lighting
  5. BasicEffect Fog:http://rbwhitaker.wikidot.com/basic-effect-fog
  6. 一道学WP7 XNA游戏开发(七.
    3d基本光源):http://www.cnblogs.com/randylee/archive/2011/03/09/1978312.html
  7. 【D3D11玩编程】学习笔记十二:光照模型:http://blog.csdn.net/bonchoix/article/details/8430561