赞助广告

 

年份

最新评论

评论 RSS

处理顶点——使用双线性插值计算地形的精确高度

clock 一月 28, 2011 11:04 by author alex
问题 当你制作一个使用地形的游戏时,你需要知道地形确定点的精确高度。例如,在地形上移动一个模型时(见教程4-17),当检测到光标和地形之间的碰撞时(下一个教程),或防止相机与地形碰撞时(见教程2-6)。 因为在前一个教程中你定义了地形每个顶点的3D位置,所以获取这些点的高度很简单。对位于这些顶点间的位置而言,你需要使用一种插值方法获取这个位置的精确高度。 解决方案 如果你想知道高度的点与地形的一个顶点发生碰撞,那么你已经知道了地形上该点的精确高度。如果这个点并没有与顶点发生碰撞,那么说明这个点在地形的一个三角形上。因为三角形是一个平面,所以你可以通过在三角形三个顶点间进行插值获取任何点... [更多...]

处理顶点——基于一个顶点缓冲和一个索引缓冲创建一个地形

clock 一月 28, 2011 11:01 by author alex
问题 基于一张2D高度图,你想创建一个地形并以一个有效率的方法绘制它。 解决方案 首先需要一张高度图,包含所有用来定义地形的高度数据。这张高度图有确定数量的二维数据点,我们称之为地形的宽和高。 显然,如果你想基于这些数据创建一个地形,这个地形将从这些width*height顶点中绘制,如图5-14右上角所示(注意数字是从0开始的)。 图5-14 地形网格 要使用三角形完全覆盖网格,你需要在每个网格的四个点中绘制两个三角形,如图5-14所示。一行需要(width-1)*2个三角形,整个地形需要(height-1)*(width-1)*2个三角形。 如果你想判断是否需要使用索... [更多...]

处理顶点——自动计算顶点缓冲中所有顶点的法线

clock 一月 28, 2011 10:57 by author alex
问题 当绘制自定义的结构时,你会发现光照不正确。 这是因为你没有指定正确的法线向量,显卡要求每个顶点都有法线信息,这样它才可以决定每个三角形获得多少光照,详细信息可见第六章。 为每个顶点计算法线向量看起来很复杂,因为大多数顶点被多个三角形共享。 解决方案 如果每个顶点只被一个三角形使用,你只需找到三角形的法线向量(换句话说,这个向量垂直于三角形)并将这个向量作为三个顶点的法线向量。 但是在一个结构中,所有顶点被几个三角形共享。要获取平滑的效果,每个顶点需要存储周围三角形所有法线的平均值。 工作原理 使用下列伪代码,你可以找到每个顶点正确的法线: 对于结构中的每个顶点,... [更多...]

处理顶点——开启Backface Culling(背面剔除):它是什么和它能做什么

clock 一月 26, 2011 10:50 by author alex
问题 在前面的教程中,你经常可以在Draw方法中看到以下代码: device.RenderState.CullMode = CullMode.None; 如果你移除这行代码并将相机移动到三角形的后面,它们会消失!当你在没有理解backface culling时定义三角形顶点,会有50%可能三角形无法显示。 解决方案 你定义三角形顶点的方式告知XNA你想让哪一面朝向相机。 当绘制一个实心对象时,人们可以清楚地说出三角形的哪个面在物体的内部还是外部。要绘制必须的三角形,你可以要求XNA只绘制朝向相机的那个面,其他三角形在物体的内部被前面隐藏! 但是对计算机来说事... [更多...]

处理顶点——将经常更新的顶点数据存储在DynamicVertexBuffer

clock 一月 26, 2011 10:47 by author alex
问题 你需要频繁更新顶点数据,如果使用VertexBuffer的SetData方法会拖慢程序。 解决方案 如果你计划频繁更新顶点数据,应该使用DynamicVertexBuffer而不是VertexBuffer。 这会让数据不是存储在最快的显存中,而是更容易处理的某些内存中。所以,这样做会让性能有一点降低,但在VertexBuffer中频繁地改变数据会让性能得到极大地提高。 对于VertexBuffer,只要显卡被要求切换任务(例如,使用Alt+Tab切换程序),DynamicVertexBuffer中的内容必须被重载,你可以通过订阅到DynamicVertexBuffer的Con... [更多...]

处理顶点——使用顶点缓冲和索引缓冲将顶点和索引保存在显存中

clock 一月 25, 2011 09:19 by author alex
问题 每次当你调用device. DrawUserPrimitives方法时,顶点都会从系统内存传递到显卡中。通常,大部分数据没有变化,这意味着每帧重复传递了相同的数据。今天的显卡有容量很大而且很快的显存,所以你可以将顶点数据存储在显存中加速程序。从显存中将顶点数据传递到显卡速度要快得多,因为这些数据只在同一板卡的不同芯片间传输。同样索引数据也能获得加速。 解决方案 通过创建顶点数组的VertexBuffer,你可以将顶点数据复制到显存中。将顶点存储到显存后,就可以调用DrawPrimitives方法 (代替DrawUserPrimitives方法),这个方法从更快的显存中获取顶点。 ... [更多...]

处理顶点——使用索引移除冗余顶点

clock 一月 25, 2011 09:17 by author alex
问题 你要绘制的三角形共享了很多顶点,如图5-7所示。 图5-7 可以从使用索引中受益的结构 如图5-7所示的八个三角形在使用TriangleList的情况下需要8*3 = 24个顶点,从这个图中可以看到实际上只有9个独立的顶点,所以其余15个顶点会浪费显卡的内存,带宽和处理能力。 解决方案 好的办法是将这9个独立顶点存储在数组中并将这个数组传递到显卡。然后创建一个包含24个数字的集合,作为这9个顶点的引用。图5-8左边是包含24个顶点的大集合,右边是包含9个顶点和24个索引的小集合,注意每个索引都对应一个顶点。 图5-8 由24个顶点绘制的8个三角形(左)或24个指... [更多...]

处理顶点——在三角形上添加纹理

clock 一月 25, 2011 09:07 by author alex
问题 你想绘制一个颜色漂亮的三角形并可以完全控制三角形上的颜色。 解决方案 你的显卡允许你指定一张图像,从这张图像可以采样想要的颜色。 这意味着你需要将一张2D图像导入到XNA项目中,并在绘制三角形之前将它传递到显卡。对每个顶点,你要指定2D图像的哪个位置对应顶点。 工作原理 首先将一张2D图像导入到项目中,如教程3-1所示。在LoadContent方法中将它链接到一个变量: myTexture = content.Load<Texture2D>("texture"); 然后你要定义三角形的顶点。如前面的教程所述,你需要指定每个顶点的3D位... [更多...]

C#编码规范

clock 一月 23, 2011 09:58 by author alex
目标: 1. 安全:代码完成所需的功能之余,不要产生负作用,即要稳定可靠。 2. 易读: 类、实例、成员变量、成员函数的命名一目了然 3. 美观: 尽量统一项目组内人员的编程风格。 第一部分:命名 1. 命名原则 1) 所有的函数(变量/类/文件名)应该代表其实际的作用,应该使用有意义的单词或多个词组合,但不要使用人名、项目组名。 2) 所有的函数(变量/类名)一律使用英文。 3) 使用多个单词时不需要使用连线(如下划线), 但对于全部大写的宏需要使用连线。 4) 多个词组合较长时, 可以使用单词的缩写。 5) 不得使用非常相近的名字类表示几个不同含义的函数(变量/类)。 ... [更多...]

数据库如何规范命名

clock 一月 23, 2011 09:57 by author alex
一、数据库文件命名 数据文件命名采用系统名+_+文件类型,比如系统名为ComSys,则数据库文件命名为ComSys_database.mdf,有的数据库文件有多个,比如SQL Server就有2个,一个是数据库文件,另一个是日志文件,那么他们的文件命名分别为ComSys_database.mdf,ComSys_log.log。 二、数据库对象命名规范 数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。对象名字由前缀和实际名字组成,长度不超过30。 1、前缀: 使用小写字母。如: 表 tb 视图 vi 存储过程 sp 函数 fn 2、实际名字: 实际名字尽量... [更多...]

.NET中读取csv文件内容

clock 一月 22, 2011 14:44 by author alex
1.通过OdbcConnection可以创建一个链接到csv文件的链接 2. 链接字符串的格式: "Driver={Microsoft Text Driver (*.txt;*.csv)};Dbq="+cvs文件的文件夹路径+"          Extensions=asc,csv,tab,txt; Persist Security Info=False"; 创建以上连接后,可以直接使用DataAdapter等存取csv文件了。

处理顶点——绘制三角形,线和点

clock 一月 21, 2011 10:45 by author alex
问题 你想定义一个3D几何结构并绘制到屏幕上,这个结构可以是由三角形,线或点组成。 解决方案 当绘制3D几何对象时,你首先需要使用primitives(图元)定义它的形状。Primitives (图元)是可以被XNA绘制的最基本的对象,最常被使用的图元是三角形。任何形状,包括圆,如果圆的数量足够多的话,都能用来表示三角形。XNA Framework可以将点,线、三角形作为图元绘制。 XNA允许你定义这些图元的所有3D坐标。当你调用DrawUserPrimitives方法时,只要你提供正确的观察矩阵和投影矩阵,XNA会自动将这些3D坐标转换为对应的屏幕坐标。 工作原理 要将3D坐标转... [更多...]

处理模型——检测光标是否在模型上

clock 一月 21, 2011 10:39 by author alex
问题 你想检测光标是否在模型上。 解决方案 在XNA中,获取光标在屏幕上的2D位置是简单的。屏幕上的这个点对应3D空间中的一条射线Ray,如图4-28所示。   图4-28 2D光标对应3D空间的一条射线 因此,当你想检测光标在哪个模型上,需要检测射线与模型的碰撞,所以,这个教材会用到教程4-18的代码。 很有可能射线与多个模型相交,这个教程还会教你如何获取离屏幕最近的一个模型。 工作原理 你需要创建一个3D射线并将它与模型一起传递到教程4-18创建的ModelRayCollision 方法中。 只要知道了射线上的两个点就可以创建一条射线。你将使用的两个点如图... [更多...]

处理模型——使用逐三角形检查检测射线-模型碰撞

clock 一月 16, 2011 20:07 by author alex
问题 你想检测一根3D射线是否与模型发生碰撞,如果你想进行一个最高细节的碰撞检测这是必须的,可以作为教程4-11的拓展进行子弹是否与物体发生碰撞的高细节碰撞。如下一个教程所示,这可以用来检测鼠标是否在模型上。 而且,这个方法也可以用来进行模型之间的最高精度的检测,这是因为对应一条射线的每一个三角形的边缘可以用来进行与另一个模型的碰撞检测。 这个教程会处理最复杂的情况,允许模型的不同部分独立地被转换,使这个教程可以适用于模型动画,这些变换作用在模型顶点的最终位置上。例如,如果一个人移动手臂,手臂顶点的最终位置会发生移动。这个教程会考虑到这个变换。 解决方案 这个教程... [更多...]

处理模型——根据地形正确倾斜模型

clock 一月 16, 2011 19:48 by author alex
问题 当在地形上移动一个汽车模型时,使用教程4-2你可以调整车的高度,使用教程5-9你可以找到位于汽车下面的地形的高度。但是,如果你没有根据车下面的坡度正确使车身发生倾斜,那么在起伏不平的地形上效果看起来不会很好。 你想正确地放置和倾斜汽车模型使之可以匹配地形的起伏。 解决方案 这个问题可以分成四个部分: 首先,你想找到模型四个轮胎的最低顶点的位置。 其次,你想获取这四个顶点之下的地形的高度。 下一步,你想获取模型沿Forward和Side向量的旋转以正确地倾斜模型。 最后,你需要找到模型和地形之间的高度差并补偿这个差异。 要做到第一步,你可以编写... [更多...]

处理模型——通过定义一个自定义的TypeWriter和TypeReader将多个对象存储在Tag属性中

clock 一月 16, 2011 19:44 by author alex
问题 要让模型处理器可以将对象存储在模型中并传递到XNA项目,XNA提供了模型的Tag属性。从教程4-13,4-14和4-15中可以看到Tag属性对于存储一个相同类型的数组是很有用的,例如Vector3的数组或Triangle的数组。但很多情况中,你想传递多个对象,例如同时传递Vector3集合和模型的包围盒。 解决方案 定义一个自定义类,这个类存储所有你想传递的对象。在你的模型处理器中,创建这个类对象,将要传递到XNA项目中的对象存储在这个类对象中。最后在模型的Tag属性中存储这个类对象。 因为你定义了一个自定义类,所以你必须定义一个TypeWriter (见教程4-15)才能让XN... [更多...]

处理模型——通过定义一个自定义的TypeWriter和TypeReader直接处理顶点位置数据

clock 一月 16, 2011 19:37 by author alex
问题 你想访问模型中每个顶点的位置。但你想要一个三角形对象的数组,每个三角形对象包含三个Vector3向量,而不是想前面的教程中那样将所有Vector3放在一个大数组中。 或者,更普遍的情况,你想将一个自定义内容处理器类对象传递到XNA程序中,但内容管道无法知道应该如何串行化和反串行化这个类对象,所以你必须定义自己的TypeWriter和TypeReader。 解决方案 本教程的代码主要建立在前一个教程的基础上,但这次你将每三个顶点创建一个简单的三角形对象,然后将所有生成的三角形对象添加到一个集合中,并将这个集合存储在模型的Tag属性中。 最主要的区别是你将在自定义内容管道中定义一个... [更多...]

处理模型——通过扩展模型处理器直接处理每个ModelMesh的顶点位置数据

clock 一月 16, 2011 19:33 by author alex
问题 前面的教程中让你可以访问模型的所有顶点的相对于模型初始位置的位置。但是,如果你想对模型的一部分施加动画,例如,旋转一个人的手臂,那么你还想变换手臂,手,手指的位置。使用上一个教程的结果是不可能的,因为Vector3集合不包含Vector3属于模型哪个部分的信息,只包含相对于模型初始位置的信息。 解决方案 模型的独立变换部分是存储在ModelMeshe中的。ModelMesh有一个Tag属性,你可以在Tag中存储有用的信息。在本教程中,你将在Tag属性中存储ModelMesh的所有顶点的位置信息。 你将存储相对于ModelMesh初始位置的顶点位置信息(而不是像前一个教程中的相对于... [更多...]

处理模型——通过扩展模型处理器直接访问顶点位置数据

clock 一月 16, 2011 19:30 by author alex
问题 在XNA项目中,你想实时访问每个顶点的位置,如果你需要非常精确的碰撞检测或想找到模型上的特定点时,这一步非常有用。 虽然你可以使用常规代码访问模型的VertexBuffer,但因为顶点数据需要从显卡传递到系统内存,所以这种方法需要笨拙的代码并会拖慢程序。 解决方案 通过提取你想要的数据并把它们存储在模型的Tag属性中扩展默认模型处理器。本教程中,你将编写一个自定义模型处理器创建一个数组,这个数组包含模型中每个三角形的三个Vector3,并将这个数组存储在模型的Tag属性中。因为这个处理器只是默认模型处理器的扩展,所以你可以使用默认的模型导入器和TypeWriter,如图4-18所... [更多...]

处理模型——扩展模型内容导入器加载自定义Effects

clock 一月 16, 2011 19:26 by author alex
问题 你想使用一个自定义内容处理器改变模型的effect而不是实时处理。通过这种方式,模型可以正确地加载到XNA项目中,而无需在实时保存原始effect中的所有纹理和其他信息。 注意:如果你想学习如何扩展默认模型处理器,最好先看下一个教程。 解决方案 扩展默认模型处理器并重写ConvertMaterial方法,这个方法被模型中的每个MaterialContent调用,把这个方法重写将所有的MaterialContent信息传递到自定义材质处理器。 在这个自定义材质处理器中,你将创建一个空的材质对象,然后将自定义的effect链接到这个对象。你也可以将原始MaterialContent... [更多...]

友情链接赞助