看了几天的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
分享到:
相关推荐
XNA4.0学习指南--源代码
XNA Tutorial Collision Series 1 - 2D Rectangle Collision
XNA学习资料-XNA入门指南2.0,比较适合新手哈
XNA学习资料,XNAXNA学习资料,XNAXNA学习资料,XNAXNA学习资料,XNA
一本没有翻译的英文书籍,关于XNA游戏框架开发
XNA学习指南_中文_附源代码[XNA学习必备] 菜鸟 高手 均可参考
英文版下载地址:http://disanji.net/2011/02/13/ebook-learning-xna-4-0-game-development-for-the-pc-xbox-360-and-windows-phone-7/ 本书中彩色插图下载:http://u.115.com/file/f1a55ef495 本书源代码下载:...
基于XNA开发的3D游戏源码,适合初学者!
XNA4.0GameDevelopmentByExample-英文原版.zip
用于在XNA中绘制2D基本形状的库。 该库具有用于绘制像素,直线,矩形,填充矩形,圆形和圆弧的方法。 开发移至:https://bitbucket.org/C3/2d-xna-primitives
XNA4.0学习指南
学习资源\3D-xna游戏设计\XNA-3D文章.CHM
XNA入门指南,,入门级 XNA入门指南 XNA入门指南
XNA 4.0 学习指南。 Windows Phone 7 开发。
XNA4.0学习指南 里面有笔记 可以删除
cocos2d-xna, Cocos2d X的XNA端口 Cocos2D-XNACocos2D-XNA是基于广泛流行和成功的Cocos2D-X引擎的2D 游戏开发引擎。 使用 Cocos2D-XNA,游戏开发者可以创建具有丰富用户体验的神奇游戏,而不会带来私有游戏库巨大的...
重新写入破碎的XNA文章URL 自Xbox / Windows Phone网站分割了一吨论坛链接,带您到一个登陆页面,让您选择Windows Phone或Xbox。 有趣的部分是,无论您认为哪些选择都没有带您到文章。 此扩展在后台运行,使您将...
发出求救信号后不久,“世纪研究站”上的远程通讯突然停止。 随着军事力量的扩散越来越少,签订了自由船合同以... 勇敢的旅行者几乎不知道,在Century Station的黑暗中隐约有些可怕……[源需求] XNA Game Studio 4.0 ...
XNA中文手册XNA中文手册XNA中文手册XNA中文手册
运用相变动力学和相变热力学的基本原理,分析、讨论复合基质晶体生长的难易程度、生产界面与组分过冷的关系等问题,给出了KxNa1-xCl复合基质晶体生长的研究结果.