第三节:准备开始

  下面我们将介绍在编制立即模式程序之前需要了解的一些技术上的概念。他并不是对较宽层面上的详细描述,也不是对Direct3D的组成部分的深入分析。要了解更多的有关信息,可以察看“Direct3D立即模式的体系结构”和“Direct3D立即模式的要素”两部分内容。

  如果你已经对编制三维图形程序有一定经验,可以浏览一下以下的内容,了解一些Direct3D所特有的东西。

这些内容分为以下两个部分:

 

一.3-D坐标系统和几何学

  编制Direct3D应用程序要对三维几何学的一些基本内容有一定的了解。这与部分我们将介绍一些重要的有关创建三维场景的几何学概念,分为以下几个部分:

1. 3-D坐标系统

  一般来说,3-D图形应用程序使用两种类型的笛卡尔坐标系统:即左手坐标系统(left-handed)和右手坐标系统(right-handed)。在这两种坐标系统中,x-轴正方向均指向右边,y-轴正方向也都指向上方。z-轴的方向可以用左、右手定则来确定,即握起左(或右)手的四指来代表由x-方向旋转到y-方向,则左(或右)手的拇指就指向z-轴的正方向。如下图:

pic1.gif (4877 bytes)

  Direct3D中使用的是左手坐标系统。如果你的程序使用的是右手坐标系统,那么你只需要对Direct3D的数据做两个很小的修改:

  要注意的是,还有其它许多种用于3-D软件的坐标系统。左手和右手系统只是其中最常用的两种。然而在三维造型程序中,y-轴指向或背离观察者,z-轴朝上的坐标系统也经常被采用。既然如此,右手系统中通常将任意一个正坐标方向(xyz)指向观察者。左手系统则通常将任意一个坐标的负方向指向观察者。如果你所使用的左手坐标系统中z-轴指向上方,那么除了前面所说的之外,你还需要对所有的顶点数据进行旋转。

  对三维坐标系统中定义的对象,一些基本的操作包括:平移(translate),旋转(rotate),和缩放(scale)。你可以将这些基本的变换组合起来建立一个变化矩阵,想要进一步的了解有关内容,请注意“3-D变换”部分。

  要记住的是,将这些操作组合在一起的顺序是很重要的,组合顺序的不同,得到的结果也会不同。 

2. 3-D图元

  一个3-D图元就是一些顶点的集合,它们组成了一个三维实体。最简单的图元就是一个三维坐标系统中的点的集合,在Direc3D中我们称为顶点列表(point list)。

  通常,三维图元都是多边形。Direct3D中的多边形是一个封闭的三维图形,它至少由三个顶点组成。最简单的多边形是一个三角形。Direct3D用三角形来组成大多数的多边形,这是因为一个三角形的三个顶点保证是共面的。渲染非共面的顶点是很困难的。我们可以用三角形来组成更大的更复杂的多边形和多面体(mesh)。

  下方的左图显示了一个立方体。立方体的每一个面由两个三角形组成。这些三角形一起组成了一个立方体图元。你可以在图元的表面上使用材质和纹理,这样就使它更象一个实心的物体。要了解更多有关的内容,注意“材质和纹理”部分。

pic2.gif (2687 bytes)          pic3.gif (6370 bytes)

  你也可以使用三角形来构造一个表面由平滑曲面组成的图元。上方的右图展示了一个由三角形构成的球体。使用了材质之后,这个球体的表面看起来会更平滑。如果再使用Gouraud明暗处理方法,它会更加逼真。

3. 三角光栅准则

  通常,用来表示顶点的点不会和屏幕上的像素很好的吻合。这时,Direct3D会使用三角光栅准则来决定将那些像素用来显示一个给定的三角形。

  Direct3D使用左上角填充约定(top-left filling convention),这与应用于GDIOpenGL中的矩形的约定是一致的。在Direct3D中,我们用像素的中心点来进行判决。当中心点在一个三角形内部时,这个像素就被判定为属于这个三角形。像素的中心点的坐标值都是整数。

  Direct3D中所使用的这一三角光栅准则并不一定被所有的硬件所使用。经过测试我们会发现,这些约定在执行时会有一些细小的差别。

  下面左图中显示了一个矩形,它的左上角坐标为(00),右下角坐标为(55)。这个三角形填充了25个像素,它的宽为右侧坐标减去左侧坐标,高为底边坐标减去顶边坐标。

pic4.gif (7448 bytes)

  在左上角填充约定中,“上”一词代表水平跨度(span)在竖直方向上的位置,“左”一词则代表一个跨度内像素的水平位置。如果一条边不是水平的话,那么它就不能被称为一个顶部边缘(top edge),pic5.gif (2836 bytes)这样一来,大多数的三角形就都只有左侧和右侧边缘了(left and right edges)。如上面右图所示。

  当一个三角形的边穿过像素的中心时,也由左上角填充规则来进行判决。左图显示了两个三角形,一个位于(0, 0)(5, 0),和(5, 5),另一个位于(0, 5)(0, 0),和(5, 5)。第一个三角形占据了15个像素,而第二个三角形占据了10个像素。这是因为两个三角形的公共边是第一个三角形的左侧边缘。

  我们来举个例子,如果我们定义了一个矩形,它的左上角坐标为(0.5, 0.5),右下角坐标为(2.5, 4.5),那么这个矩形的中心点就应该在(1.5, 2.5)。当Direct3D的光栅(rasterizer)在这个矩形上覆盖了一层小方格图案之后,每个像素的中心明确的分别位于四个三角形之内。而此时,左上角填充规则就不再需要了。下面的左图就显示了这一例子。位于矩形内的像素会按照它所在的三角形来区分,Direct3D中也包含了这样的情况。

pic6.gif (10269 bytes)

  如果你将上面例子中的矩形移动一下,使它的左上角位于(1.0, 1.0),右下角位于(3.0, 5.0),则中心点位于(2.0, 3.0),这时,Direct3D就会使用左上角填充准则。这个矩形中的大多数像素就会骑跨在两个或更多的三角形的边界上,如上面右图所示。

  对这两个矩形来说,相同的像素都要受影响。

pic7.gif (8148 bytes)

 

 

上一页 | 目录 | 下一页