1、4 图形变换,杨 钦 (博士)教授 电话:82316283 Email: 助教:硕士研究生,2003年3月17,图形变换,4 图形变换,4.1图形变换的数学基础 4.2图形的几何变换 4.3显示变换 4.4图形显示的流程 4.5图形显示中的裁剪问题 4.6OpenGL的坐标变换机制,2003年3月17,图形变换,4.1图形变换的数学基础,矢量、点和欧氏空间 坐标系和坐标 矩阵与坐标变换 齐次坐标的引入,2003年3月17,图形变换,矢量,矢量具有确定的方向和大小(长度) 矢量是流动的,无位置概念 矢量的运算 C=A+B, B=2A,2003年3月17,图形变换,矢量,点表示空间中的一个位置 点
2、和另一个点相减得到一个矢量 v=P-Q 矢量和点相加得到另一个点 P=Q+v 点和矢量都是客观实在,2003年3月17,图形变换,欧氏空间,点乘 a=u 。v (a为实数,u、v为矢量) 0 。0=0 如果u 。v=0,则称u和v垂直 矢量的长度|v|, |v|2=v 。v,2003年3月17,图形变换,欧氏空间,投影 u 。v =|u|v|cos( ) 矢量乘 n=uxv,|n|=|u|v|sin( ) 由右手法则确定方向,2003年3月17,图形变换,坐标系和坐标,为了描述矢量和点引入坐标系 在3维空间,给出三个线性无关的矢量v1、v2、v3 则任意一个矢量w可以表示为: w= a1v1+
3、a2v2+a3v3 , (a1a2a3为实数) 因此,可以将矢量w记为a(a1,a2,a3),2003年3月17,图形变换,坐标系和坐标,在三维空间给定一个点P0和三个线性无关的矢量v1、v2、v3 则,空间中任何一个点P可以表示为: P= P0 + a1v1+a2v2+a3v3 ,(a1a2a3为实数) 称点P的坐标为(a1,a2,a3) 写成矩阵形式为: P=P0+ (a1,a2,a3)( v1、v2、v3 )T,2003年3月17,图形变换,坐标系之间的变换,已知 坐标系I:原点Q0,坐标轴 u1,u2,u3 坐标系II:原点P0 ,坐标轴v1,v2,v3 Q0在坐标系II的坐标为:q1
4、,q2,q3,2003年3月17,图形变换,坐标系之间的变换,写成矩阵形式: Q0=P0 + q1,q2,q3 v1,v2,v3 T u1,u2,u3 T =M v1,v2,v3 T 其中:,2003年3月17,图形变换,坐标系之间的变换,对于空间中的任一个点D ,如果已知D点在坐标系II中的坐标为d1d2d3 则: D= P0+ d1d2d3 v1,v2,v3 T= Q0 -q1q2q3 v1,v2,v3 T +d1d2d3 v1,v2,v3 T= Q0 +(d1d2d3- q1q2q3 )M -1u1,u2,u3T 所以,D点在坐标系I中的坐标为 (d1d2d3- q1q2q3 )M -1
5、,2003年3月17,图形变换,齐次坐标的引入,对于三维空间中的点,其坐标用三个实数表示,如:(X,Y,Z)。 还可以用四个实数来表示一个点的坐标,写为:(X,Y,Z,W),其中W不能为0。 该坐标与(X/W,Y/W,Z/W)等价。 这样做有许多方面的好处: 1、很容易表示无穷远点 2、容易用矩阵与矢量乘的方法表示点的平移操作,以便简化计算过程。,2003年3月17,图形变换,齐次坐标的引入,例一: 式子P= P0 + a1v1+a2v2+a3v3的简化: 非齐次坐标: P= P0 + a1,a2,a3 v1,v2,v3 T 齐次坐标:,2003年3月17,图形变换,2003年3月17,图形变
6、换,2003年3月17,图形变换,齐次坐标的引入,将关系式简化为:,2003年3月17,图形变换,齐次坐标的引入,对于空间中的任一个点D ,如果已知D点在坐标系II中的坐标为d1d2d31 D= d1d2d31 v1,v2,v3 ,P0 T= d1d2d31M-1 u1,u2,u3 ,Q0 T 推导过程也变得简单了 Q=q1,q2,q2,1 u1,u2,u3 ,Q0 T= q1,q2,q2,1Mv1,v2,v3 ,P0 T,2003年3月17,图形变换,4.2图形的几何变换,图形几何变换的目的 平移、旋转、缩放 变换的组合,2003年3月17,图形变换,图形几何变换的目的,改变图形的 位置、
7、方向、 大小,2003年3月17,图形变换,平移(Translation),P=P+D ,其中D=ax,ay,az,0 P=px,py,pz,1 P= px,py,pz,1 写成矩阵与矢量的乘法P=TP,2003年3月17,图形变换,缩放(scaling),P=SP,2003年3月17,图形变换,旋转(rotation),P=RP,2003年3月17,图形变换,几何变换的组合,2003年3月17,图形变换,4.3显示变换,三维图形显示的物理模型 透视投影变换 平行投影变换 视口变换 视坐标系与视变换 三维图形的显示流程 视口到三维空间的反变换,2003年3月17,图形变换,三维图形显示的模型,
8、视景体(圆台、四棱台),2003年3月17,图形变换,三维图形显示的模型,视景体的参数,2003年3月17,图形变换,三维图形显示的模型,上方矢量,2003年3月17,图形变换,三维图形显示的模型,前后裁剪面,2003年3月17,图形变换,三维图形显示的模型,视角的影响,2003年3月17,图形变换,三维图形显示的模型,视口长宽比例的影响,2003年3月17,图形变换,三维图形显示的模型,平行投影的显示模型,2003年3月17,图形变换,透视投影变换,2003年3月17,图形变换,透视投影变换,X/X=Y/Y=Z/dX=Xd/Z Y=Yd/Z Z=d透视投影变换矩阵:,2003年3月17,图形
9、变换,平行投影变换,2003年3月17,图形变换,视口变换,X/W= (X+W/2) /W X=XW/W+W/(2W) (H-Y)/H=(Y+H/2)/H Y=-YH/H+H-H/(2H)W/W 0 0 W/(2W) M= 0 -H/H 0 H-H/(2H)0 0 1 00 0 0 1,W,H,2003年3月17,图形变换,视坐标系与视变换,给定视坐标系: (Ex,Ey,Ez),(Ax,Ay,Az),(px,py,pz) E 视点 A 被观察点 p向上方向矢量 n=(E-A)/|E-A| u=(pXn)/|pXn| v=nXu,2003年3月17,图形变换,4.视坐标系与视变换,u= (ux,
10、uy,uz,0) v= (vx,vy,vz ,0) n= (nx,ny,nz,0) E= (Ex,Ey,Ez,1)CN=(u,v,n,E)T , CO=(X,Y,Z,O)T , CN=M X CO CO=M-1XCN,M=,ux uy uz 0 vx vy vz 0 nx ny ny 0 Ex Ey Ez 1,D= (Dx,Dy,Dz,1)XCO= (Dx,Dy,Dz,1) M-1XCN (Du,Dv,Dn,1)=(Dx,Dy,Dz,1) M-1 (Du,Dv,Dn,1) T = (M-1)T(Dx,Dy,Dz,1) T 视变换矩阵 (M-1)T,2003年3月17,图形变换,4.4图形显示的
11、流程,设一个点的世界坐标系下坐标为:P 设世界坐标向视坐标变换的矩阵为:T视 设投影矩阵为:T投 设视口变换矩阵为:Tw 则:Pw= Tw T投T视P, 令T= Tw T投T视,则: Pw=TP,2003年3月17,图形变换,4.5图形显示中的裁剪问题,视景体 三维图形显示过程中的裁剪 平面裁剪算法(自学) 三维裁剪算法(自学),2003年3月17,图形变换,4.6OpenGL的坐标变换机制,有关的数据结构 ModelView变换机制 Model变换的使用方法 View的变换使用方法 Project的使用方法 显示流程,2003年3月17,图形变换,有关的数据结构,两个坐标变换矩阵(4X4)
12、ModelView矩阵 GL_MODELVIEW Projection矩阵GL_PROJECTION glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_PROJECTION); 两个用于存储矩阵的堆栈: ModelView矩阵堆栈 Projection矩阵堆栈,2003年3月17,图形变换,ModelView变换机制,Model变换的目的是改变物体的位置和尺寸 View变换的目的是改变观察的方向 以上两个目的是用一个手段来实现的,即:操作ModelView矩阵,2003年3月17,图形变换,Model变换的使用方法,首先使以下函数,表示开始操作ModelV
13、iew矩阵 glMatrixMode(GL_MODELVIEW); 操作ModelView 矩阵进行Model变换的方法分两类: glLoadIdentity(); glLoadMatrixf(*m); glMultMatrixf(*m);glTranslatef(dx,dy,dz); glRotatef(angle,vx,vy,vz); glScalef(sx,sy,sz);,2003年3月17,图形变换,View变换的使用方法,可以使用上述所有函数来设值观察方向 利用以下函数则更方便: gluLookAt(ex, ey, ez, ax, ay, az, px , py , pz); e视点
14、 a被观察点 p向上方向,2003年3月17,图形变换,平行投影的使用方法,投影矩阵 首先必须使用下面的函数进入投影矩阵模式 glMatrixMode(GL_PROJECTION); 可以直接设值投影矩阵的值来进行投影,但一般使用下面的函数设值投影矩阵: glOrtho(xmin,xmax,ymin,ymax,near,far); glFrustum(xmin,xmax,ymin,ymax,near,far); gluPerspective(fovy,aspect,near,far);,2003年3月17,图形变换,glOrtho(xmin,xmax,ymin,ymax,near,far);,2003年3月17,图形变换,glFrustum(xmin,xmax,ymin,ymax,near,far);,2003年3月17,图形变换,gluPerspective(fovy,aspect,near,far);,2003年3月17,图形变换,OpenGL执行的次序OpenGL程序编程的次序 、操作投影矩阵,设置投影方式和参数(视坐标系窗口坐标) 、操作ModelView矩阵,设置观察方向和参数(世界坐标视坐标) 、操作ModelView矩阵,设置物体的位置(局部坐标世界坐标) 、给出待绘制物体的坐标(在局部坐标系下的坐标),显示流程,