资源预览内容
第1页 / 共108页
第2页 / 共108页
第3页 / 共108页
第4页 / 共108页
第5页 / 共108页
第6页 / 共108页
第7页 / 共108页
第8页 / 共108页
第9页 / 共108页
第10页 / 共108页
亲,该文档总共108页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第九章 3D基本算法结束本 章 重 点n9-1 3D坐标系n9-2 坐标矩阵n9-3 投影转换n9-4 裁剪n9-5 隐藏面消除第九章 3D基本算法结束9-1 3D坐标系n坐标转换的作用是用来产生对象让我们可以看到,其中不同的坐标系统所呈现出来的方式会有所不同,如同我们以不同的角度去观看一个特定的目标,以不同角度所看到的对象显示效果会有所不同。 第九章 3D基本算法结束9.1.1 坐标转换n坐标系统必须要有一个基本的原点位置,从原点再延伸出去两个或三个坐标轴,形成一个特定的空间,这个空间即是我们所谓的2D空间或3D空间。第九章 3D基本算法结束n如果在空间中形成了两个以上的坐标系统,我们就必须要使用其中的一个坐标系统来描述其它不同的坐标系统,这些不同的坐标系统必须要经过一些特殊的转换才能让这个坐标系统所接受,而这种转换的过程我们就称为坐标转换。第九章 3D基本算法结束9.1.2 Model坐标系统n即是物体本身中的坐标环境,物体本身也有一 个原点坐标,而物体其它的参考顶点是由原点 所衍生出来的,如下图所示:第九章 3D基本算法结束9.1.3 World坐标系统n在3D的世界里,有几个目标物体就会有几个Model坐标系统,而这些Model坐标又不能表示自己在3D世界里的真正位置,所以必须再定义出另外一个可供3D世界里的物体参考之坐标系统,并且使得所有的物体可以正确地被摆放自己应该的位置坐标上,这种另外再定义出来的坐标系统则称为World坐标系统。第九章 3D基本算法结束9.1.4 View坐标系统n当我们有了物体本身的Model坐标系统与能够表现物体在3D世界的位置坐标之World坐标系统,接下来必须要有一个观看上述两者的坐标系统,这样屏幕的显示才会有依据,而这个可以观看的坐标系统我们称为View坐标系统。 第九章 3D基本算法结束9.1.5 坐标转换n在3D世界中,坐标转换过程是相当复杂 的,它必须经过4个不同的转换步骤,最 后才能显示在屏幕上,这才是我们所要 的画面。流程:Model坐标系统World坐标系统View坐标系统投影空间坐标Projection transform最后的二维坐标DispalyViewport 参数第九章 3D基本算法结束9-2 坐标矩阵 n矩阵的表示方式是以4*4矩阵来呈现的, 因为这种矩阵的表现方式可以用来表示 平移、旋转及缩放等三种转换功能,而 这就已经包含了3D世界的转换型式了。 这一种矩阵的运算对象及所产生的结果 坐标,我们称之为齐次坐标 (Homogeneous Coordinate)。第九章 3D基本算法结束9.2.1 齐次坐标n齐次坐标具有四个不同的元素,简称四元素,其表示法为(x,y,z,w),如果将齐次坐标表示成3D坐标的话,其表示法则为(x/w,y/w,z/w)。通常w元素都会被设成1。nW用意是用来表示一个比例因子。第九章 3D基本算法结束9.2.2 矩阵平移(Translation) n即是物体在3D世界里向着某一个向量方 向移动,如下图 第九章 3D基本算法结束n矩阵平移运算的表示法如下列所示:第九章 3D基本算法结束9.2.3 矩阵旋转(Rotation) n定义是3D世界里的某一个物体绕着一个 特定的坐标轴旋转,如下图所示: 第九章 3D基本算法结束n绕着x轴旋转 第九章 3D基本算法结束n绕着y轴旋转 第九章 3D基本算法结束n绕着z轴旋转 第九章 3D基本算法结束XY(x,y)a(x,y)Y=r*sin(a+ )=r*sina*cos +r*sina*cos* =x*cos +y*cos 第九章 3D基本算法结束9.2.4 矩阵缩放(Scaling) n即是物体沿着某一个轴进行一定比例缩 放的运算。如下图所示:物体向着X轴放大第九章 3D基本算法结束n矩阵的表示法如下列所示:希腊字母 伊塔 第九章 3D基本算法结束9.2.5 矩阵的结合律 n平移矩阵为A、旋转矩阵为B、缩放矩阵为C,而原来的顶点坐标为K、最后得到的顶点坐标为K,其矩阵相乘的公式如下列所示:K=CBAK第九章 3D基本算法结束n其实我们可以将这种特定的矩阵相乘过程简化,因为矩阵相乘的运算是可以符合数学上所说的结合律,也就是将A、B、C三个矩阵先结合成另一个矩阵,如下:=CBA K=K第九章 3D基本算法结束9.2.6 Direct3D矩阵n在Direct3D定义里,矩阵被宣告成一个名 为D3DMATRIX的数据结构,如下:typedef struct _D3DMATRIX union struct float _11, _12, _13, _14; float _21, _22, _23, _24; float _31, _32, _33, _34; float _41, _42, _43, _44; float m44; ; D3DMATRIX; 第九章 3D基本算法结束#define D3D_OVERLOADS #include D3DMATRIX mat;/下面三种表示方式的意思都是一样的 mat._13 = 0.8f; mat13 = 0.8f; mat(1,3) = 0.8f;索引值从“0”开始,先row,后col第九章 3D基本算法结束n如果我们要建立一个平移的矩阵,其表 示法如下图所示: 第九章 3D基本算法结束n在程序代码里,我们就可以将它编写成 如下列所示: D3DMATRIX mat = 1, 0, 0, D3DVAL(4.0) 0, 1, 0, D3DVAL(8.0) 0, 0, 1, D3DVAL(16.0) 0, 0, 0, 1 ;第九章 3D基本算法结束9.2.7 向量表示法 n在Direct3D定义里,向量被声明成一个 名为D3DVECTOR的数据结构,如下列 所示:typedef struct _D3DVECTOR float x; float y; float z; D3DVECTOR;第九章 3D基本算法结束矩阵相乘/将矩阵pM1与矩阵pM2相乘之后的结果传给矩阵pOut D3DXMATRIX* D3DXMatrixMultiply(D3DXMATRIX* pOut,CONST D3DXMATRIX* pM1,CONST D3DXMATRIX* pM2 );基本的矩阵及向量运算函数第九章 3D基本算法结束向量相乘 /将向量pV1与向量pV2相乘之后的结果传给向量pOut D3DXVECTOR3* D3DXVec3Cross(D3DXVECTOR3* pOut,CONST D3DXVECTOR3* pV1,CONST D3DXVECTOR3* pV2 );基本的矩阵及向量运算函数第九章 3D基本算法结束两个向量进行dot product的运算 FLOAT D3DXVec3Dot(CONST D3DXVECTOR3* pV1,CONST D3DXVECTOR3* pV2 );基本的矩阵及向量运算函数第九章 3D基本算法结束计算向量的长度 FLOAT D3DXVec3Length(CONST D3DXVECTOR3* pV );基本的矩阵及向量运算函数第九章 3D基本算法结束计算向量的单位向量 D3DXVECTOR3* D3DXVec3Normalize(D3DXVECTOR3* pOut,CONST D3DXVECTOR3* pV );基本的矩阵及向量运算函数第九章 3D基本算法结束向量相加 D3DXVECTOR3* D3DXVec3Add(D3DXVECTOR3* pOut,CONST D3DXVECTOR3* pV1,CONST D3DXVECTOR3* pV2 );基本的矩阵及向量运算函数第九章 3D基本算法结束9-3 投影转换 n将三维的坐标系统转换成二维的坐标,并将3D世界里的坐标单位映像到2D屏幕的坐标单位上,才能在计算机屏幕上看到所谓的3D世界,而这整个转换的过程我们称之为投影。第九章 3D基本算法结束9.3.1 平行投影 n当我们省略掉三维空间里的一维元素之后,我们就可以得到了一个平行投影的图形坐标,在这个时候,三维空间中的所有顶点都会从三维空间映像到2D平面的并行线上,因此我们就称这种方式为平行投影。 第九章 3D基本算法结束n平行投影第九章 3D基本算法结束n我们可以在投影线与投影面交叉角度的基础上更进一步地细分平行投影。如果交叉的角度是直角的话,我们则称之为正交投影(orthographic);不是直角的话,我们则称为倾斜投影(oblique)。第九章 3D基本算法结束9.3.2 透视投影 n透视投影所建立出来的对象投影图像之 大小必须依赖对象与观察者的距离。 第九章 3D基本算法结束第九章 3D基本算法结束n原点与图像上的顶点相联系之关系。如 下图所示:第九章 3D基本算法结束无深度投影具深度投影第九章 3D基本算法结束n焦点距离越小则视角宽度越广,而焦点 距离越大则视角宽度越窄。第九章 3D基本算法结束9-4 裁剪 n2D裁剪n裁剪是对于某种图形做出修剪的动作,其目的是为了让看不见的顶点不加以描绘,以提升执行的速度。 第九章 3D基本算法结束第三种剪裁 法第二种剪裁法第一种剪裁法第九章 3D基本算法结束线段的裁剪 n线段裁剪的方法可以分析图形的相对约束位置,并且找出符合这一点的图形部分。在线段裁剪的情况下,它需要找出其交叉点或线段与裁剪边界的交叉点,通常不是直接就能够把这种交叉发生的地方看得一清二楚的。如下图所示:第九章 3D基本算法结束n在光栅处理阶段之前,先进行裁剪处理 ,适合处理简单的图形单位。(如多边 形)n在光栅处理阶段同时进行,适合于复杂 图形。n当裁剪区域中几何结构比较复杂时,选 择较大的Buffer光栅图形。然后在Buffer 中选择在该复杂裁剪区域内部的图形。第九章 3D基本算法结束n光栅处理:投影转换把物体图形坐标从 3D空间映射到屏幕的2D空间,这些图形 必须在2D空间中被绘制,使观察者可见 。既然我们考虑的是由一系列整齐地镶 嵌的小方块组成的光栅图形,因此我们 要确定这种几何像素的模拟描述要如何 能够被正确地转换成一系列的离散图形 ,而这种过程我们称之为“光栅处理”( rasterization)第九章 3D基本算法结束9.4.2 点的裁剪n点的裁剪可以利用这4个有限线段的约束 来检查点的坐标是否应该要被裁剪。第九章 3D基本算法结束9.4.3 线段的裁剪n我们可以将线段的裁剪扩展到上述方法 ,然而增加内循环的复杂性。n这种线段裁剪方法可以分析图形的相对 约束位置,并且找出符合这一点的图形 部分。在线段裁剪的情况下,它需要找 出交叉点或线段与裁剪边界的交叉点, 通常不是直接就能够把这种交叉的地方 看清楚。如下图:第九章 3D基本算法结束剪裁线剪裁线第九章 3D基本算法结束剪裁线剪裁线第九章 3D基本算法结束区域外编码(region out code)第一步,区域编码 延长窗口边界,将 平面分成9个区域 ,每个区域用4位 二进制代码表示, 称为区域码。其作 用是识别点相对于 裁剪窗口边界的位 置。约定4位码中最右边一位为第1位,则编码规则如下:100000001001101000010010010101000110leftrightabovebelow第九章 3D基本算法结束第二步 ,建立线段端点的区域编码。设(x,y)是线段端点的坐标,则第1位取的符号位 。第2位取的符号位。第3位取的符号位。第4位取的符号位。第三步,判断线段与窗口间的位置关系。(1)若线段两端点的编码均为“ 0000”, 则线段全部位于窗口内。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号