【精品】三维坐标系和几何学_第1页
【精品】三维坐标系和几何学_第2页
【精品】三维坐标系和几何学_第3页
【精品】三维坐标系和几何学_第4页
【精品】三维坐标系和几何学_第5页
免费预览已结束,剩余9页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【精品】三维坐标系和几何学三维坐标系和几何学类型:转贴|来源:整理|时间:2022-06-12下面我们将介绍在编制立即模式程序之前需要了解的一些技术上的概念.他并不是对较宽层面上的详细描述,也不是对Direct3D的组成局部的深入分析.要了解更多的有关信息,可以观察“ Direct3D立即模式的体系结构和“ Direct3D立 即模式的要素两局部内容.如果你已经对编制三维图形程序有一定经验,可以浏览一下以下的内容,了解一些Direct3D所特有的东西.这些内容分为以下两个局部:三维坐标系和几何学(3-D Coordinate Systems and Geometry)矩阵和变换(Matrice

2、s and Transformations)一 (3-D坐标系统和几何学编制Direct3D应用程序要对三维几何学的一些根本内容有一定的了解.这与局部我们将介绍一些重要的有关创立三维场景的几何学概念,分为以下几个局部:3-D 坐标系统(3-D Coordinate Systems)3-D 图元(3-D Primitives)三角光栅准那么(Triangle Rasterization Rules)明暗处理(Shading)1.3-D坐标系统一般来说,3-D图形应用程序使用两种类型的笛卡尔坐标系统:即左手坐标系统 (left-handed) 和右手坐标系统(right-handed).在这两种坐

3、标系统中,x-轴正方 向均指向右边,y-轴正方向也都指向上方.z-轴的方向可以用左、右手定那么来确定,即握起左或右手的四指来代表由x-方向旋转到y-方向,那么左或右手的拇指就指向z-轴的正方向.如下列图:Direct3D中使用的是左手坐标系统.如果你的程序使用的是右手坐标系统,那么你只需要对Direct3D的数据做两个很小的修改:改变三角形顶点的顺序,使它们从前面来看根据顺时针的方向排列.换句话说,如果顶点是 v0、v1、v2,那么传递给 Direc3D的是v0、v2、v1.使用视矩阵view matrix来对世界空间进行调整,即将 z-方向调整为-1.这 样就需要改变D3DMATRI玷构体的

4、_31、_32、_33和_34成员的正负号,它们被用 于视矩阵之中.要注意的是,还有其它许多种用于 3-D软件的坐标系统.左手和右手系统只是 其中最常用的两种.然而在三维造型程序中,y-轴指向或背离观察者,z-轴朝上的坐标系统也经常被采用.既然如此,右手系统中通常将任意一个正坐标方向x、y或z指向观察者.左手系统那么通常将任意一个坐标的负方向指向观察者.如果你 所使用的左手坐标系统中z-轴指向上方,那么除了前面所说的之外,你还需要对 所有的顶点数据进行旋转.对三维坐标系统中定义的对象,一些根本的操作包括:平移translate,旋转rotate,和缩放scale.你可以将这些根本的变换组合起来

5、建立一个变化矩 阵,想要进一步的了解有关内容,请注意“3 -D变换局部.要记住的是,将这些操作组合在一起的顺序是很重要的,组合顺序的不同,得 到的结果也会不同2 . 3-D图元一个3-D图元就是一些顶点的集合,它们组成了一个三维实体.最简单的图元就是一个三维坐标系统中的点的集合,在 Direc3D中我们称为顶点列表(point list).通常,三维图元都是多边形.Direct3D中的多边形是一个封闭的三维图形,它至少由三个顶点组成.最简单的多边形是一个三角形.Direct3D用三角形来组成大多数的多边形,这是由于一个三角形的三个顶点保证是共面的.渲染非共面的顶点是很困难的.我们可以用三角形来

6、组成更大的更复杂的多边形和多面体(mesh)下方的左图显示了一个立方体.立方体的每一个面由两个三角形组成.这些三角形一起组成了一个立方体图元.你可以在图元的外表上使用材质和纹理,这样就 使它更象一个实心的物体.要了解更多有关的内容,注意“材质和纹理局部.你也可以使用三角形来构造一个外表由平滑曲面组成的图元.上方的右图展示 了一个由三角形构成的球体.使用了材质之后,这个球体的外表看起来会更平滑.如果再使用Gouraud明暗处理方法,它会更加逼真.3 .三角光栅准那么通常,用来表示顶点的点不会和屏幕上的像素很好的吻合.这时, Direct3D会 使用三角光栅准那么来决定将那些像素用来显示一个给定的

7、三角形.Direct3D使用左上角填充约定(top-left filling convention),这与应用于GDI和OpenG中的矩形的约定是一致的.在 Direct3D中,我们用像素的中央点来进行判决.当中央点在一个三角形内部时,这个像素就被判定为属于这个三角形.像素的中央点的坐标值都是整数.Direct3D中所使用的这一三角光栅准那么并不一定被所有的硬件所使用.经过测试我们会发现,这些约定在执行时会有一些细小的差异.下面左图中显示了一个矩形,它的左上角坐标为 0, 0,右下角坐标为5, 5.这个三角形填充了 25个像素,它的宽为右侧坐标减去左侧坐标,高为底边坐 标减去顶边坐标.在左上角

8、填充约定中,“上一词代表水平跨度span在竖直方向上的位置,“左 一词那么代表一个跨度内像素的水平位置.如果一条边不是水平的话,那么它 就不能被称为一个顶部边缘top edge,这样一来,大多数的三角形就都只有左侧 和右侧边缘了left and right edges .如上面右图所示.当一个三角形的边穿过像素的中央时,也由左上角填充规那么来进行判决.左图显示了两个三角形,一个位于0, 0 , 5, 0,和5, 5,另一个位于0, 5 , 0,0,和5, 5.第一个三角形占据了 15个像素,而第二个三角形占据了10个像素.这是由于两个三角形的公共边是第一个三角形的左侧边缘.我们来举个例子,如果

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

10、 充准那么.这个矩形中的大多数像素就会骑跨在两个或更多的三角形的边界上,如上 面右图所示.对这两个矩形来说,相同的像素都要受影响明暗处理Shading 4.这一局部我们将讨论Direct3D明暗处理的有关内容.4.1 明暗处理模式Shade Modes4.2 各种模式的比拟 Comparing Shading Modes4.3 设置明暗处理模式 Setting the Shade Mode4.4 面和顶点法向量 Face and Vertex Normal Vectors4.5 三角形内插 Triangle Interpolants4.1 明暗处理模式渲染多边形时所采用的明暗处理模式对于多边形

11、的外观有很大的影响.明暗处理模式决定了一个多边形的外表上任意一点的颜色和光线的强度.Direct3D目前支持两种明暗处理模式:平面明暗处理模式(Flat Shading)Gouraud 明暗处理模式(Gouraud Shading)1.1 .1平面明暗处理模式使用平面明暗处理模式来渲染一个多边形时,Direct3D的渲染管道(renderingpipeline)使用多边形上第一个顶点的材质的颜色来作为整个多边形的颜色.使用 平面明暗处理模式进行渲染的三维对象,在相邻的不共面的两个平面之间,会出现 较明显的边缘.下列图显示了一个采用平面明暗处理模式进行渲染的茶壶的图片.图片中,每一 个多边形的轮

12、廓都非常清楚.平面明暗处理模式所要使用的计算量是两种明暗处理 模式中最小的.1.2 .2 Gouraud明暗处理模式使用Gouraud明暗处理模式渲染一个多边形时,Direct3D利用顶点法线(vertex normal) 和灯光参数(lighting parameters)来计算每个顶点的颜色.然 后,在多边形的外表上进行线性内插运算(见“边面和顶点法向量局部).举例来 说,如果顶点1的红色值为0.9,顶点2的红色值为0.4,使用Gouraud明暗处理 模式和RGBfe彩模式,那么这两个顶点问连线的中点的的红颜色的值就是 0.6.下列图中显示了使用Gouraud明暗处理模式的效果.图中的茶壶

13、由许多小的三角形平面所组成.然而Gouraud明暗处理模式使得它的外表看起来非常的平滑和完 整.Gouraud明暗处理模式也可以用来显示具有明显边缘的对象.具体细节见“表面和顶点法向量局部.1.3 明暗处理模式的比拟在平面明暗处理模式中,下列图中的金字塔的相邻两个面之间会有明显的边缘.而采用Gouraud明暗处理模式时,边缘处的明暗值会由内插运算产生,因而最后会 得到一个弯曲的外表.使用Gouraud明暗处理来照亮平坦的外表要比使用平面明暗处理模式更加真实.平面明暗处理模式中的同一个面的颜色是相同的,而Gouraud处理模式允许光线在外表上有更逼真的效果.当离一个外表很近的地方有一个点光源时,

14、它们的区 别将会更明显的表现出来.Gouraud模式会将在平面处理模式中明显的边缘平滑掉,然而这样可能会导致马赫带效应(Mach bands)的产生,也就是相邻的颜色或光线带之间不能很平滑的相 互融合.对于程序开发人员来说,可以通过增加构成对象的多边形的数目来降低马 赫带效应,当然也可以通过提升屏幕分辨率,或者增加程序的颜色深度来到达目 的.使用Gouraud模式可能会丧失一些细节.下列图的例子显示了这一情况,图中的 聚光灯完全位于一个多边形外表上.这样,当Gouraud模式在两个顶点间进行内插的同时,也就将聚光灯一同丧失了;渲染出来的外表将不再有聚光灯.1.4 设置明暗处理模式Direct3

15、D允许每次选中一种明暗处理模式.缺省情况下为Gouraud模式.可以通过调用IDirect3DDevice3:SetRenderState 方法来改变模式.dwRenderStateType 参数应该被设定为 D3DRENDERSTATE_SHADEMODE dwRenderState参数应该被设定为D3DSHADEMODE类型的一个成员.下面的代 码显示了如何来设定当前的明暗处理模式./ Set to flat shading./ This code fragment assumes that lpDev3 is a valid pointer to/ an IDirect3DDevice3

16、 interface.hr = lpDev3->SetRenderState(D3DRENDERSTATE_SHADEMOD3D SHADE_FLAT);if(FAILED(hr)/ Code to handle the error goes here./ Set to Gouraud shading (this is the default for Direct3D).hr = lpDev3->SetRenderState(D3DRENDERSTATE_SHADEMODE,D3DSHADE_GOURAUD);if(FAILED(hr)/ Code to handle the er

17、ror goes here. 1.5 面和顶点法向量一个多面体的每一个面都有一个与这个面正交的法向量.这个向量的方向由构 成面的顶点的组成顺序以及所使用的坐标系统来决定.面的法线总是远离这个面的 正面一侧,即由这个面的正面一侧开始指向向外的方向.在 Direct3D中,只有面 的正面一侧是可见的.面的正面也就是指,从这一侧来看面上的顶点根据顺时针方任何一个面只有正面和反面两个面.Direct3D是不对反面进行渲染的,因此反面可以说被Culling掉了(be culled).(如果需要的话,可以改变 Culling模(culling mode) 来对反面进行渲染.纤细内容见“ Culling状态

18、局部.)Direct3D程序不需要对面法向量进行声明;当需要用到它们时,系统会自动进行计算.在平面明暗处理模式中,我们会用到面法向量.而在 Gouraud模式中,Direct3D使用顶点法向量(vertex normal).它还使用顶点法向量来限制灯光纹理效果Direct3D程序通常使用顶点的D3DVERT改型.D3DVERT琢构的成员用来描述顶点的位置和方向.这里的方向就是指顶点的法向量.下面的代码显示了如何来设置顶点的各种值,包括顶点法向量.其中法向量指向位于世界坐标系的原点 的视0 (viewport).这个例子中顶点的位置就位于世界坐标系中.D3DVERTEX lpVertices3;

19、/ A vertex can be specified one structure member at a time.lpVertices0.x = 0;lpVertices0.y = 5;lpVertices0.z = 5;lpVertices0.nx = 0; / X component of the normal vector.lpVertices0.ny = 0; / Y component of the normal vector.lpVertices0.nz = -1; / Points the normal back at the origin.lpVertices0.tu =

20、0; / Only used if a texture is being used.lpVertices0.tv = 0; / Only used if a texture is being used./ Vertices can also by specified on one line of code for eachvertex/ by using some of the D3DOVERLOADS macros.lpVertices1 = D3DVERTEX(D3DVECTOR(-5,-5,5),D3DVECTOR(0,0,-1),0,0);lpVertices2 = D3DVERTEX

21、(D3DVECTOR(5,-5,5),D3DVECTOR(0,0,-1),0,0);使用Gouraud模式时,Direct3D用顶点法向量来计算光源和外表之间的夹角它还计算顶点的颜色和亮度,并且在原先的外表上通过内差运算来得到其它点 上的值.Direct3D是通过夹角来计算亮度值.夹角越大,外表上光线的亮度就越 小.如果你所创立的对象的外表是平坦的,那么顶点的法向量就应该与对象的外表正交.下列图向我们显示了这一情况.图中平坦的外表由两个三角形构成.所有 顶点的法向量都与外表正交一般情况下,我们所创立的对象都是由许多的小的三角带(triangle strip)组成的,并且这些三角形往往是不共面的

22、.这样,在我们在对对象的外表进行平滑的明暗处理时,就有一种简单的方法来得到各个顶点的法向量.我们可以先来 计算每一个小多边形平面的法向量,而顶点的法向量就是与这些小平面的法向量的夹角相等的那一个向量.要注意的是,对于复杂的图元,这种方法可能不够有效.下面左图中向我们演示了这种方法,图中由两个面,S1和S2,我们看到的是们的侧面.S1和S2的法向量用蓝色表示.顶点的法向量用红色表示.我们可 以看至1J,顶点法向量与S1和S2的面法向量的夹角是相等的.使用 Gouraud明暗处理模不再有明显的边缘或棱角0如果顶点的法向量偏向任何一个面,会使外表上的亮度增加或减少,而这又由 它与光源之间的夹角来决定.上面右图的例子显示了这一情况.图中我们还是只能看到两个面的侧面,并且顶点的法向量偏向S1 一侧,这样就使它与光源的夹角比正常情况下有所减小.在使用Gouraud明暗处理模式时,我们也可以使一些对象具有锋利的边缘.如 果正在使用执行缓冲(execute buffers),那么程序就需要对边缘上的点的法向量 制作一个副本,如下列图所示,我们可以看到,位于锋利边缘的点的法向量都有两 个.如果使用 IDirect3DDevice3:DrawPrim市ve或IDirect3DDevice3:DrawIndexedPrimitive方法来

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论