《三维图形变换- 实验室研究方向讲课资料》由会员分享,可在线阅读,更多相关《三维图形变换- 实验室研究方向讲课资料(116页珍藏版)》请在金锄头文库上搜索。
1、三维图形变换,耿卫东 陈为 浙江大学CAD /分量形式 ; float v3; / 数组形式 ; Point3() ; /缺省构造函数 Point3 (float X, float Y, float Z) /带参构造函数 x = X; y=Y; z=Z / 更多 ;,Plane3数据结构,struct Plane3 Point3 n; / 平面法向 float d; /原点垂直法向距离 Plane3() /缺省构造函数 plane3(float nX,float nY, float nZ, float D) n(nX, nY, nZ); d=D /更多: 从三点构在一个平面,从多边形构造一个平
2、面等等 ;,struct matrix4 union struct float _11,_12,_13,_14; float _21,_22,_23,_24; float _31,_32,_33,_34; float _41,_42,_43,_44 ;/分量表示 float m44;/矩阵表示 ; /带参构造函数 matrix4 (float IN_11, float IN_12, float IN_13, float IN_14, float IN_21, float IN_22, float IN_23, float IN_24, float IN_31, float IN_32, flo
3、at IN_33, float IN_34, float IN_41, float IN_42, float IN_43, float IN_44) _11=IN_11; _12=IN_12; _13=IN_13; _14=IN_14; _21=IN_21; _22=IN_22; _23=IN_23; _24=IN_24; _31=IN_31; _32=IN_32; _33=IN_33; _34=IN_34; _41=IN_41; _42=IN_42; _43=IN_43; _44=IN_44; ;,Matrix4数据结构,三维变换,一个变换通常用4x4矩阵表示. 对一个点或者向量进行变换等价
4、于将一个矩阵乘以该点或向量的齐次坐标. 向量的嵌套: 如矩阵乘法,左手坐标系-右手坐标系,右手坐标系:当右手四指沿x轴至y轴方向握紧,拇指所指的方向即为+z方向(缺省坐标系) 左手坐标系:判断方法类似,用左手,平移,利用平移矩阵,将点V=(x,y,z)T平移至V=(x+Tx,y+Ty,z+Tz)T处,表示为V=V+T,缩放,利用缩放矩阵,将点V=(x,y,z)T缩放(d1,d2,d3)倍 其中对角线上的元素表示对应坐标系分别放大(di1)或者缩小了(di1)的量,旋转,矩阵R是旋转矩阵,如果R的转置等于R的逆,即RTR=RRT=I 每个矩阵R对应一单位长度的旋转轴U和旋转角度。该对应并不是唯一
5、的,例如-U也是对应R的旋转轴,绕x轴旋转,当点绕x轴以逆时针方向(从x轴正方向向原点看)旋转角时,旋转矩阵为:,x,y,z,绕y轴旋转,当点绕y轴以逆时针方向旋转角时,旋转矩阵为:,绕z轴旋转,当点绕z轴以逆时针方向旋转角时,旋转矩阵为:,旋转,令 c=cos(q) 且 s=sin(q) 沿X-轴s: 沿Y-轴s: 沿 Z-轴:,矩阵复合,矩阵复合可完成对空间点的任意操作 矩阵乘法不满足交换率,因此复合的次序非常重要! 例如:先缩放后平移先平移后缩放 通常情况下,给出的旋转矩阵是绕原点旋转的。因此首先要将物体平移至原点,进行旋转,再平移回来。,沿平行坐标轴的直线旋转物体,如何得到变换矩阵:
6、将物体平移至原点 绕坐标轴旋转 将物体重新平移至其原先的位置,举例,将盒子绕平行于z轴且经过P=(Tx,Ty,Tz)T点的直线旋转,初始状态,结束状态,举例(续),平移至原点 旋转 再平移回来,变换矩阵,将每一步的基本变换矩阵连接,得到总的变换矩阵,图形流水线中的物体坐标系,建模时所采用的坐标系 选取物体上或靠近物体的某一点作为原点,物体上的其他点相对于该点的坐标进行表示 针对物体的局部坐标系 举例:选取立方体的某一个顶点作为原点,建立局部坐标系,图形流水线中的世界坐标系,全局坐标系 所有物体组成一个场景,场景坐标系称为世界坐标系 所有物体必须变换至该坐标系,以确定彼此之间的相对空间位置 将物
7、体放至场景内等价于定义一个从物体局部坐标系至世界坐标系的变换矩阵 场景需要定义光照,图形流水线中的照相机坐标系统,照相机坐标系统决定照相机参数和可见域 必须包括 视点位置 视线 视点坐标系 投影平面 视域 其他(可选),视点和视线方向,从C沿着N方向看,投影平面,照相机坐标系,视域四棱锥,坐标轴系统,世界坐标系,相机矩阵,投影矩阵,相机坐标,Device coordinates,视区矩阵,窗口坐标,物体坐标,模型矩阵,ModelView 变换,局部物体坐标,世界坐标,相机坐标,设备坐标,窗口坐标系统,投影与裁剪,模型变换,将局部坐标系变换到世界坐标系 包括缩放、旋转、平移等,相机变换,将世界坐
8、标系中的一点变换至照相机坐标系 可以分成平移和旋转两部分,参数确定,用户给出C、N、V,U通过下面的公式计算:U=NXV,则N、U和V组成一个左手坐标系 一般地,用户大致给出V的方向,记为V,(V不需要垂直于N),然后计算V:,投影变换,视域、投影方式、屏幕分辨率 投影物体首先与视域求交决定可见部分,平行投影,透视投影,投影过程,投影:n维空间上一点变换至m(n)维空间 m=n-1且n=3的情况,P,Q,平行投影,将物体从三维场景投影到屏幕 投影矩阵:,Z=0 plane,正交相机模型,透视投影,将物体从三维场景投影到投影平面 投影矩阵:,Z=0 plane,eye,focus,标准透视相机模
9、型(I),标准相机模型,视点与原点重合,视线平行于+z方向,近切割平面z=n0,远切割平面z=f0 视区(投影平面)为一长方体 视域四棱锥四个侧面由下列方程给出:左侧面x=lz/n,右侧面x=rz/n,上侧面y=tz/n,下侧面y=bz/n,投影矩阵,OpenGL,DirectX,透视相机模型(II),透视变换图例,仿射投影,透视变换图例,透视变换图例,透视变换规则,利用相似三角形定理,有: 用齐次坐标表示:,透视变换矩阵,给定 其中,背面剔除,将多边形的朝向与视点或投影中心相比较,去除那些不可见多边形 可见性测试在视见空间内进行。计算每一个多边形的法向,并检查法向与视线方向点积后值的符号,背
10、面剔除,如果法向指向物体外部,则可见性的判断条件为: 其中Np为法向,N为视线方向,视域体裁剪,当且仅当视域体内的物体将被投影. 决定物体的哪一部分将被投影,哪一部分被剔除的过程叫做裁剪.,Z=0 plane,视域体裁剪,三维物体裁剪,用视域四棱锥对物体进行裁剪 把一个多边形相对于视域四棱锥的每个裁剪面进行裁剪测试 在齐次坐标系中,视域四棱锥的六个裁剪面为:,三维物体裁剪,采用三维Sutherland-Hodgman裁剪算法 最终分解为线段与平面的求交的基本问题 根据多边形顶点的坐标,很容易判断出顶点位于裁剪面的内侧还是外侧,若求取直线与裁剪面的交点,只需把直线方程代入裁剪面方程即可,视域四棱
11、锥裁剪(二维示例),视域四棱锥裁剪的四种情况,两个顶点完全位于视域四棱锥内,把第二个顶点加入输出顶点表 第一个顶点在裁剪平面内侧,第二个顶点在裁剪平面外侧,将交点加入输出顶点表 两个顶点均在裁剪平面外侧,输出顶点表不加任何顶点 第一个顶点在裁剪平面外侧,第二个顶点在裁剪平面内侧,将交点和第二个顶点加入输出顶点表,裁剪的四种情况-1,裁剪的四种情况-2,裁剪的四种情况-3,裁剪的四种情况-4,视域四棱锥裁剪,视域四棱锥裁剪对所有四个齐次坐标进行,w分量与其他分量一样处理 输出仍为齐次坐标,裁剪方法-1,在场景坐标系中进行裁剪,然后变换到视点坐 标系 把物体从局部坐标系变换至场景坐标系 背面剔除
12、将视域四棱锥反变换至场景坐标系,称之为场景四棱锥 在场景坐标系中用场景四棱锥裁剪物体 裁剪后的物体从场景坐标系变换至视点坐标系,裁剪方法-2,在局部坐标系中进行裁剪,然后变换到视点坐 标系 把相机从场景坐标系变换至局部坐标系 背面剔除 将视域四棱锥反变换至局部坐标系 局部坐标系中用反变换得到的四棱锥裁剪物体 裁剪后的物体从局部坐标系变换至视点坐标系,裁剪方法-3,将物体首先变换到视点坐标系,在视点坐标系 中进行裁剪, 把相机从场景坐标系变换至局部坐标系 背面剔除 将物体从局部坐标系变换至视点坐标系 用视域四棱锥进行裁剪,从世界坐标系到屏幕坐标系,将物体从世界坐标系变换至屏幕坐标系,可以看成是:
13、将物体首先作相机变换,再作透视变换: 一般还需要一个视区变换,视区变换,将视域归一化 视域与物体求交,视域之外的部分物体不参与显示过程 求交后的物体投影,并按照相应的视见区域大小xmin,xmax、 ymin,ymax、 zmin,zmax进行缩放,OpenGL中的变换矩阵,相机变换: 指定照相机位置和方向(也叫照相机坐标系统) 模型变换: 将物体在场景中移动,也可以视为从局部坐标系到全局坐标系 ModelView变换: 相机变换和模型变换的混合. 投影变换: 定义视域体并指向投影 视区变换: 将二维投影后的场景变换到绘制窗口.,相机坐标,照相机坐标系统: 也叫视点坐标系统或者视见坐标系统.
14、它表示了在照相机后面看场景的坐标关系。X-Y平面是投影面(也叫平面) ,照相机一般往负z方向看。,相机变换的两种方法 保持相机不变,将物体(在世界坐标系统中)绕着相机旋转。 保持物体不变,将相机在世界坐标系统中变换。相机变换是物体变换的逆变换。,y,x,z,-z,eye,设置相机: “Look At” 相机,将相机放置到世界坐标系统中定义相机变换 glMatrixMode (GL_MODELVIEW); glLoadIdentity (); gluLookAt (eye.x, eye.y, eye.z, look.x, look.y, look.z, up.x, up.y, up.z);,up
15、,eye,look,Y,Z,X,WCS,x,y,z,P0,Q0,VCS,从 LookAt 设置中计算相机变换,坐标系统, 形成了.:,v,u,n,-n,eye,look,相机变换:,OpenGL例子(Look At相机),Void DisplayScene () glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0f, 0.0f, 0.0f); glLoadIdentity (); gluLookAt (0.0, 0.0, 10.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0); glBegin (GL_TRIANGLE); glVertex3f (10.0f, 0.0f, 0.0f); glVertex3f (0.0f, 10.0f, 0.0f); glVertex3f (-10.0f, 0.0f, 0.0f); glEnd(); glFlush (); ,设置相机的另一种方法: 变换场景,gluLookAt 函数