赞助广告

 

年份

最新评论

评论 RSS

处理模型——找到对应一个方向的旋转角

clock 十二月 8, 2010 14:06 by author alex
问题 通过绘制模型前设置世界矩阵(见前一个教程)时,你可以在场景的任意位置放置模型。当你将模型从A点移至B点,你需要确保它转向正确的方向。 这个旋转角通常通过一个自然的方式获取,例如,当处理一个包含旋转的世界矩阵。但是,如果你只是存储模型的前一个位置和当前位置的方法移动模型的话,那么必须手动旋转这个模型。 解决方案 你需要首先计算模型运动的方向。从这个方向的X轴和Z轴开始,很容易找到这个角度。 工作原理 给定一个方向,你想知道需要旋转模型多少角度才能让它指向这个方向。给定如图4-8右边所示的方向,你想找到这个方向与Z轴的夹角。 如果你还记得三角形的基本知识那么这个解决方案是很简单... [更多...]

处理模型——对不同对象设置不同的世界矩阵,组合世界矩阵

clock 十二月 8, 2010 14:04 by author alex
问题 你想在绘制模型之前独立地移动、旋转并/或缩放它们。 解决方案 你可以设置对象的世界矩阵实现这个功能,而矩阵是可以存储任何变换(平移、旋转或缩放等操作)的对象。你可以简单地使用XNA框架提供的基本方法创建一个变换矩阵: Matrix.CreateTranslation Matrix.CreateScale Matrix.CreateRotationX-Y-Z 第一个方法创建一个平移矩阵,你可以定义将模型沿着X、Y和Z方向移动的距离。第二个方法让你可以缩放模型,第三个方法返回绕X、Y和Z轴旋转的矩阵。 你可以乘以这些矩阵组合多个变换,但必须按照... [更多...]

处理模型——使用BasicEffect类载入模型

clock 十二月 8, 2010 14:00 by author alex
问题 因为手动定义一个复杂3D对象的所有点几乎是不可能的,所以这些3D对象应该是由艺术家在3D建模程序中制作,模型可以保存为一个文件。你想从文件加载模型并在场景中绘制这个模型。 解决方案 XNA Framework已经包含了所需方法。XNA提供了一个默认的Model素材管道可以从.x和.fbx文件加载模型。如教程3-1的图片所示,你只需将模型拖动到Solution Explorer的Content文件夹即可,然后将它设置为XNA代码中的一个变量。这个Model变量包含绘制模型的方法。 工作原理 首先将. x或. fbx文件导入到XNA Game Studio中。你可以通过在Windo... [更多...]

处理2D图像和纹理——投影纹理

clock 十二月 8, 2010 13:57 by author alex
创建一面镜子:投影纹理 问题 你想在场景中创建一面镜子。例如,在一个赛车游戏中创建一面后视镜。你也可以使用这个技术创建一个反射贴图。 解决方案 首先需要将镜子中看到的场景绘制到一张纹理中。然后,绘制相机中见到的场景(包括空镜子),最后将这张纹理贴在镜子上。 要绘制从镜中看起来的场景,你需要定义第二个相机,叫做镜像相机(mirror camera)。你可以通过镜像第一个普通相机的Position,Target和Up向量获取镜像相机的Position,Target和Up向量。当通过镜像相机观看场景时,你看到的与镜子中看到的一样。图3-24 显示了这个原理。 图3-24 镜像原理 ... [更多...]

处理2D图像和纹理——创建一个3D爆炸效果,简单的粒子系统

clock 十二月 4, 2010 14:22 by author alex
问题 你想在3D世界中创建一个漂亮的3D爆炸效果。 解决方案 你可以通过混合大量的小火焰图像(叫做粒子)创建一个爆炸效果,,如图3-22所示。注意一个单独的粒子很暗,但是,如果你添加大量的粒子,就会获得一个漂亮的爆炸效果。 图3-22 单个爆炸粒子 在爆炸的开始阶段,所有粒子都位于爆炸的初始位置,因为所有图像的颜色都叠加在了一起,所以会形成一个明亮的火球,绘制粒子时你需要使用additive blending才能获得这个效果。 随着时间流逝,粒子会从初始位置离开。而且,在离开中心的过程中还要使每个粒子图像变得更小更暗(淡出)。 一个漂亮的3D爆炸需要用到50至100个粒子。因... [更多...]

处理2D图像和纹理——Billboarding:在3D世界绘制2D图像使它们总是面向相机

clock 十二月 4, 2010 14:17 by author alex
问题 要使画面给人留下深刻印象,一个3D世界需要包含许多物体,特别是处理室外场景时。例如,如果没有绘制成百上千棵树,树林看起来就会显得不真实。但是,以3D模型的形式绘制几百颗树是不可能的,因为这样做会极大地拖慢应用程序。 你也可以使用少量的billboarding(译者注:billboard可以翻译为公告板,广告牌),例如,绘制激光束或子弹。这通常和一个粒子引擎组合在一起(见教程3-12)。 解决方案 你可以通过使用一张2D图像代替3D物体解决这个问题。但是当相机在2D图像旁边时,观察者很容易看出这是一张2D图像,如图3-16的左图所示,左图中有5张2D图像放置在3D世界中。 ... [更多...]

处理2D图像和纹理——扩展图像内容处理器:灰度变换和处理器参数

clock 十二月 4, 2010 14:11 by author alex
扩展图像内容处理器:灰度变换和处理器参数 问题 你想扩展图像处理器用来处理每个独立像素的颜色。你还想从XNA主项目中改变处理器的参数。 解决方案 在前面的教程中,你知道了如何扩展内容处理器,让你可以处理并改变独立像素的值。 在Processor类中声明的所有公共变量都可以在素材的属性面板中设置。 工作原理 开始的初始化步骤已经在教程3-9中解释过了。复制下列代码让你可以处理图像文件中的所有图像(有些图像文件,例如texCube,包含多个图像): namespace GrayContentPipeline { [ContentProcessor(DisplayName... [更多...]

处理2D图像和纹理——扩展图像内容处理器

clock 十二月 4, 2010 13:35 by author alex
扩展图像内容处理器 问题 你想扩展默认的图像内容导入器控制像素,或者你想学习内容管道(content pipeline)。 解决方案 因为XNA已经提供了一个内容导入器将一个图像文件作为源并最终将它创建为一个Texture2D对象,你要做的只是扩展这个内容导入器。本教程中,你可以调用PixelBitmapContent辅助类的ReplaceColor方法,它是由内容管道框架提供的。 注意:如果你只对alpha颜色感兴趣,图像内容处理器会自动将品红色的像素变为透明。本教程主要是介绍如何扩展内容导入器。 工作原理 本教程主要介绍内容管道和如何扩展已经存在的内容处理器,所以,对内容管道... [更多...]

处理2D图像和纹理——将场景绘制到纹理

clock 十二月 4, 2010 13:26 by author alex
将场景绘制到纹理 问题 你想将屏幕上的内容保存在一个纹理文件中,这样可以实现屏幕截图,或者将场景绘制到一个纹理,而这个纹理用于深度贴图/折射贴图或作为post-processing effect的输入。 解决方案 最简单的方法是使用device. ResolveBackBuffer方法,这个方法将当前后备缓冲中的内容写入到一个纹理中。如果你只想将场景绘制到一个纹理,或指定大小的纹理,你需要使用device.SetRenderTarget 方法将渲染目标从屏幕变为你在内存中定义的那个目标。一旦场景已经完整地绘制到了那个目标,你就可以将它的内容存储在一张纹理中了。 工作原理 最简单的方... [更多...]

友情链接赞助