01 2011 档案
处理顶点——使用双线性插值计算地形的精确高度
摘要:问题 当你制作一个使用地形的游戏时,你需要知道地形确定点的精确高度。例如,在地形上移动一个模型时(见教程4-17),当检测到光标和地形之间的碰撞时(下一个教程),或防止相机与地形碰撞时(见教程2-6)。 因为在前一个教程中你定义了地形每个顶点的3D位置,所以获取这些点的高度很简单。对位于这些顶点间的位置而言,你需要使用一种插值方法获取这个位置的精确高度。 解决方案 如果你想知道高度的点与地... 阅读全文
posted @ 2011-01-28 11:05 AlexCheng 阅读(1267) 评论(0) 推荐(0)
处理顶点——基于一个顶点缓冲和一个索引缓冲创建一个地形
摘要:问题 基于一张2D高度图,你想创建一个地形并以一个有效率的方法绘制它。 解决方案 首先需要一张高度图,包含所有用来定义地形的高度数据。这张高度图有确定数量的二维数据点,我们称之为地形的宽和高。 显然,如果你想基于这些数据创建一个地形,这个地形将从这些width*height顶点中绘制,如图5-14右上角所示(注意数字是从0开始的)。 图5-14 地形网格 要使用三角形完全覆盖网... 阅读全文
posted @ 2011-01-28 11:02 AlexCheng 阅读(1235) 评论(1) 推荐(0)
处理顶点——自动计算顶点缓冲中所有顶点的法线
摘要:问题 当绘制自定义的结构时,你会发现光照不正确。 这是因为你没有指定正确的法线向量,显卡要求每个顶点都有法线信息,这样它才可以决定每个三角形获得多少光照,详细信息可见第六章。 为每个顶点计算法线向量看起来很复杂,因为大多数顶点被多个三角形共享。 解决方案 如果每个顶点只被一个三角形使用,你只需找到三角形的法线向量(换句话说,这个向量垂直于三角形)并将这个向量作为三个顶点的法线向量。 但... 阅读全文
posted @ 2011-01-28 10:58 AlexCheng 阅读(904) 评论(0) 推荐(0)
处理顶点——开启Backface Culling(背面剔除):它是什么和它能做什么
摘要:问题 在前面的教程中,你经常可以在Draw方法中看到以下代码: device.RenderState.CullMode = CullMode.None; 如果你移除这行代码并将相机移动到三角形的后面,它们会消失!当你在没有理解backface culling时定义三角形顶点,会有50%可能三角形无法显示。 解决方案 你定义三角形顶点的方式告知XNA你想让哪一面朝向相机。 当绘制一个实... 阅读全文
posted @ 2011-01-26 10:51 AlexCheng 阅读(3462) 评论(0) 推荐(0)
处理顶点——将经常更新的顶点数据存储在DynamicVertexBuffer
摘要:问题 你需要频繁更新顶点数据,如果使用VertexBuffer的SetData方法会拖慢程序。 解决方案 如果你计划频繁更新顶点数据,应该使用DynamicVertexBuffer而不是VertexBuffer。 这会让数据不是存储在最快的显存中,而是更容易处理的某些内存中。所以,这样做会让性能有一点降低,但在VertexBuffer中频繁地改变数据会让性能得到极大地提高。 对于Ver... 阅读全文
posted @ 2011-01-26 10:47 AlexCheng 阅读(1502) 评论(0) 推荐(0)
处理顶点——使用顶点缓冲和索引缓冲将顶点和索引保存在显存中
摘要:问题 每次当你调用device. DrawUserPrimitives方法时,顶点都会从系统内存传递到显卡中。通常,大部分数据没有变化,这意味着每帧重复传递了相同的数据。今天的显卡有容量很大而且很快的显存,所以你可以将顶点数据存储在显存中加速程序。从显存中将顶点数据传递到显卡速度要快得多,因为这些数据只在同一板卡的不同芯片间传输。同样索引数据也能获得加速。 解决方案 通过创建顶点数组的Ver... 阅读全文
posted @ 2011-01-25 09:20 AlexCheng 阅读(658) 评论(0) 推荐(1)
处理顶点——使用索引移除冗余顶点
摘要:问题 你要绘制的三角形共享了很多顶点,如图5-7所示。 图5-7 可以从使用索引中受益的结构 如图5-7所示的八个三角形在使用TriangleList的情况下需要8*3 = 24个顶点,从这个图中可以看到实际上只有9个独立的顶点,所以其余15个顶点会浪费显卡的内存,带宽和处理能力。 解决方案 好的办法是将这9个独立顶点存储在数组中并将这个数组传递到显卡。然后创建一个包含24个数字的... 阅读全文
posted @ 2011-01-25 09:17 AlexCheng 阅读(519) 评论(0) 推荐(0)
处理顶点——在三角形上添加纹理
摘要:问题 你想绘制一个颜色漂亮的三角形并可以完全控制三角形上的颜色。 解决方案 你的显卡允许你指定一张图像,从这张图像可以采样想要的颜色。 这意味着你需要将一张2D图像导入到XNA项目中,并在绘制三角形之前将它传递到显卡。对每个顶点,你要指定2D图像的哪个位置对应顶点。 工作原理 首先将一张2D图像导入到项目中,如教程3-1所示。在LoadContent方法中将它链接到一个变量: myTexture... 阅读全文
posted @ 2011-01-25 09:07 AlexCheng 阅读(581) 评论(0) 推荐(0)
C#编码规范
摘要:目标: 1. 安全:代码完成所需的功能之余,不要产生负作用,即要稳定可靠。 2. 易读: 类、实例、成员变量、成员函数的命名一目了然 3. 美观: 尽量统一项目组内人员的编程风格。 第一部分:命名 1. 命名原则 1) 所有的函数(变量/类/文件名)应该代表其实际的作用,应该使用有意义的单词或多个词组合,但不要使用人名、项目组名。 2) 所有的函数(变量/类名)一律使用英文。 3)... 阅读全文
posted @ 2011-01-23 09:59 AlexCheng 阅读(222) 评论(0) 推荐(0)
数据库如何规范命名
摘要:一、数据库文件命名 数据文件命名采用系统名+_+文件类型,比如系统名为ComSys,则数据库文件命名为ComSys_database.mdf,有的数据库文件有多个,比如SQL Server就有2个,一个是数据库文件,另一个是日志文件,那么他们的文件命名分别为ComSys_database.mdf,ComSys_log.log。 二、数据库对象命名规范 数据库对象包括表、视图(查询)、存储过程... 阅读全文
posted @ 2011-01-23 09:57 AlexCheng 阅读(691) 评论(0) 推荐(0)
.NET中读取csv文件内容
摘要:1.通过OdbcConnection可以创建一个链接到csv文件的链接 2. 链接字符串的格式: "Driver={Microsoft Text Driver (*.txt;*.csv)};Dbq="+cvs文件的文件夹路径+" Extensions=asc,csv,tab,txt; Persist Security Info=False"; 创建以上连接后,可以直接使用D... 阅读全文
posted @ 2011-01-22 14:44 AlexCheng 阅读(751) 评论(0) 推荐(0)
处理顶点——绘制三角形,线和点
摘要:问题 你想定义一个3D几何结构并绘制到屏幕上,这个结构可以是由三角形,线或点组成。 解决方案 当绘制3D几何对象时,你首先需要使用primitives(图元)定义它的形状。Primitives (图元)是可以被XNA绘制的最基本的对象,最常被使用的图元是三角形。任何形状,包括圆,如果圆的数量足够多的话,都能用来表示三角形。XNA Framework可以将点,线、三角形作为图元绘制。 XNA允许你... 阅读全文
posted @ 2011-01-21 10:45 AlexCheng 阅读(771) 评论(0) 推荐(0)
处理模型——检测光标是否在模型上
摘要:问题 你想检测光标是否在模型上。 解决方案 在XNA中,获取光标在屏幕上的2D位置是简单的。屏幕上的这个点对应3D空间中的一条射线Ray,如图4-28所示。 图4-28 2D光标对应3D空间的一条射线 因此,当你想检测光标在哪个模型上,需要检测射线与模型的碰撞,所以,这个教材会用到教程4-18的代码。 很有可能射线与多个模型相交,这个教程还会教你如何获取离屏幕最近的一个模型。... 阅读全文
posted @ 2011-01-21 10:40 AlexCheng 阅读(209) 评论(0) 推荐(0)
处理模型——使用逐三角形检查检测射线-模型碰撞
摘要:问题 你想检测一根3D射线是否与模型发生碰撞,如果你想进行一个最高细节的碰撞检测这是必须的,可以作为教程4-11的拓展进行子弹是否与物体发生碰撞的高细节碰撞。如下一个教程所示,这可以用来检测鼠标是否在模型上。 而且,这个方法也可以用来进行模型之间的最高精度的检测,这是因为对应一条射线的每一个三角形的边缘可以用来进行与另一个模型的碰撞检测。 这个教程会处理最复杂的情况,允许模... 阅读全文
posted @ 2011-01-16 20:08 AlexCheng 阅读(652) 评论(0) 推荐(2)
处理模型——根据地形正确倾斜模型
摘要:问题 当在地形上移动一个汽车模型时,使用教程4-2你可以调整车的高度,使用教程5-9你可以找到位于汽车下面的地形的高度。但是,如果你没有根据车下面的坡度正确使车身发生倾斜,那么在起伏不平的地形上效果看起来不会很好。 你想正确地放置和倾斜汽车模型使之可以匹配地形的起伏。 解决方案 这个问题可以分成四个部分: 首先,你想找到模型四个轮胎的最低顶点的位置。 其次,你想获取这四个顶... 阅读全文
posted @ 2011-01-16 19:49 AlexCheng 阅读(504) 评论(0) 推荐(0)
处理模型——通过定义一个自定义的TypeWriter和TypeReader将多个对象存储在Tag属性中
摘要:问题 要让模型处理器可以将对象存储在模型中并传递到XNA项目,XNA提供了模型的Tag属性。从教程4-13,4-14和4-15中可以看到Tag属性对于存储一个相同类型的数组是很有用的,例如Vector3的数组或Triangle的数组。但很多情况中,你想传递多个对象,例如同时传递Vector3集合和模型的包围盒。 解决方案 定义一个自定义类,这个类存储所有你想传递的对象。在你的模型处理器中,创... 阅读全文
posted @ 2011-01-16 19:44 AlexCheng 阅读(293) 评论(0) 推荐(0)
处理模型——通过定义一个自定义的TypeWriter和TypeReader直接处理顶点位置数据
摘要:问题 你想访问模型中每个顶点的位置。但你想要一个三角形对象的数组,每个三角形对象包含三个Vector3向量,而不是想前面的教程中那样将所有Vector3放在一个大数组中。 或者,更普遍的情况,你想将一个自定义内容处理器类对象传递到XNA程序中,但内容管道无法知道应该如何串行化和反串行化这个类对象,所以你必须定义自己的TypeWriter和TypeReader。 解决方案 本教程的代码主要建... 阅读全文
posted @ 2011-01-16 19:38 AlexCheng 阅读(308) 评论(0) 推荐(0)
处理模型——通过扩展模型处理器直接处理每个ModelMesh的顶点位置数据
摘要:问题 前面的教程中让你可以访问模型的所有顶点的相对于模型初始位置的位置。但是,如果你想对模型的一部分施加动画,例如,旋转一个人的手臂,那么你还想变换手臂,手,手指的位置。使用上一个教程的结果是不可能的,因为Vector3集合不包含Vector3属于模型哪个部分的信息,只包含相对于模型初始位置的信息。 解决方案 模型的独立变换部分是存储在ModelMeshe中的。ModelMesh有一个Tag... 阅读全文
posted @ 2011-01-16 19:34 AlexCheng 阅读(482) 评论(0) 推荐(0)
处理模型——通过扩展模型处理器直接访问顶点位置数据
摘要:问题 在XNA项目中,你想实时访问每个顶点的位置,如果你需要非常精确的碰撞检测或想找到模型上的特定点时,这一步非常有用。 虽然你可以使用常规代码访问模型的VertexBuffer,但因为顶点数据需要从显卡传递到系统内存,所以这种方法需要笨拙的代码并会拖慢程序。 解决方案 通过提取你想要的数据并把它们存储在模型的Tag属性中扩展默认模型处理器。本教程中,你将编写一个自定义模型处理器创建一个数... 阅读全文
posted @ 2011-01-16 19:31 AlexCheng 阅读(318) 评论(0) 推荐(0)
处理模型——扩展模型内容导入器加载自定义Effects
摘要:问题 你想使用一个自定义内容处理器改变模型的effect而不是实时处理。通过这种方式,模型可以正确地加载到XNA项目中,而无需在实时保存原始effect中的所有纹理和其他信息。 注意:如果你想学习如何扩展默认模型处理器,最好先看下一个教程。 解决方案 扩展默认模型处理器并重写ConvertMaterial方法,这个方法被模型中的每个MaterialContent调用,把这个方法重写将所有的... 阅读全文
posted @ 2011-01-16 19:26 AlexCheng 阅读(251) 评论(0) 推荐(0)
windows下Android开发环境配置
摘要:开发Android应用程序之前,需要安装Eclipse,Android SDK以及 ADT plug-in。 1.下载Eclipse 下载地址http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/R/eclipse-java-galileo-win32.zip 2... 阅读全文
posted @ 2011-01-15 14:43 AlexCheng 阅读(332) 评论(0) 推荐(0)
解决:developer.android.com 无法访问的问题
摘要:Android的官方网站虽然能打开,但developer.android.com却被和谐掉了。如果你是Android应用程序开发者可以通过两种方式解决这个问题: 1.直接通过这个地址打开http://androidappdocs.appspot.com/index.html 2.通过VPN软件FQ,我是使用GreenVPN。 下载地址:http://www.greenvpn001.net/shi... 阅读全文
posted @ 2011-01-15 13:53 AlexCheng 阅读(1147) 评论(0) 推荐(0)
处理模型——对小而快的对象使用Ray-Traced进行碰撞检测
摘要:问题 大部分的碰撞检测方法只在两个物体发生物理碰撞时才检测。但是,如果有一个小物体快速地穿过另一个物体,你的程序的更新速度就有可能跟不上而无法检测到碰撞。 举一个具体的例子,比如一枚子弹打穿一个瓶子。子弹以5000km/h 的速度射向一个瓶子,而瓶子的宽度只有15cm。XNA程序每秒更新60次,所以每次更新子弹会前进23米的距离。这样的话,在调用Update方法时几乎没有可能检测到子弹和瓶子的... 阅读全文
posted @ 2011-01-15 10:52 AlexCheng 阅读(389) 评论(0) 推荐(0)
处理模型——使用包围球进行基本模型碰撞检测
摘要:问题 你想检测两个模型是否发生碰撞。如果在场景中有许多模型,你将无法进行一个精确的逐三角形的碰撞检测。你想使用一个快速检测方法并在以后进行一个更好的碰撞检测。 解决方案 当进行碰撞检测时,你会发现常常需要在速度和精确度之间进行衡量。在大多数情况中,你会进行组合检测。在第一轮检测中,使用快速检测遍历所有对象,之后对快速检测中可能发生碰撞的物体进行精确检测。 本教程展示了两个方法处理两个模型间... 阅读全文
posted @ 2011-01-15 10:50 AlexCheng 阅读(497) 评论(0) 推荐(0)
处理模型——使Bone独立运动:模型动画
摘要:问题 你想独立的移动模型的每一部分。例如,你想摇低一辆车的车窗或让车轮转动。 解决方案 如教程4-1中解释的那样,一个模型是由可单独绘制的ModelMesh组成的。每个ModelMesh都链接到一个Bone,这些Bone互相联系,之间的位置关系是由矩阵显示的。 每个模型都有一个root Bone,所有其他Bone对象直接或间接与它链接,图4-11显示了这种结构的一个例子。 如果你想对图中... 阅读全文
posted @ 2011-01-15 10:45 AlexCheng 阅读(414) 评论(0) 推荐(0)
处理模型——可视化模型骨骼结构
摘要:问题 如在教程4-1中的最后所讨论的,一个模型通常包含许多成员,这些成员叫做ModelMeshes。这些ModelMeshes之间的位置联系是包含在Model对象的Bone结构中的。Bone结构定义了ModelMeshes是如何并在哪儿互相联系,每个ModelMesh 相对于parent ModelMesh旋转和/或缩放了多少。 在你可以让模型动起来前,你需要知道ModelMeshes是连接在... 阅读全文
posted @ 2011-01-15 10:42 AlexCheng 阅读(367) 评论(0) 推荐(0)
处理模型——使用自定义Effects和纹理绘制模型
摘要:问题 当你使用教材4-1中的代码将一个模型加载到XNA项目时,你使用的是一个BasicEffect实例。在简单的情况下BasicEffect可以很好地绘制模型,当我们常常想使用一个不同的,自定义的effect绘制一个模型。 解决方案 通过将模型的effect包含在BasicEffect对象中,你可以获取effect的所有信息,诸如纹理和材质等信息。当你将这些属性复制到某个安全的地方后,就可以... 阅读全文
posted @ 2011-01-15 10:35 AlexCheng 阅读(439) 评论(0) 推荐(0)
处理模型——缩放模型
摘要:问题 当从磁盘载入模型时,往往会太大或太小,你想将模型缩放到定义的大小。 解决方案 首先你需要定义一个模型的全局包围球,前面一个教程已经解释了。知道了这个包围球,你就可以知道模型的当前尺寸了。从这个尺寸,你可以知道需要将模型放大或所小多少。你也可以将这个缩放操作储存在root Bone矩阵中,这样缩放会施加到模型中所有Bone的所有矩阵上(可见教程4-9)。 工作原理 通常,你使用的模型... 阅读全文
posted @ 2011-01-15 10:31 AlexCheng 阅读(438) 评论(0) 推荐(0)
处理模型——构建模型的全局包围球
摘要:问题 模型的包围球是完整包围模型的最小球体。在很多情况中,例如碰撞检测,判断大小等,使用包围球是非常有用的。 解决方案 你可以访问模型中的每个ModelMesh的包围球。使用CreateMerged方法,你可以将这个包围球组合起来,获取包围整个模型的包围球。 但是,因为每个ModelMesh的包围球是相对于Bone矩阵定义的,所以你需要进行转换。 工作原理 你将创建一个方法将一个素材加载到一个模型... 阅读全文
posted @ 2011-01-15 10:01 AlexCheng 阅读(428) 评论(0) 推荐(0)
CodeSmith连接Access,Sql,Oracle,mysql
摘要:ACCESS数据库 1:CodeSmith选中链接类型是:ADOXSchema 2:无密码的Access链接为: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\hh\db.mdb; 3:有密码的Access链接: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\hh\db.m... 阅读全文
posted @ 2011-01-05 22:09 AlexCheng 阅读(281) 评论(0) 推荐(0)
处理模型——使用加速度控制速度
摘要:问题 你想让模型能够漂亮的加速而不是从静止直接提高到最大速度。图4-9显示了你想实现的这种加速过程。 图4-9 模型的速度时间图像 解决方案 通过添加加速度,你可以定义你的模型的速度变化有多快。加速度就是每帧速度的增加量。 工作原理 你需要保存模型的位置和旋转,这是因为你需要知道哪个方向是向前的。在本例中,你只是让模型绕着它的向上的y轴旋转并沿着X和Z轴移动。如果你想让模型只基于X和Z轴沿着一个... 阅读全文
posted @ 2011-01-05 14:24 AlexCheng 阅读(479) 评论(0) 推荐(0)