配色: 字号:
几何变换
2012-11-27 | 阅:  转:  |  分享 
  
第6章图形几何变换本章目标学习如何使图形运动平移变换、旋转变换和放缩学会复杂变换的分解与合成学会使用OpenGL的几何变换函数
主要内容数学基础二维几何变换齐次坐标复合变换其它变换三维几何变换图形对象的几何变换OpenGL的几何变换函数6.
1数学基础矢量(vector)连接两个点的有向线段。又称向量行向量和列向量两种表示矢量和6.1数学基础矢
量的数乘矢量的点积运算性质6.1数学基础矢量的长度单位矢量矢量间的夹角矢量的叉积6.1
数学基础矩阵(Matrix)m×n阶矩阵n阶方阵(m=n)单位矩阵n阶方阵,对角线元素为1,其
它元素为06.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性质:结合律和交换律6.1数学基础矩阵(续)矩阵的数乘矩阵的乘法性质:结合律和分
配律(不满足交换律)6.1数学基础矩阵(续)矩阵的转置矩阵的逆n阶方阵A是可逆的,若存在另一个n阶方阵B,
使得AB=BA=In,称B是A的逆阵,记为B=A-16.2二维几何变换平移变换(translationtran
sformation)将点P(x,y)在x轴方向、y轴方向分别平移距离tx,ty,得到点P′(x?,y?),则6.2
二维几何变换旋转变换(rotationtransformation)如点P(x,y)的极坐标表示(r为P到原点
的距离)绕坐标原点(称为参照点,基准点)旋转角度θ(逆时针为正,顺时针为负)6.2二维几何变换旋转变换(续)6.
2二维几何变换放缩变换(scalingtransformation)将点P(x,y)在x方向,y方向分别放缩sx
和sy倍,得到点P′(x?,y?)以坐标原点为放缩参照(基准)点不仅改变了物体的大小和形状,也改变了它离原
点的距离6.2二维几何变换利用矩阵计算变换后的坐标时,平移、旋转和放缩变换分别为:运算不统一,如何统一运
算?6.3齐次坐标定义HomogeneousCoordinate(x,y)点对应的齐次坐标定义为(x,y)点
对应的齐次坐标为三维空间的一条直线标准齐次坐标(x,y,1)h=0表示无穷远点6.3齐次坐标二维变换的矩阵表示
平移变换旋转变换6.3齐次坐标放缩变换变换具有统一表示形式的优点便于变换合成 连续变换时,可以先
得到变换的矩阵便于硬件实现6.3齐次坐标变换的性质平移和旋转变换具有可加性放缩变换具有可乘性6.3齐次坐标
逆变换逆平移变换:正平移距离tx,ty逆旋转变换:旋转角度为θ6.3齐次坐标逆放缩变换:放缩系数为
sx和sy6.4复合变换变换合成方法:连续变换时,先计算变换矩阵,再计算坐标优点:(1)提高了对图形依次做多次变换的
运算效率如:图形上有n个顶点Pi,如果依次施加的变换为T,R,那么顶点Pi变换后的坐标为6.4复合变换变换合成
(续)(2)提供构造复杂变换的方法对图形作较复杂的变换时,不直接去计算这个变换,而是将其先分解成多个基本变
换,再合成总的变换复合变换Compositetransformation多个变换的组合可通过单个变换矩阵来计算矩阵乘积
6.4.1复合平移变换连续平移变换平移向量为(t1x,t1y)和(t2x,t2y)点P经变换为P′,则有复合矩
阵6.4.2复合旋转变换连续旋转P经连续旋转角度分别为?1和?2后连续旋转具有相加性6.4.3复
合放缩变换连续放缩连续放缩因子分别为:(s1x,s1y)和(s2x,s2y)6.4.4二维基准点旋转关于任意参照
点的旋转变换步骤:(1)平移对象使参照(基准)点移到原点(2)绕坐标原点旋转(3)平移对象使基
准点回到原始位置6.4.5二维基准点放缩6.4.6小结6.5其它变换对称变换(反射变换、镜像变换:reflecti
on)关于x轴的对称变换关于y轴的对称变换6.5其它变换6.5其它变换6.5其它变换
(2)以y=yref为参考轴6.5其它变换2、以x轴为依赖轴的错切变换6.5其它变换仿射变换aff
inetransformation二维线性变换的一般形式平移,旋转,放缩,对称和错切是特例特点:保持平行线间的平行
关系6.5其它变换例:证明二维复合变换的矩阵总能表示为:证明:6.6三维几何变换三维齐次坐标(x,y
,z)点对应的齐次坐标为标准齐次坐标(x,y,z,1)右手坐标系旋转方向当拇指与坐标轴同向时,四指所指方向
为绕该轴的正旋转方向6.6三维几何变换平移变换位移量:(tx,ty,tz)放缩变换参照点为坐标原点6
.6三维几何变换旋转变换绕x轴绕y轴6.6三维几何变换绕z轴错切变换以z为依赖轴6.6
三维几何变换对称变换关于坐标平面xy的对称变换其它坐标平面类似6.6三维几何变换三维几何变换的一般形式
6.6三维几何变换思考题:绕任意轴旋转思路:将矢量P1P2变换后与坐标轴重合,再用基本旋转变换实现旋转,再逆变换到原
位置步骤:先平移,将P1平移到坐标原点绕y和z轴旋转使矢量P1P2与x轴重和。。。6.7图形对
象的几何变换图形对象点,线段,多边形,圆,字符方法先生成点集,再对其中的点进行变换运算量大对参数变换线段:两个端点
多边形:各顶点圆:圆心和半径前提图形对象的几何表示是否发生变化?6.8OpenGL几何变换函数说明在核心库中,每种
几何变换是一个独立的函数所有变换都是在三维坐标系中定义基本几何变换函数平移函数:glTranslate{fd}(tx,ty
,tz)对二维变换而言,取tz=0旋转函数:glRotate{fd}(theta,vx,vy,vz)向量(vx,v
y,vz)为通过坐标原点旋转轴theta为旋转角的度数放缩函数:glScale{fd}(sx,sy,sz)相对坐标原点
的缩放当参数为负时,相对于平面反射变换6.8OpenGL几何变换函数例程序6-16.8OpenGL几何变换函
数6.8OpenGL几何变换函数例6-1(续)6.8OpenGL几何变换函数矩阵操作模型观察矩阵:glMat
rixMode(GL_MODELVIEW)建立当前观察矩阵还有两种方式:纹理和颜色模式,默认为观察模式设置当前矩阵为单位矩阵
:glLoadIdentity()矩阵栈4种:观察、投影、纹理和颜色初始状态下,每栈仅包含一单位栈压栈:glPushMat
rix()出栈:glPopMatrix()6.8OpenGL几何变换函数例6-2机器人手臂6.8OpenG
L几何变换函数例6-2(续)6.8OpenGL几何变换函数6.8OpenGL几何变换函数6.8OpenGL几
何变换函数6.8OpenGL几何变换函数使用双缓冲以GLUT_DOUBLE为参数调用glutInitDisplayMod
e,设置双缓存的窗口模式在显示回调函数的最后调用glutSwapBuffers()函数空闲函数(回调函数)定义:如void
spinCube()功能:程序不受用户干预时执行spinCube()函数注册:glutIdleFunc(spinCube)
(在main函数中调用)重绘制函数glutPostRedisplay()6.8OpenGL几何变换函数例6-3:旋转
的立方体8个顶点的颜色不同不停地旋转鼠标控制改变方向6.8OpenGL几何变换函数6.8OpenGL几何变换
函数6.8OpenGL几何变换函数6.8OpenGL几何变换函数6.8OpenGL几何变换函数矩阵运算获取当
前几何变换矩阵glGetDoublev(GL_MODELVIEW_MATRIX,modelview);modelvie
w为16个元素的实数,如定义为:GLdoublemodelview[16];可以用来计算图形变换后的坐标(如多
边形顶点坐标)矩阵相乘:当前矩阵与给定矩阵相乘voidglMultMatrixd(constGLdouble
m);小结5种基本变换平移,旋转,放缩,对称,错切矩阵表示限制条件复合变换分解与复合能根据具体问题计算复杂变换
的矩阵OpenGL几何变换的应用变换函数矩阵作业1、在坐标系Oxyz中,计算将矢量P(1,1,1)Q(2,2,2)变换到
矢量P’(0,0,0)Q’(0,0,1)的变换矩阵2、假设有一条从P1到P2的直线上的任意一点P,证明对任何复合变
换,变换后的点P都在P1和P2之间。上机题一:补充图形元素的平移、缩放和旋转功能图形拾取平移(新位置的定义)
缩放(大小缩放,关于图形的重心)旋转(绕图形的重心)voidmain(intargc,charargv){
/needbothdoublebufferingandzbuffer/glutInit(
&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLU
T_DEPTH);glutInitWindowSize(500,500);glutCreateWindo
w("colorcube");glutReshapeFunc(myReshape);glutDis
playFunc(display); glutIdleFunc(spinCube); glutMous
eFunc(mouse); glEnable(GL_DEPTH_TEST);/Enablehidden--s
urface--removal/glutMainLoop();}4.3.2扫描线算法关于任意参照点
的放缩变换步骤:(1)平移对象使基准点与坐标原点重合(2)放缩变换(3)反向平移使得基准点回到初始位置变换
合成时,矩阵相乘的顺序单次变换:列向量表示点复合变换:先作用的放在连乘的右端,后作用的放在连乘的左端点表示成行向量
呢?关于任意轴的对称变换平移(tx,ty)使l过坐标原点,记为T1旋转?,记R1对称,记SYx旋转-?,记R2
平移(-tx,-ty),记T2总变换:T2?R2?SYx?R1?T1错切变换(shear)依赖轴:坐标
保持不变的坐标轴,又称参考轴方向轴:余下的坐标轴1、以y轴为依赖轴的错切变换(1)以y=0为参考轴(坐标保持不变)
shx为沿x轴移动的距离x?=x+shx(y–yref)y?=yyxzyxz(1)前三行
和前三列对应旋转和放缩变换(2)第四列的前三个元素对应平移变换(3)第四行前三个元素对应投影变换αβvoiddispl
ay(void){glColor3f(0.0,0.0,1.0);glRecti(20,50,
100,80);glColor3f(1.0,0.0,0.0);glTranslat
ef(-120.0,-40.0,0.0);glRecti(20,50,100,80);glLo
adIdentity();glColor3f(1.0,0.0,1.0);glRotatef(135.0,
0.0,0.0,1.0);glRecti(20,50,100,80);glLoadIdenti
ty();glColor3f(0.0,1.0,0.0); glScalef(0.5,-1.0,1.
0);glRecti(20,50,100,80);glColor3f(0,0,0);glLo
adIdentity();glBegin(GL_LINES);glVertex2i(0,-
Y/2+5);glVertex2i(0,Y/2-5);glVertex2i(X/2-5,0);glVe
rtex2i(-X/2+5,0);glEnd();glutSwapBuffers();}注意:几
何变换矩阵只有1个例6-1(续)#include#include#inclu
deintX=0,Y=0;voidReshape(intwidth,intheight){
glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION
);glLoadIdentity();gluOrtho2D(-width/2,width/2,-hei
ght/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,25
0.0,0.0,250.0);}intmain(intargc,charargv){glutInit
(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(250,250);glutInitWindowPosition(300,
300);glutCreateWindow("Transformation");init();glu
tDisplayFunc(display);glutReshapeFunc(Reshape);glutMainL
oop();return0;}#include#defineBASE_HEIGHT2.
0#defineBASE_RADIUS1.0#defineLOWER_ARM_HEIGHT5.0#defineLO
WER_ARM_WIDTH0.5#defineUPPER_ARM_HEIGHT5.0#defineUPPER_ARM_
WIDTH0.5typedeffloatpoint[3];GLfloattheta[]={0.0,0.0,0.0
};GLintaxis=0;GLUquadricObjp;/pointertoquadric(二次曲面)
object/voidmyinit(){glClearColor(1.0,1.0,1.0,1.0);
glColor3f(1.0,0.0,0.0);p=gluNewQuadric();/allocatequ
adricobject/gluQuadricDrawStyle(p,GLU_LINE);/renderit
aswireframe/}voidbase(){glPushMatrix();/rotatecylin
dertoalignwithyaxis/glRotatef(-90.0,1.0,0.0,0.0
);/cylineralignedwithzaxis/gluCylinder(p,BASE_RADIU
S,BASE_RADIUS,BASE_HEIGHT,5,5);glPopMatrix();}void
upper_arm(){glPushMatrix();glTranslatef(0.0,0.5UPPER
_ARM_HEIGHT,0.0);glScalef(UPPER_ARM_WIDTH,UPPER_ARM_HEIGHT
,UPPER_ARM_WIDTH);glutWireCube(1.0);glPopMatrix();}void
lower_arm(){glPushMatrix();glTranslatef(0.0,0.5LOWER_AR
M_HEIGHT,0.0);glScalef(LOWER_ARM_WIDTH,LOWER_ARM_HEIGHT,
LOWER_ARM_WIDTH);glutWireCube(1.0);glPopMatrix();
}voiddisplay(void){/AccumulateModelViewMatrixaswetrave
rsetree/glClear(GL_COLOR_BUFFER_BIT);glLoadIdentit
y();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();glutSwapBuffers();
}voidmouse(intbtn,intstate,intx,inty){/leftbuttoni
ncreasejointangle,rightbuttondecreasesit/if(btn==GLUT_LE
FT_BUTTON&&state==GLUT_DOWN){theta[axis]+=5.0;if(theta[a
xis]>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();}voidmenu(intid){/
menuselectswhichangletochangeorwhethertoquit/if(i
d==1)axis=0;if(id==2)axis=1;if(id==3)axis=2;
if(id==4)exit(0);}voidmyReshape(intw,inth){glVi
ewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadI
dentity();if(w<=h)glOrtho(-10.0,10.0,-5.0(GLfl
oat)h/(GLfloat)w,15.
0(GLfloat)h/(GLfloat)w,-10.0,10.0);elseglOrt
ho(-10.0(GLfloat)w/(GLfloat)h,10.0(GLfloat)w/(GLflo
at)h,-5.0,15.0,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voi
dmain(intargc,charargv){glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);glutCreateWindow("robo
t");myinit();glutReshapeFunc(myReshape);g
lutDisplayFunc(display);glutMouseFunc(mouse);glut
CreateMenu(menu);glutAddMenuEntry("base",1);glut
AddMenuEntry("lowerarm",2);glutAddMenuEntry("upperarm"
,3);glutAddMenuEntry("quit",4);glutAttachMenu(G
LUT_MIDDLE_BUTTON);glutMainLoop();}#include
#include//定义顶点坐标和颜色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}};voidpolygon(
inta,intb,intc,intd){/drawapolygonvialistofverti
ces/glBegin(GL_POLYGON);glColor3fv(colors[a]);
glVertex3fv(vertices[a]);glColor3fv(colors[b]
);glVertex3fv(vertices[b]);glColor3fv(colors[
c]);glVertex3fv(vertices[c]);glColor3fv(color
s[d]);glVertex3fv(vertices[d]);glEnd();}voidco
lorcube(void){/mapverticestofaces/ polygon(0,3,2,1); polyg
on(2,3,7,6); polygon(0,4,7,3); polygon(1,2,6,5); polygon(4,5,6,7)
; polygon(0,1,5,4);}staticGLfloattheta[]={0.0,0.0,0.0};sta
ticGLintaxis=2;voiddisplay(void){/displaycallback,cle
arframebufferandzbuffer,rotatecubeanddraw,swapbuffer
s/glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);g
lLoadIdentity(); glRotatef(theta[0],1.0,0.0,0.0);glRotat
ef(theta[1],0.0,1.0,0.0);glRotatef(theta[2],0.0,0.0,1.0
);colorcube(); glutSwapBuffers();}voidspinCube(){/
Idlecallback,spincube2degreesaboutselectedaxis/
theta[axis]+=2.0; if(theta[axis]>360.0)theta[axis]-=
360.0; /display();/glutPostRedisplay();}voidmouse(int
btn,intstate,intx,inty){/mousecallback,selectsanaxis
aboutwhichtorotate/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(GLfloat)w/(GLfloat)h,-2.0,2.0,-10.0,10.0);glMatrixMode(GL_MODELVIEW);}计通学院计算机科学系计算机图形学计通学院计算机科学系计算机图形学右手法则记为:T(tx,ty)矩阵表示:记为:R(θ)矩阵表示为:记为:S(sx,sy)6.3齐次坐标为什么需要齐次坐标?计算多次不同变换时,分别利用矩阵计算各变换导致计算量大运算表示形式不统一平移为“+”旋转和放缩为“·”统一运算形式后,可以先合成变换运算的矩阵,再作用于图形对象每个顶点需要2次矩阵相乘只需要1次矩阵相乘
献花(0)
+1
(本文系依米荷阳首藏)