版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Chapter 5 Chapter 5 Projection投影变换投影变换 5.1 三维图形的基本问题三维图形的基本问题 5.2三维图形显示流程三维图形显示流程 5.3平面几何投影分类平面几何投影分类 5.4 OpenGL变换流程变换流程 5.5投影变换举例投影变换举例chapter5 投 影5.1 三维图形的基本问题1、如何将三维的物体(图形)在二维的显示设备上显示出来;2、如何以空间多边形、曲面来表示三维物体;3、如何反映物体不同部分之间的相互遮挡关系;4、如何模拟光线在物体表面产生的明暗效果。解决办法:1、投影:将三维物体转换为二维图形的过程;2、三维形体表示:采用三种模型(线框模型、
2、表面模型和实体模型)来表示三维形体;3、隐藏线与隐藏面的消除;4、光照与着色。通过建立光照明模型和对应的着色方法来模拟真实世界的光线传播。三维裁剪三维裁剪投影投影窗口到视窗口到视区的变换区的变换三维世三维世界坐标界坐标设备设备坐标坐标ABxsyszeyexeOeOs观察坐标系观察坐标系计算机中表示物体的数据模型在屏幕上显示的过程主要有四步:(1)选定投影类型(透视或平行);(2)设置投影参数(观察点、观察方向、观察平面等);(3)三维载剪(剔除不可见物体);(4)投影和显示。投投 影影平行投影平行投影透视投影透视投影正平行投影正平行投影斜平行投影斜平行投影三视图三视图正轴测投影正轴测投影正等测
3、正等测正二测正二测正三测正三测斜等测斜等测斜二测斜二测一点透视一点透视两点透视两点透视三点透视三点透视平面几何投影(简称投影):投影面是平面、投影线是直线。5.2 平面几何投影分类透视投影:投影中心到投影面的距离是有限的。平行投影:投影中心到投影面的距离是无限的。 正平行投影:投影方向与投影平面的发向平行。斜平行投影:投影方向不垂直于投影平面。直线AB及其平行投影ABBABA投影线投影方向投影平面5.2.1平行投影AB投影平面投影中心投影线AB观察点、视点投影中心向物体上各点发出的射线观察平面直线AB及其透视投影AB投影平面投影平面投影方向投影方向正平行投正平行投影影投影平面投影平面投影方向投
4、影方向斜平行投斜平行投影影三视图 当投影平面与某一坐标轴垂直时得到的投影。分别为正视图、侧视图和俯视图,对应的投影平面分别与x,y,z轴垂直。 正轴测图 当投影平面与三个坐标轴都不垂直时得到的投影。分别为等轴测、正二测和正三测。平行投影平行投影投影方向与投影平面不垂直。投影平面取坐标平面投影方向与投影平面不垂直。投影平面取坐标平面在用户坐标系下的斜平行投影在用户坐标系下的斜平行投影设投影方向矢量为设投影方向矢量为xp, yp, zp形体上任一点形体上任一点(x, y, z)在投影平在投影平面面XOY上的投影点为上的投影点为(xs, ys, 0),投影线的参数方程为:投影线的参数方程为:xs =
5、 x + xp tys = y + yp tzs = z + zp t其中其中zs = 0; t = z / zpxs = x xp/zp zys = y yp/zp zzs = 0 1000000010000111ppppssszyzxzyxzyx斜平行投影灭点 任何一束不平行于投影平面的平行线的透视投影将汇聚成一点,为灭点.主灭点 在坐标轴上的灭点。主灭点数和投影平面切割坐标轴的数量相等。透视投影按主灭点的个数分为一点透视、二点透视、三点透视。5.2.2 透视投影透视投影Pc(xc, yc, zc)为视点,面为视点,面XOY为投影平面,形体上的点为投影平面,形体上的点P(x, y, z)的
6、投影点为的投影点为(xs, ys, 0)。投影线的参数方程为:投影线的参数方程为:ys = yc + (yyc) txs = xc + (xxc) tzs = zc + (zzc) t其中其中zs = 0; t = zc / (z-zc)ys = (ycz-yzc) /(z-zc)xs = (xcz-xzc)/(z-zc)zs = 0 100000)()(00)(0000)(11ccccccccssszzyzzxzzzzzzzyxzyx100010001000011)(1cccccccssszzyzxzyxzzzzyx100000001000011)(1cccccccssszzzyzxzyxz
7、zzzyx令令w = -zc, ws= (z-zc)有有xsws ysws zsws ws = xw yw zw w Tys = yc + (yyc) txs = xc + (xxc) tzs = zc + (zzc) tPc(xc, yc, zc)为视点,面为视点,面XOY为投影平面,形体上的点为投影平面,形体上的点P(x, y, z)的投影点为的投影点为(xs, ys, zs)。投影线的参数方程为:投影线的参数方程为:在观察坐标系下,在观察坐标系下, (xc, yc, zc)为为(0, 0, 0),(x, y, z)则为则为(xe, ye, ze)xs = xezs/zeys = ye t
8、xs = xe tzs = ze tt = zs/zeys = yezs/zezs = zs其中其中zs为投影平面在观察方向上离视点的距离为投影平面在观察方向上离视点的距离观察坐标系下的一点透视观察坐标系下的一点透视xe ye ze 1 = xw yw zw 1 TwvzxyyexezeOOeZe为观察方向,其单位矢量为为观察方向,其单位矢量为n;取取Ye方向为方向为v=0, 1, 0;Xe方向方向为为u,则,则u=nvv=un1000000zyxzyxzyxwvnnnvvvuuuTOe在用户坐标系下坐标为在用户坐标系下坐标为(x, y, z)用户坐标系到观察坐标系的变换视见体(裁剪空间):位
9、于前、后裁剪面之间的有限观察空间。视见体由六个面围成,视见体的裁剪是三维图形显示的重要步骤,它涉及六个表面的求交,需要大量的计算。为了减少计算量,引入规范视见体(规范裁剪空间)的概念。在观察坐标uvn下中,平行投影的规范视见体的定义为:u=1, u=-1v=1, v=-1n=0, n=-1在观察坐标uvn下中,透视投影的规范视见体的定义为:u=n, u=-nv=n, v=-nn=-nmin, n=-15.2.3规范视见体规范视见体视见体的规范化1、平行投影视见体的规范化分为4个步骤:a) 平移使窗口中心CW位于坐标原点VRP。b) 错切使投影方向DOP与n轴平行。c) 平移使前裁剪面与uv平面
10、重合。d) 缩放使视见体的尺寸与规范视见体一致。2、透视投影视见体的规范化分为4个步骤:a) 平移使投影参考点PRP落于坐标原点VRP。b) 错切使视见体的中心线与n轴平行。c) 缩放使视见体的六个面变换成规范视见体六个面。采用二维裁剪的三维图形显示流程采用二维裁剪的三维图形显示流程采用规范视见体的三维图形显示流程采用规范视见体的三维图形显示流程5.3 三维图形显示流程三维图形显示流程5.4 OpenGL变换流程Vertex Data描述对象的顶点数据;Object Coordinates对象的本地坐标系,任何变换之前的最初位置。为了变换(transformation)这些对象,可以调用glR
11、otate(),glTranslatef(),glScalef()这些方法。 ModelViewMatrix是模型矩阵(Model Matrix)和视觉矩阵(View Matrix)的组合 ,通过 GL_MODELVIEW将对象对象空间(Object Space)变换到视觉空间(eye space),得到Eye Coordinates。 标准向量(Normal vectors)从对象坐标系(Object coordinates)变换到视觉坐标系(eye coordinates),它是用来计算光照(lighting calculation)的。 PROJECTION矩阵定义了可视的空间(截头锥体
12、),视觉坐标系和GL_PROJECTION矩阵相乘,得到剪切面坐标系。 Perspective Projection The call glFrustum(l, r, b, t, n, f) generates R, where Orthographic ProjectionThe call glOrtho(l, r, b, t, n, f ) generates R, where 将剪切面坐标系除以w所得标准化设备坐标系(NDC)被称为视角除法(perspective division),其中它取值范围在3个轴向从-1到1标准化了。 Viewport Tranform视口转换将标准化设备坐标
13、系(NDC)应用于视口转换。NDC将缩小和平移以便适应屏幕的透视。窗口坐标系最终传递给OpenGL的管道处理变成了fragment。 窗口坐标系由下面两个方法计算出来: glViewPort(x,y,w,h); glDepthRange(n,f); glViewPort()函数用来定义最终图片映射的投影区域。同样,glDepthRange()用来决定窗口坐标系的z坐标。总结:OpenGL中矩阵坐标之间的关系物理坐标模型视图矩阵投影矩阵透视除法规范化设备坐标窗口坐标相机模拟OpenGL中的各种坐标变换 (1)将相机置于三角架上,让它对准三维景物,它相当于OpenGL中调整视点的位置,即视点变换(
14、Viewing Transformation)。实现方法:模型转换命令和gluLookAt()函数(该函数有三个变量,分别定义了视点的位置、相机瞄准方向的参考点以及相机的向上方向)。 (2)将三维物体放在场景中的适当位置,它相当于OpenGL中的模型变换(Modeling Transformation),即对模型进行旋转、平移和缩放。 (3)选择相机镜头并调焦,使三维物体投影在二维胶片上,它相当于OpenGL中把三维模型投影到二维屏幕上的过程,即OpenGL的投影变换(Projection Transformation),OpenGL中投影的方法有两种,即正射投影和透视投影。 OpenGL透视
15、投影函数有两个:glFrustum()和gluPerspective() OpenGL正射投影函数也有两个:glOrtho()和gluOrtho2D() 只有视景体内的物体能被投影在显示平面上,其他部分则不能。 (4)冲洗底片,决定二维相片的大小,它相当与OpenGL中的视口变换(Viewport Transformation),OpenGL中相关函数是: glViewport(GLint x,GLint y,GLsizei width, GLsizei height); (5)裁剪变换。在OpenGL中,除了视景体定义的六个裁剪平面(上、下、左、右、前、后)外,用户还可自己再定义一个或多个附
16、加裁剪平面,以去掉场景中无关的目标。平面裁剪函数为: void glClipPlane(GLenum plane,Const GLdouble *equation);5.5Ex1.投影变换的例子/太阳系#include #include static int year = 0, day = 0;void init(void)glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_FLAT);void display(void)glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glPush
17、Matrix();/保存当前坐标系glutWireSphere(1.0, 20, 16); /* draw sun */glRotatef (GLfloat) year, 0.0, 1.0, 0.0);/绕太阳旋转glTranslatef (2.0, 0.0, 0.0);/平移glRotatef (GLfloat) day, 0.0, 1.0, 0.0);/自转glutWireSphere(0.2, 10, 8); /* draw smaller planet */glPopMatrix();/恢复当前坐标系glutSwapBuffers();void reshape (int w, int
18、h)glViewport (0, 0, (GLsizei) w, (GLsizei) h); /切换当前操作的栈为投影变换栈glMatrixMode (GL_PROJECTION);glLoadIdentity ();/初始化投影变换栈/压入透视投影矩阵gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);glMatrixMode(GL_MODELVIEW);/切换到几何变换栈glLoadIdentity();/初始化几何变换栈/设置观察视点gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1
19、.0, 0.0);void keyboard (unsigned char key, int x, int y)switch (key) case d:day = (day + 10) % 360;glutPostRedisplay();break;case D:day = (day - 10) % 360;glutPostRedisplay();break;case y:year = (year + 5) % 360;glutPostRedisplay();break;case Y:year = (year - 5) % 360;glutPostRedisplay();break;case
20、27:exit(0);break;default:break;int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv0);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyb
21、oard);glutMainLoop();return 0;Ex2#include #include void init(void)glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_FLAT);glEnable(GL_DEPTH_TEST);void display(void)glClear (GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);glColor3f (0.5, 0.5, 0.5);glRotatef (30, 0.0, 1.0, 0.0);glutSolidCube(1);/构造3维实体glCo
22、lor3f (1.0, 0.0, 1.0);glutWireCube(1);/构造3维线框体glutSwapBuffers();void reshape (int w, int h)/设置二维的视口平面glViewport (0, 0, (GLsizei) w, (GLsizei) h) ;/设置投影变换矩阵glMatrixMode (GL_PROJECTION); glLoadIdentity ();/初始化单位矩阵/创建一个对称透视视景体gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);/设置几何变换矩阵glMatrixMod
23、e(GL_MODELVIEW); glLoadIdentity();/初始化单位矩阵/设置视点gluLookAt (0.0, 2.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv0);init ();glutDisplayFunc(display);glutRe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微笑服务的心得体会5篇
- 电力竞赛心得体会
- 2022科学新课标的心得体会(8篇)
- 青海省海北藏族自治州(2024年-2025年小学五年级语文)统编版开学考试(下学期)试卷及答案
- 高考文综区域地理教案 东亚精讲精练 内含考向指导 内容精析 典例剖析 高考链接
- 上海市市辖区(2024年-2025年小学五年级语文)人教版期中考试(下学期)试卷及答案
- 四年级数学(小数加减运算)计算题专项练习与答案汇编
- 高中化学《弱电解质的电离》说课稿
- s版二年级语文下册全册教案
- 湘教版小学美术三年级上册全册教案
- MES技术及其应用-西门子MES剖析课件
- 抢救车药品交接本
- 古诗中的节日(上)课件
- 体育说课教学课件
- 画鼻子游戏课件
- 小区施工管理制度4篇
- 《西方礼仪》教案
- 睡眠障碍的康复治疗
- 2020年浙江省教学能力大赛二等奖中职语文教学实施报告现场展示PPT
- 《逍遥游》-完整版课件
- 中班体育教案:平衡教案及教学反思
评论
0/150
提交评论