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

by admin on 2018年10月5日

【题外话】

【题外话】

直达同样篇文章介绍了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

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图