看了几天的XNA,总是感觉模模糊糊的。没有游戏开发相关的基础,立体建模也丢了好久,总是只是感觉就这样,为什么是这样总想不明白。现在,我总算明白了其中的一些,就把自己理解的写下来吧。。。
1.对于任何一个3D(2D也可以放在3D的坐标空间中看待)元素(文字、图像等),需要两个矩阵:观察矩阵和投影矩阵。
对于viewMatrix,需要三个参数:相机的位置、目标的位置和Up矢量
Matrix viewMatrix;
Vector3 camPosition = new Vector3(10, 0, 0);
Vector3 camTarget = new Vector3(0, 0, 0);
Vector3 camUpVector = new Vector3(0, 1, 0); //通常是这个值
viewMatrix = Matrix.CreateLookAt(camPosition, camTarget, camUpVector);
前面两个参数表较好理解对于第三个参数其实就是观察者的上方。打个比如,人将头倒过来,camPosition没有改变,camTarget也没有改变,但是实际上人看到的物体的样子改变了。
对于projectionMatrix,需要四个参数。
第一个参数是观察角度。它对应金字塔顶角的一半,如图2-2右图所示。如果你想知道自己的观察角度,可以将手放在眼睛前面,你会发现这个角度约为90度。因为弧度PI等于180度,90等于PI/2。因为你需要指定观察角度的一半,所以这个参数为PI/4。
注意:通常你想使用一个对应人的视角的视角,但是在某些场景中你可能会指定其他的视角。通常发生在你想将场景绘制到一张纹理的情况中,例如,从光线的视角看来。在光线的情况中,更大的视角表示更大的光照范围。
第二个参数是2D屏幕的长宽比,它实际上对应后备缓冲的长宽比,你可以使用以下代码获取它:graphics.GraphicsDevice.Viewport.AspectRatio。
最后两个参数与视锥体有关。想象一下一个物体非常靠近相机,这个物体会占据整个视野,窗口会被一个单独的颜色占满。要避免这个情况的发生,XNA让你可以定义一个靠近金字塔顶部的平面。位于金字塔顶部和这个平面之间的物体不会被绘制,这个平面叫做近裁平面(near clipping plane),你可以指定相机到这个近裁平面的距离作为CreatePerspectiveFieldOfView方法的第三个参数。
注意:剪裁过程用来表示有些物体无需被绘制以提高程序帧频率。同理也可以处理离相机非常远的物体;这些物体看起来很小,但仍占用显卡的处理时间。所以,远于第二个平面的物体也会被剪裁。第二个平面叫做远裁平面(far clipping plane),它是视锥体的最远边界。你可以指定相机到这个远裁平面的距离作为CreatePerspectiveFieldOfView方法的最后一个参数。
当心:即使绘制的是一个及其简单的3D场景,也不要把远裁平面设置地过大。例如将远裁平面的距离设置为比较疯狂的100000会导致一些视觉错误。带有16-bit深度缓冲的显卡(可参见本教程的“Z-Buffer (或Depth Buffer)”一节)有2^16 = 65535个深度值。如果两个物体使用同一个像素,而且之间的距离小于100k/65535 = 1.53个单位时,显卡就无法判断哪个物体更加靠近相机。
float viewAngle = MathHelper.PiOver4;
float aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio;
float nearPlane = 0.5f;
float farPlane = 100.0f;
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(viewAngle, aspectRatio, nearPlane,farPlane);
2.计算机如何将3D的元素刻画在2D的屏幕上。计算机会选择就近的像素的颜色,如下图中,会取A因为A比B更靠近B。
但是,如果首先绘制物体B,frame buffer中对应像素会首先被指定为B的颜色。然后物体A被绘制,显卡需要判断像素是否需要用物体A的颜色覆盖。解决方法是,在显卡中还储存了第二张图像,它的大小与窗口大小一样。当给frame buffer中的一个像素指定一个颜色时,这个物体和相机间的距离会保存在第二个图像中。
这个距离介于0和1之间,0对应近裁平面与相机间的距离,1对应远裁平面与相机间的距离。所以第二个图像叫做depth buffer或z-buffer。当绘制物体B时会检查z-buffe,因为B首先绘制,z-buffer是空的。结果是frame buffer中对应像素的颜色就是B的颜色,在z-buffer的相同像素中获得一个值,对应B物体与相机间的距离。然后绘制物体A,对应物体A的每个像素,首先检查z-buffer。z-buffer已经包含了物体B的值,但储存在z-buffer中的距离大于物体A与相机间的距离,所以显卡知道需要用物体A的颜色覆盖这个像素!
- 大小: 4 KB
分享到:
相关推荐
1. **Content Pipeline**:内容管道是XNA中的一个重要概念,它允许开发者处理和导入各种媒体资源(如图像、音频和3D模型)到游戏中。内容管道工具集将这些资源转化为XNA框架可以理解的格式,使得游戏运行时能够高效...
XNA Tutorial Collision Series 1 - 2D Rectangle Collision
1. **游戏循环**:在XNA中,游戏运行基于一个核心的游戏循环,包括初始化、更新、绘制等步骤。开发者需要理解这些阶段的作用,例如更新逻辑、处理输入和渲染画面。 2. **内容管道(Content Pipeline)**:XNA提供了一...
1. **XNA概述**:解释XNA的起源、目标和适用场景,以及与.NET Framework的关系,帮助初学者理解XNA在游戏开发中的定位。 2. **安装和配置XNA开发环境**:指导如何安装Visual Studio Express(通常是Visual Studio ...
#### 三、学习XNA所需技能 - **C#编程基础**:虽然本书不是编程入门书籍,但对于C#有一定的了解是非常必要的。C#是XNA开发的主要语言,熟悉C#语法和编程技巧对于理解XNA框架至关重要。 - **数学基础知识**:游戏...
**XNA学习指南详解** XNA,全称为Xbox Next Generation APIs,是由微软推出的一款用于游戏开发的框架,特别适合初学者和有经验的游戏开发者。它提供了完整的工具集,包括编程环境、图形库和音频处理功能,使得创建...
1. **3D图形编程**:源码中会涉及到如何使用XNA的GraphicsDevice管理器来创建和渲染3D模型,包括棋盘和棋子的建模和纹理贴图。 2. **游戏逻辑实现**:理解并实现国际象棋的规则,包括棋子的移动规则、合法走法检查...
开发团队已经将项目的维护移至Bitbucket平台(https://bitbucket.org/C3/2d-xna-primitives),这意味着社区可以更方便地参与贡献,修复问题,或者添加新功能,进一步增强了这个库的生命力和适应性。 在实际应用中...
XNA4.0学习指南
学习资源\3D-xna游戏设计\XNA-3D文章.CHM
- **第1章:XNA 4.0 新特性**:介绍XNA 4.0的主要更新和新功能。 - **第2章:入门指南**:引导读者完成XNA项目的安装和创建,为后续章节打下坚实的基础。 - **第3章:与精灵同乐**:学习如何创建和使用精灵,这是...
1. **易用性**:XNA采用C#语言和.NET框架进行开发,这让很多开发者能够快速上手,无需深入学习复杂的C/C++特性。 2. **跨平台性**:XNA具有良好的跨平台支持能力,开发者可以在不同平台上轻松移植游戏,无需大量修改...
1. **XNA Framework基础**:介绍XNA框架的基本结构,包括Game类、GraphicsDeviceManager、ContentManager和Update/Draw方法等核心组件。 2. **图形和渲染**:讲解如何使用XNA处理2D和3D图形,包括精灵、纹理、模型...
### XNA 3D游戏开发教程知识点概览 #### 一、XNA 游戏开发简介 ...通过以上内容,读者可以对XNA游戏开发有一个较为全面的理解,掌握从环境搭建到游戏发布的整个流程,为进一步深入学习打下坚实的基础。
【标题】"Lab-assignment-1-jiang-xiaodong.rar_XNA_assignment"涉及的是一个基于XNA框架的编程实验,旨在实现一个3D立方体的渲染与交互功能。XNA是微软推出的一款用于开发游戏和图形应用的框架,特别适合初学者和...
XNA Shader编程是现代游戏开发的重要组成部分,通过对HLSL的学习和实践,开发者可以掌握复杂的光照算法、纹理映射等技术,从而实现高质量的视觉效果。本文档提供了从基础知识到具体应用场景的全面指南,帮助读者快速...