二维几何变换课件_第1页
二维几何变换课件_第2页
二维几何变换课件_第3页
二维几何变换课件_第4页
二维几何变换课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

第6章

图形几何变换1本章目标学习如何使图形运动平移变换、旋转变换和放缩学会复杂变换的分解与合成学会使用OpenGL的几何变换函数2主要内容数学基础二维几何变换齐次坐标复合变换其它变换三维几何变换图形对象的几何变换OpenGL的几何变换函数36.1数学基础矢量的数乘矢量的点积运算性质56.1数学基础矢量的长度单位矢量矢量间的夹角矢量的叉积右手法则66.1数学基础矩阵(Matrix)m×n

阶矩阵n阶方阵(m=n)单位矩阵

n阶方阵,对角线元素为1,其它元素为076.1数学基础矩阵(续)行向量与列向量当m=1时,A退化为行向量[a11,a12,…,a1n]当n=1时,A退化为列向量[a11,a21,…,am1]T矩阵的加法A=(aij)m×n,B=(bij)m×nA与B的和记为A+B性质:结合律和交换律86.1数学基础矩阵(续)矩阵的转置矩阵的逆n阶方阵A是可逆的,若存在另一个n阶方阵B,使得

AB=BA=In,称B是A的逆阵,记为B=A-1106.2二维几何变换旋转变换(rotationtransformation)如点P(x,y)的极坐标表示(r为P到原点的距离)绕坐标原点(称为参照点,基准点)旋转角度θ

(逆时针为正,顺时针为负)126.2二维几何变换放缩变换(scalingtransformation)将点P(x,y)在x方向,y方向分别放缩sx和sy倍,得到点P´(x׳,y׳)以坐标原点为放缩参照(基准)点不仅改变了物体的大小和形状,也改变了它离原点的距离记为:S(sx,sy)146.2二维几何变换利用矩阵计算变换后的坐标时,平移、旋转和放缩变换分别为:运算不统一,如何统一运算?156.3齐次坐标为什么需要齐次坐标?对多个点计算多次不同的变换时,分别利用矩阵计算各变换导致计算量大运算表示形式不统一平移为“+”旋转和放缩为“·”统一运算形式后,可以先合成变换运算的矩阵,再作用于图形对象166.3齐次坐标定义HomogeneousCoordinate(x,y)点对应的齐次坐标定义为(x,y)点对应的齐次坐标为三维空间的一条直线标准齐次坐标(x,y,1)h=0表示无穷远点176.3齐次坐标二维变换的矩阵表示平移变换旋转变换186.3齐次坐标变换的性质平移和旋转变换具有可加性放缩变换具有可乘性206.3齐次坐标逆变换逆平移变换:正平移距离tx,ty逆旋转变换:旋转角度为θ216.4复合变换变换合成方法:连续变换时,先计算变换矩阵,再计算坐标优点:(1)提高了对图形依次做多次变换的运算效率如:图形上有n个顶点Pi,如果依次施加的变换为T,R,那么顶点Pi变换后的坐标为每个顶点需要2次矩阵相乘只需要1次矩阵相乘236.4复合变换变换合成 (续)(2)提供构造复杂变换的方法对图形作较复杂的变换时,不直接去计算这个变换,而是将其先分解成多个基本变换,再合成总的变换复合变换Compositetransformation多个变换的组合可通过单个变换矩阵来计算矩阵乘积246.4.2复合旋转变换连续旋转P经连续旋转角度分别为1和2后连续旋转具有相加性266.4.3复合放缩变换连续放缩连续放缩因子分别为:(s1x,s1y)和(s2x,s2y)276.4.4二维基准点旋转关于任意参照点的旋转变换步骤:(1)平移对象使参照(基准)点移到原点(2)绕坐标原点旋转(3)平移对象使基准点回到原始位置286.4.6小结变换合成时,矩阵相乘的顺序单次变换:列向量表示点复合变换:先作用的放在连乘的右端,后作用的放在连乘的左端点表示成行向量呢?306.5其它变换对称变换(反射变换、镜像变换:reflection)(1)关于x轴的对称变换(2)关于y轴的对称变换

316.5其它变换(3)关于任意轴的对称变换平移(tx,ty)使l过坐标原点,记为T1旋转,记R1对称,记SYx旋转-,记R2平移(-tx,-ty),记T2总变换:T2•R2•SYx•R1•T1326.5其它变换错切变换(shear)依赖轴:坐标保持不变的坐标轴,又称参考轴方向轴:余下的坐标轴1、以y

轴为依赖轴的错切变换(1)以y=0为参考轴(坐标保持不变)Shx是对y=1上的点沿x轴移动的距离336.5其它变换(2)以y=yref

为参考轴x׳=x+shx(y–yref)y׳=y346.5其它变换2、以x轴为依赖轴的错切变换356.5其它变换仿射变换affinetransformation二维线性变换的一般形式平移,旋转,放缩,对称和错切是特例特点:保持平行线间的平行关系366.5其它变换例:证明二维复合变换的矩阵总能表示为:证明:37三维齐次坐标(x,y,z)点对应的齐次坐标为标准齐次坐标(x,y,z,1)右手坐标系旋转方向当拇指与坐标轴同向时,四指所指方向为绕该轴的正旋转方向6.6三维几何变换38平移变换位移量:(tx,

ty,

tz)放缩变换参照点为坐标原点6.6三维几何变换39旋转变换绕x轴绕y轴6.6三维几何变换yxz40绕z轴错切变换以z为依赖轴6.6三维几何变换yxz416.6三维几何变换对称变换关于坐标平面xy的对称变换其它坐标平面类似426.6三维几何变换三维几何变换的一般形式(1)前三行和前三列对应旋转和放缩变换(2)第四列的前三个元素对应平移变换(3)第四行前三个元素对应投影变换43思考题:绕任意轴旋转思路:将矢量P1P2变换后与坐标轴重合,再用基本旋转变换实现旋转,再逆变换到原位置步骤:先平移,将P1平移到坐标原点绕y和z轴旋转使矢量P1P2与x轴重和。。。6.6三维几何变换αβ44图形对象点,线段,多边形,圆,字符方法先生成点集,再对其中的点进行变换运算量大对参数变换线段:两个端点多边形:各顶点圆:圆心和半径前提图形对象的几何表示不发生变化6.7图形对象的几何变换456.8OpenGL几何变换函数说明在核心库中,每种几何变换是一个独立的函数所有变换都是在三维坐标系中定义基本几何变换函数平移函数:glTranslate{fd}(tx,ty,tz)对二维变换而言,取tz=0旋转函数:glRotate{fd}(theta,vx,vy,vz)向量(vx,vy,vz)为通过坐标原点旋转轴theta为旋转角的度数放缩函数:glScale{fd}(sx,sy,sz)相对坐标原点的缩放当参数为负时,相对于平面进行对称变换466.8OpenGL几何变换函数例程序

6-1voiddisplay(void){glColor3f(0.0,0.0,1.0);glRecti(20,50,100,80);glColor3f(1.0,0.0,0.0);glTranslatef(-120.0,-40.0,0.0);glRecti(20,50,100,80);glLoadIdentity();glColor3f(1.0,0.0,1.0);glRotatef(135.0,0.0,0.0,1.0);glRecti(20,50,100,80);glLoadIdentity();glColor3f(0.0,1.0,0.0);

glScalef(0.5,-1.0,1.0);glRecti(20,50,100,80);glColor3f(0,0,0);glLoadIdentity();glBegin(GL_LINES);glVertex2i(0,-Y/2+5);glVertex2i(0,Y/2-5);glVertex2i(X/2-5,0);glVertex2i(-X/2+5,0);glEnd();glutS();}注意:几何变换矩阵只有1个476.8OpenGL几何变换函数例6-1(续)#include<gl/glut.h>#include<stdlib.h>#include<math.h>intX=0,Y=0;voidReshape(intwidth,intheight){glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();

gluOrtho2D(-width/2,width/2,-height/2,height/2);

glMatrixMode(GL_MODELVIEW);//定义模型观察变换矩阵

glLoadIdentity();

glClear(GL_COLOR_BUFFER_BIT);X=width,Y=height;}voidinit(void){glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,250.0,0.0,250.0);}48例6-1(续)6.8OpenGL几何变换函数intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(250,250);glutInitWindowPosition(300,300);glutCreateWindow("Transformation");init();glutDisplayFunc(display);glutReshapeFunc(Reshape);glutMainLoop();return0;}49矩阵操作模型观察矩阵:glMatrixMode(GL_MODELVIEW)建立当前观察矩阵还有两种方式:纹理和颜色模式,默认为观察模式设置当前矩阵为单位矩阵:glLoadIdentity()矩阵栈4种:观察、投影、纹理初始状态下,每栈仅包含一单位栈压栈:glPushMatrix()出栈:glPopMatrix()6.8OpenGL几何变换函数506.8OpenGL几何变换函数例6-2机器人手臂#include<GL/glut.h>#defineBASE_HEIGHT2.0#defineBASE_RADIUS1.0#defineLOWER_ARM_HEIGHT5.0#defineLOWER_ARM_WIDTH0.5#defineUPPER_ARM_HEIGHT5.0#defineUPPER_ARM_WIDTH0.5typedeffloatpoint[3];GLfloattheta[]={0.0,0.0,0.0};GLintaxis=0;GLUquadricObj*p;/*pointertoquadric(二次曲面)object*/voidmyinit(){glClearColor(1.0,1.0,1.0,1.0);glColor3f(1.0,0.0,0.0);p=gluNewQuadric();/*allocatequadricobject*/gluQuadricDrawStyle(p,GLU_LINE);/*renderitaswireframe*/}516.8OpenGL几何变换函数例6-2(续)voidbase(){glPushMatrix();/*rotatecylindertoalignwithyaxis*/glRotatef(-90.0,1.0,0.0,0.0);/*cylineralignedwithzaxis*/gluCylinder(p,BASE_RADIUS,BASE_RADIUS,BASE_HEIGHT,5,5);glPopMatrix();}voidupper_arm(){glPushMatrix();glTranslatef(0.0,0.5*UPPER_ARM_HEIGHT,0.0);glScalef(UPPER_ARM_WIDTH,UPPER_ARM_HEIGHT,UPPER_ARM_WIDTH);glutWireCube(1.0);glPopMatrix();}voidlower_arm(){glPushMatrix();glTranslatef(0.0,0.5*LOWER_ARM_HEIGHT,0.0);glScalef(LOWER_ARM_WIDTH,LOWER_ARM_HEIGHT,LOWER_ARM_WIDTH);glutWireCube(1.0);glPopMatrix();}526.8OpenGL几何变换函数voiddisplay(void){/*AccumulateModelViewMatrixaswetraversetree*/glClear(GL_COLOR_BUFFER_BIT);glLoadIdentity();glColor3f(1.0,0.0,0.0);glRotatef(theta[0],0.0,1.0,0.0);base();glTranslatef(0.0,BASE_HEIGHT,0.0);glRotatef(theta[1],0.0,0.0,1.0);lower_arm();glTranslatef(0.0,LOWER_ARM_HEIGHT,0.0);glRotatef(theta[2],0.0,0.0,1.0);upper_arm();glutS();}voidmouse(intbtn,intstate,intx,inty){/*leftbuttonincreasejointangle,rightbuttondecreasesit*/if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN){theta[axis]+=5.0;if(theta[axis]>360.0)theta[axis]-=360.0;}if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN){theta[axis]-=5.0;if(theta[axis]<360.0)theta[axis]+=360.0;}display();}536.8OpenGL几何变换函数voidmenu(intid){/*menuselectswhichangletochangeorwhethertoquit*/if(id==1)axis=0;if(id==2)axis=1;if(id==3)axis=2;if(id==4)exit(0);}voidmyReshape(intw,inth){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-10.0,10.0,-5.0*(GLfloat)h/(GLfloat)w,15.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);elseglOrtho(-10.0*(GLfloat)w/(GLfloat)h,10.0*(GLfloat)w/(GLfloat)h,-5.0,15.0,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}546.8OpenGL几何变换函数voidmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutCreateWindow("robot");myinit();glutReshapeFunc(myReshape);glutDisplayFunc(display);glutMouseFunc(mouse);glutCreateMenu(menu);glutAddMenuEntry("base",1);glutAddMenuEntry("lowerarm",2);glutAddMenuEntry("upperarm",3);glutAddMenuEntry("quit",4);glutAttachMenu(GLUT_MIDDLE_BUTTON);glutMainLoop();}55使用双缓冲以GLUT_DOUBLE为参数调用glutInitDisplayMode,设置双缓存的窗口模式在显示回调函数的最后调用glutS()函数空闲函数(回调函数)定义:如voidspinCube()功能:程序不受用户干预时执行spinCube()函数注册:glutIdleFunc(spinCube)(在main函数中调用)重绘制函数glutPostRedisplay()6.8OpenGL几何变换函数56例6-3:旋转的立方体8个顶点的颜色不同不停地旋转鼠标控制改变方向6.8OpenGL几何变换函数#include<stdlib.h>#include<GL/glut.h>//定义顶点坐标和颜色GLfloatvertices[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,1.0,-1.0}, {-1.0,1.0,-1.0},{-1.0,-1.0,1.0},{1.0,-1.0,1.0}, {1.0,1.0,1.0},{-1.0,1.0,1.0}};GLfloatcolors[][3]={{0.0,0.0,0.0},{1.0,0.0,0.0},{1.0,1.0,0.0}, {0.0,1.0,0.0},{0.0,0.0,1.0},{1.0,0.0,1.0}, {1.0,1.0,1.0},{0.0,1.0,1.0}};576.8OpenGL几何变换函数voidpolygon(inta,intb,intc,intd){/*drawapolygonvialistofvertices*/glBegin(GL_POLYGON);glColor3fv(colors[a]);glVertex3fv(vertices[a]);glColor3fv(colors[b]);glVertex3fv(vertices[b]);glColor3fv(colors[c]);glVertex3fv(vertices[c]);glColor3fv(colors[d]);glVertex3fv(vertices[d]);glEnd();}voidcolorcube(void){/*mapverticestofaces*/ polygon(0,3,2,1); polygon(2,3,7,6); polygon(0,4,7,3); polygon(1,2,6,5); polygon(4,5,6,7); polygon(0,1,5,4);}586.8OpenGL几何变换函数staticGLfloattheta[]={0.0,0.0,0.0};staticGLintaxis=2;voiddisplay(void){/*displaycallback,clearframebufferandzbuffer,rotatecubeanddraw,s*/

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();

glRotatef(theta[0],1.0,0.0,0.0);glRotatef(theta[1],0.0,1.0,0.0);glRotatef(theta[2],0.0,0.0,1.0);colorcube();

glutS();}voidspinCube(){/*Idlecallback,spincube2degreesaboutselectedaxis*/ theta[axis]+=2.0; if(theta[axis]>360.0)theta[axis]-=360.0; /*display();*/glutPostRedisplay();}596.8OpenGL几何变换函数voidmouse(intbtn,intstate,intx,inty){/*mousecallback,selectsanaxisaboutwhichtorotate*/if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)axis=0;if(btn==GLUT_MIDDLE_BUTTON&&state==GLUT_DOWN)axis=1;if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)axis=2;}voidmyReshape(intw,inth){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-2.0,2.0,-2.0*(GLfloat)h/(GLfloat)w,2.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);elseglOrtho(-2.0*(GLfloat)w/(GLfloat)h,2.0*(

温馨提示

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

评论

0/150

提交评论