`
andyjackson
  • 浏览: 57351 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

XNA学习笔记1-相机

阅读更多
   看了几天的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
分享到:
评论
3 楼 zhc0822 2010-11-26  
andyjackson 写道
zhc0822 写道
讲得不错,比较深入。

深入个毛啊。。。就会鄙视我

我了个去啊 没有鄙视你啊大师 真的 那本英文入门书里没讲到这些。
2 楼 andyjackson 2010-11-26  
zhc0822 写道
讲得不错,比较深入。

深入个毛啊。。。就会鄙视我
1 楼 zhc0822 2010-11-26  
讲得不错,比较深入。

相关推荐

Global site tag (gtag.js) - Google Analytics