




已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学实验指导书编者:吴学毅西安理工大学印刷包装工学院 信息科学系2010年9月目录上机实验说明1【实验环境】1【实验要求】1【实验项目及学时分配】1【实验报告和考核】1【实验大纲】见附录A1【实验环节详细说明】见附录B1实验(一)2【实验题目】 基本图元绘制2【实验目的】2【实验内容】2【实验报告要求】3实验(二)4【实验题目】 二维图元的几何变换4【实验目的】4【实验内容】4【实验报告要求】5实验(三)6【实验题目】 线段、多边形裁剪算法实现6【实验目的】6【实验内容】6实验(四)7【实验题目】 三维观察算法实现7【实验目的】7【实验内容】7实验(五)8【实验题目】 光照模型与纹理映射实现8【实验目的】8【实验内容】8【实验报告要求】8附录A9计算机图形学实验教学大纲9附录B11实验环节详细说明12 上机实验说明【实验环境】操作系统:Microsoft Windows 2000或以上系统。软件平台:Visual C+6.0程序开发的软件平台及OpenGL图形库。【实验要求】1、每次实验前,熟悉实验目的、实验内容及相关的基本理论知识。2、无特殊要求,原则上实验为1人1组,必须独立完成。3、实验所用机器最好固定,以便更好地实现实验之间的延续性和相关性,并便于检查。4、按要求认真做好实验过程及结果记录。【实验项目及学时分配】本实验共计10学时,实验项目及学时分配如下:序号实验项目实验类型学时要求1基本图元绘制设计2必做2二维图元的几何变换验证2必做3线段、多边形裁剪算法实现验证2必做4三维观察算法实现设计2必做5光照模型与纹理映射实现验证2必做【实验报告和考核】1、实验报告必需采用统一的实验报告纸,撰写符合一定的规范,详见实验报告撰写格式及规范。2、本实验占该课程最终评定成绩的15。【实验大纲】见附录A【实验环节细节说明】见附录B实验(一)【实验题目】 基本图元绘制【实验目的】1、通过本实验,掌握在VC6.0环境下基于OpenGL程序开发的运行环境配置,了解基于OpenGL图形库的控制台图形程序开发框架,并对二维观察变换中相关函数的使用及参数有所了解。2、掌握OpenGL基本图元的绘制方法和属性控制方法,并编程实现综合使用多种图形函数绘制复杂图形。【实验内容】1. VC6.0环境下基于OpenGL程序开发的运行环境配置由于VC6.0应用程序开发系统只支持OpenGL核心库函数,而在程序开发中需使用大量核心库所不具有的函数,因此,在进行图形开发前需进行OpenGL程序开发的运行环境配置。在此需将有关的函数库文件拷贝到指定的文件目录下即可。过程如下:将OpenGL开发库子目录下INCLUDE所有文件拷贝到VC所在子目录的includegl目录下。将OpenGL开发库子目录下LIB所有文件拷贝到VC所在子目录的lib目录下。将OpenGL开发库子目录下DLL所有文件拷贝到windows所在子目录的system32目录下。2OpenGL控制台应用程序框架OpenGL控制台应用程序框架及各函数的作用、参数情况说明见教材2.2.1节 OpenGL控制台应用程序框架。3基本图元绘制该实验将综合利用第二章、第三章中有关基本图元及其属性控制的函数,自我设计能够将下属图形要素涵盖的图形,并编程实现。基本图元:应包括点、线段、各种多边形;属性控制:应包括颜色设置、不同大小的点(如1像素点、3像素点等)、不同类型的线段(实线、点划线等);绘制出屏幕坐标系的2个坐标轴,并利用绘制线段或多边形方式绘制1个圆。【实验报告要求】1简述VC+环境下OpenGL图形系统开发的一般过程。2总结在程序设计和实现过程中遇到的主要问题及解决过程。3图形坐标与世界坐标系、屏幕视口坐标系之间的关系是什么?在放大、缩小观察图形时应调节那些函数的那些参数?实验(二)【实验题目】 二维图元的几何变换【实验目的】1、了解和掌握二维坐标系中物体坐标、观察坐标、屏幕坐标之间的关系,能够在合适的位置定义物体的几何形状,并通过定义合适的观察坐标系在视口中显示出物体。2、了解和掌握以坐标原点、坐标轴为中心的物体几何变换方式,包括平移、旋转和缩放对应的函数。3、了解和掌握矩阵操作函数的原理和过程,并实现绕任意点或任意轴为参考进行平移、旋转、缩放程序。【实验内容】1 了解和掌握二维坐标系中物体坐标、观察坐标、屏幕坐标之间的关系。要求:对上一次编写的程序中的几何物体改变其几何位置和大小,改变gluOrtho2D函数中的参数,改变glViewport中的参数,观察所要绘制的图形和视口的位置发生了什么变化,并思考原因。2 了解和掌握以坐标原点、坐标轴为中心的物体几何变换方式。要求:绘制一个二维图形,并使用以坐标原点、坐标轴为参考的物体几何变换(包括平移、旋转和缩放)函数,对其进行相应的几何变换,并以不同颜色加以区分。3了解和掌握矩阵操作函数的原理和过程。要求:采用矩阵操作方式实现与第二步中相同的几何变换过程。4实现绕任意点或任意轴为中心进行平移、旋转、缩放程序。要求:根据课堂上所讲的绕任意点或任意轴为参考进行几何变换的原理,编写相应的旋转和缩放函数,并采用所实现的函数对所绘制的图形实现绕任意点或任意轴为参考的几何变换。【实验报告要求】1总结并简述绕任意点或任意轴为中心进行几何变换的原理。2总结在程序设计和实现过程中遇到的主要问题及解决过程。3用矩阵操作实现几何变换有何优点?实验(三)【实验题目】 线段、多边形裁剪算法实现【实验目的】1、深入了解和掌握Cohen_Sutherland线段裁剪算法的原理和程序实现过程。2、深入了解和掌握Sutherland-Hodgman多边形裁剪算法的原理和程序实现过程。【实验内容】1. 根据Cohen-Sutherland直线裁剪算法的原理,实现用矩形窗口对某线段的裁剪过程。要求:根据Cohen-Sutherland直线裁剪算法的原理,编写实现该算法的各个子函数,并在屏幕上画出用于裁剪的矩形窗口,用不同的颜色和线型标注被裁剪的线段及裁剪后的结果。2. 根据Sutherland-Hodgman多边形裁剪算法的原理,实现用矩形对某多边形的裁剪过程。要求:根据Sutherland-Hodgman多边形裁剪算法的原理,编写实现该算法的各个子函数,并在屏幕上画出用于裁剪的矩形窗口,用不同的颜色和线型标注被裁剪的多边形及裁剪后的结果。【实验报告要求】1总结在程序设计和实现过程中遇到的主要问题及解决过程。2在Cohen-Sutherland直线裁剪算法中若改变9个区域的编码方式会对裁剪结果产生什么影响?3在OpenGL中如何实现对二维图形的裁剪?实验(四)【实验题目】 三维观察算法实现【实验目的】1. 了解和掌握三维空间中几何物体的绘制方法。2. 了解和掌握三维观察变换的原理及OpenGL中实现三维观察变换函数的参数对三维观察的影响。【实验内容】1、了解和掌握三维空间中几何物体的绘制方法。要求:了解在三维空间坐标系中三维物体的定义方法,注意多边形内部和外部定义,并绘制一个包含内、外部的三维物体。2、实现三维观察变换。要求:利用gluPerspective等相关三维观察变换函数,实现对上面所绘制的三维物体进行三维裁剪和三维观察变换,并对函数中的参数进行改变,观察屏幕显示结果,进一步了解三维观察变换的原理。【实验报告要求】1总结三维观察变换相关函数中参数的不同变化对三维观察结果的影响。2总结在程序设计和实现过程中遇到的主要问题及解决过程。3glMatrixMode函数对三维观察变换有何影响?实验(五)【实验题目】 光照模型与纹理映射实现【实验目的】1 熟悉三维空间中光照模型的原理,掌握OpenGL中光照模型的定义方法。2 了解三维物体纹理映射的基本原理,掌握OpenGL中纹理映射的基本方法。【实验内容】1、 OpenGL中光照模型的定义方法的实现。要求:绘制一个空间三维物体,并在三维空间中定义不同的光源,涉及不同的光源类型、光的颜色,并开启光源,观察通过改变定义光源的不同参数,得到的绘制结果有何不同。2、 OpenGL中纹理映射的实现。要求:画出一个二维图形,并采用程序生成纹理或读入纹理图像的方法,对所绘制的二维图形进行纹理映射,通过改变不同的参数观察所得到的结果有何不同。【实验报告要求】1总结三维空间中定义光照模型的过程,及定义光照模型相关函数中参数的不同变化对观察结果的影响。2总结三维空间中纹理映射的过程,及纹理映射相关函数中参数的不同变化对观察结果的影响。2总结在程序设计和实现过程中遇到的主要问题及解决过程。附录A计算机图形学实验教学大纲一、制定实验教学大纲的依据根据本校2008级本科指导性培养计划和2008年6月制定的计算机图形学课程教学大纲制定。二、本实验课在专业人才培养中的地位和作用计算机图形学是数字媒体技术专业必修的一门专业基础课。通过本课程的学习,可以使学生了解计算机图形学所研究的内容、广泛的应用,掌握计算机图形的基本生成算法、图形几何变换的原理及实现方法、二维和三维观察、图形表示、曲线、曲面的图形生成技术及真实感图形等。同时结合OpenGL图形库的使用,使学生掌握图形程序开发的基本技术和方法。三、本实验课程讲授的基本实验理论主要讲授利用OpenGL图形库函数进行二维、三维图形的绘制的基本方法,从而使学生能将计算机图形学的基本理论与OpenGL图形开发实践有机结合起来,加深对理论的理解和应用实践能力。主要涉及图形光栅化原理,及基于光栅化原理的所进行的基本图元的生成、填充、裁剪算法、二维图形变换、二维和三维观察变换、光照模型和纹理映射等。1OpenGL运行环境配置及基本图元绘制;2二维观察变换及二维图形几何变换;3线段裁剪、多边形裁剪算法;4三维观察变换;5真实感图形绘制中光照模型的设置和纹理映射过程。四、本实验课学生应达到的能力本实验开设的目的:一方面使学生通过实验对图形学基本理论和算法在实践中的应用有一个直观、深刻的认识,从而使学生掌握将理论应用于实践的方法,同时对理论的认识得到深化;另一方面,通过编程训练加强了学生对基于OpenGL图形库的基本图形算法、二维图形变换、二三维观察变换、真实感图形处理等实际编程动手能力的训练;为学生进一步了解和掌握包括图形用户界面、CAD、数字图像处理等的原理、技术、方法打下坚实的理论和实践基础。五、学时、教学文件及形式学时:本课程总学时为48学时,其中实验为10学时,占总学时的20%。教学文件:校编计算机图形学实验指导书;实验报告学生自拟。要求学生实验前预习实验指导书,并理解相关算法思想及软件实现过程,具体编程过程由学生独立完成。六、实验考核办法与成绩评定实验课成绩占本课程总成绩15%,对缺少实验成绩者,本课程不予通过(对实验成绩的考核包括上机编程结果占50%,实验报告占40%,考勤占10%)。七、仪器设备及注意事项仪器设备:有快速的较高性能微机和较大内存与硬盘的设备注意事项:注意保护设备八、实验项目的设置及学时分配序号实 验 项 目学时实验类型要求适用专业备注1基本图元绘制2设计必修电子信息工程专业(图文处理方向)上机2二维图元的几何变换2验证必修电子信息工程专业(图文处理方向)上机3线段、多边形裁剪算法实现2验证必修电子信息工程专业(图文处理方向)上机4三维观察算法实现2设计必修电子信息工程专业(图文处理方向)上机5光照模型与纹理映射实现2验证必修电子信息工程专业(图文处理方向)上机制 定 人:吴学毅审 核 人:张二虎批 准 人:周世生制定日期:2008.7附录B实验环节详细说明实验(一):基本图元绘制一VC6.0环境下基于Win32控制台的OpenGL程序创建过程在Visual C+ 6.0环境下有两种OpenGL程序开发框架:(1)基于控制台的应用程序框架;(2)MFC环境下单文档、多文档、对话框应用程序框架。其中前者是最为简单、有效的知识验证型程序开发框架。基于控制台的OpenGL应用程序框架与一般的C语言程序结构一样,只是其中在定义图形窗口、初始化操作和图形数据处理与显示时,须使用相应的OpenGL函数。下面就基于控制台的应用程序框架开发过程简述如下:1由于VC6.0应用程序开发系统只支持OpenGL核心库函数,而在程序开发中需使用大量核心库所不具有的函数,因此,在进行图形开发前需进行OpenGL程序开发的运行环境配置。在此需将有关的函数库文件拷贝到指定的文件目录下即可。过程如下:将OpenGL开发库子目录下INCLUDE所有文件拷贝到VC所在子目录的includegl目录下。将OpenGL开发库子目录下LIB所有文件拷贝到VC所在子目录的lib目录下。将OpenGL开发库子目录下DLL所有文件拷贝到windows所在子目录的system32目录下。2.在创建新工程的Project标签中应选择“Win32 Console Application”,并选择适当的保存工程的文件夹路径。3在如图1所示的创建向导页面选择A “Hello,World!”application.选项。点击Finish按钮完成工程的创建。点击工具栏中的“Execute Program”按钮进行工程的编译、链接和运行,并出现Hell,World! Press any key to continue的运行结果。图1 工程创建向导4.在工程创建完毕需添加OpenGL库。选择“Project Setting”对话框,如图2所示。在对话框中选择“Link”标签,在“Object/library modules”编辑框中加入“”。opengl32.lib glu32.lib glaux.lib图2 工程设置对话框界面5在系统自动生成的*.cpp文件中,删去原文件内容,写入自己的程序代码。注意:1由于实验室的机器对C、D盘进行了写保护,因此,若机器中C、D盘中无相应的OpenGL库文件。则在每次上机时,需重新进行上述步骤1的库文件配置操作。二、OpenGL控制台应用程序框架OpenGL在Win32控制台下程序框架仍以main函数作为程序运行的入口,整个程序由3大部分组成。第1部分为应包含的头文件,其中主要是包含glut.h文件,该头文件包含了OpenGL运行所需要调用核心库和实用库中的相关头文件。第2部分为OpenGL绘制图形所需的相关函数的声明和定义,其中主要涉及:设置OpenGL运行初始环境,如myInit函数。绘制所要显示的图形,如myDisplay。响应窗口变化,如myReshape。以上3部分得主要程序结构在所有的win32控制台程序框架中均相似,但每部分在不同的应用中有所不同,要根据实际的绘图需求来具体写相关代码。第3部分为main函数的框架,在初级的应用中main函数调用的函数基本不变,主要是其中的一些参数可根据实际需要进行变动。/第1部分-在此给出了OpenGL运行所需要的3个头文件#include stdafx.h#include windows.h#include GL/glut.h/第2部分OpenGL函数声明void myInit(void);void myReshape(GLsizei w,GLsizei h);void myDisplay(void);/OpenGL相关函数的定义void myInit(void) /设置OpenGL运行初始环境glClearColor(1.0,1.0,1.0,0.0); /清除背景颜色为白色glShadeModel(GL_FLAT); /设置图形绘制模式void myDisplay(void) /绘制所要显示的图形glClear(GL_COLOR_BUFFER_BIT); /清除颜色缓冲区glColor4f(0.2,0.6,1.0,1.0); /设置图形绘制颜色glutWireTeapot(0.5); /绘制线框茶壶glFlush(); /完成绘制void myReshape(GLsizei w,GLsizei h) /响应窗口变化glViewport(0,0,w,h); /设置窗口缩放时的视口变换/第3部分mian函数框架int main(int argc, char* argv) /初始化显示模式,并将窗口显示模式定义为单缓冲区、RGBA颜色glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,150); /设置显示窗口左上角位置glutInitWindowSize(200,350); /设置显示窗口宽度和高度glutCreateWindow(控制台OpenGL框架); /创建窗口并设置标题myInit(); /绘制状态初始化glutReshapeFunc(myReshape); /当窗口发生变化时,调用myReshape重新定义窗口属性glutDisplayFunc(myDisplay); /调用myDisplay在窗口中绘制图形glutMainLoop(); /循环绘制图形和响应事件处理三、基本图元绘制该部分可参考以下程序完成基本图元的绘制和属性的控制,但要求不能完全照搬,可在历届的基础上进行适当的修改。#include stdafx.h#include GL/glut.hvoid myInit(void);void myReshape(GLsizei w,GLsizei h);void myDisplay(void);void myInit(void) /设置OpenGL运行初始环境glClearColor(1.0,1.0,1.0,0.0); /清除背景颜色为白色glShadeModel(GL_SMOOTH); /设置图形绘制模式void myDisplay(void) /绘制所要显示的图形glClear(GL_COLOR_BUFFER_BIT); /清除颜色缓冲区glColor4f(0.2,0.6,1.0,1.0); /设置图形绘制颜色/绘制线段glBegin(GL_LINES);glVertex2i(40,60); glVertex2i(-30,36);glEnd();/绘制折线glBegin(GL_LINE_STRIP);glColor3f(1.0,1.0,0.0); glVertex2f(10.0,-80.0); glVertex2f(30.0,-20.0); /黄色glColor3f(0.0,1.0,0.0); glVertex2f(40.0,-80.0); glVertex2f(45.0,-20.0); /绿色 glColor3f(0.0,0.0,1.0); glVertex2f(50.0,-80.0); glVertex2f(70.0,-10.0); /蓝色glEnd();/绘制封闭线glBegin(GL_LINE_LOOP);glColor3f(1.0,0.0,0.0); /红色glVertex2f(-10.0,-30.0); glVertex2f(-30.0,-20.0);glColor3f(0.0,1.0,0.0); /绿色glVertex2f(-40.0,-30.0); glVertex2f(-45.0,-20.0);glColor3f(0.0,0.0,1.0); /蓝色glVertex2f(-50.0,-30.0); glVertex2f(-70.0,-10.0); glEnd();glColor3f(0.0,1.0,0.0); /绿色/绘制三角形glBegin(GL_TRIANGLES);glVertex2i(20,70); glVertex2i(50,80); glVertex2i(60,55);glEnd();glColor3f(0.0,0.0,1.0); /蓝色/绘制相连三角形glBegin(GL_TRIANGLE_STRIP);glVertex2i(-20,30); glVertex2i(-50,-10); glVertex2i(-60,35);glVertex2i(-80,45);glEnd();/绘制相连的四边形的顶点glColor3f(0.0,0.0,1.0); /蓝色glPointSize(3.0);glBegin(GL_POINTS);glVertex2i(20,30); glVertex2i(50,-10); glVertex2i(60,35);glVertex2i(80,45); glVertex2i(85,60); glVertex2i(90,55);glEnd();glColor3f(1.0,0.0,0.0); /红色glBegin(GL_QUAD_STRIP);glVertex2i(20,30); glVertex2i(50,-10); glVertex2i(60,35);glVertex2i(80,45); glVertex2i(85,60); glVertex2i(90,55);glEnd();glFlush(); /强制绘制/此处根据窗口的变化设置视口和裁剪窗口void myReshape(GLsizei w,GLsizei h) GLfloat nR=100.0f; if (h=0) /防止被0除 h=1; glViewport(0,0,w,h); /将视口区设置为原点位于左下角,宽度为w,高度为hglMatrixMode(GL_PROJECTION); /设置当前投影矩阵堆栈glLoadIdentity();/建立裁剪体if (w=h)glOrtho(-nR,nR,-nR*h/w,nR*h/w,-nR,nR); elseglOrtho(-nR*w/h,nR*w/h,-nR,nR,-nR,nR); glMatrixMode(GL_MODELVIEW); /设置模型观察矩阵堆栈glLoadIdentity();绘制屏幕坐标系的2个坐标轴可在myDisplay函数中,按绘制线段的方式指定2个坐标轴的2对顶点坐标,如(0,0)与(10,0)为x轴,(0,0)与(0,10)为y轴。对于利用线段或多边形绘制函数绘制1个圆,主要的问题是如何计算构成圆周上各个顶点的坐标值。可利用圆的极坐标方程:来计算圆周上各点的坐标。其中N为将圆周等分的份数,n为每次循环的计数。注意的问题:在程序编译、链接、运行均无错误的情况下,经常会出现看不到所绘制的图形的情况,引起该情况的主要可能原因如下:1 在使用glVertex函数指定顶点坐标时,函数的指定参数类型与实际给定的参数类型不符,如glVertex2f(20,30);2 在图形绘制函数如没有Display中没有调用glFlush(); 进行强制绘制。3 在使用glVertex函数指定顶点坐标值超出glOrtho或glOrtho2D所定义的裁剪体范围。实验(二):二维图元的几何变换本实验包含4个环节:一、了解和掌握二维坐标系中物体坐标、观察坐标、屏幕坐标之间的关系。在实验一所绘制的基本图元的基础上,通过改变glVertex函数所指定的顶点位置来理解顶点对几何物体位置和大小的影响;通过改变glBegin的参数来理解不同基本图元绘制参数与顶点坐标对物体形状的影响;通过改变glOrtho2D函数中的参数来理解裁剪体范围、是如何指定的及其对显示的场景范围的影响;通过改变glViewport中的参数,观察所要绘制的图形和视口的位置发生了什么变化,并思考原因。二、 了解和掌握以坐标原点、坐标轴为中心的物体几何变换方式。理解在OpenGL中几何变换的2重含义,一种是从对所绘制物体本身的几何变换,一种可以从对坐标系的几何变换来理解,其中后者是最根本的方式。在OpenGL的图形绘制中,模型视图矩阵对图形绘制的顶点坐标会产生影响,在使用几何变换函数(包括平移、旋转和缩放)对图形进行变换时,实质上是改变了模型视图矩阵的内容,并将模型视图矩阵乘物体指定的顶点坐标,所得结果为施加几何变换后物体的真正坐标。glMatrixMode(GL_MODELVIEW) 函数指定了当前使用的矩阵为模型视图矩阵。glLoadIdentity()函数可将模型视图矩阵变为单位阵,从而可以还原坐标系。绘制一个二维图形,并使用以坐标原点、坐标轴为中心的物体几何变换(包括平移、旋转和缩放)函数,对其进行相应的几何变换,并以不同颜色加以区分,可参考以下代码:#include stdafx.h#include windows.h#include #include #include GLsizei winWidth=600,winHeight=600; /Initial display-window sizestatic void init(void)glClearColor(1.0,1.0,1.0,0.0); /set display window color to whitevoid displayFcn(void)glClear(GL_COLOR_BUFFER_BIT); /Clear display window/使用glLoadIdentity函数的几何变换glMatrixMode(GL_MODELVIEW);glLoadIdentity();glColor3f(0.0,0.0,1.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();/用蓝色绘制矩形区域glColor3f(0.0,0.0,1.0); glRecti(50,100,200,150);glColor3f(1.0,0.0,0.0); /用红色绘制向右上角平移的矩形区域glTranslatef(100.0,180.0,0.0);glRecti(50,100,200,150);glColor3f(1.0,0.0,0.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();/用绿色绘制坐标原点返回到初始位置绕z轴旋转45的矩形区域glColor3f(0.0,1.0,0.0); glLoadIdentity();glRotatef(45.0,0.0,0.0,1.0);glRecti(50,100,200,150);glColor3f(0.0,1.0,0.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();glColor3f(1.0,1.0,0.0); /用黄色绘制 在x轴方向缩小-0.5的矩形区域 glLoadIdentity();glScalef(-0.5,1.0,1.0);glRecti(50,100,200,150);glColor3f(1.0,1.0,0.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();glFlush();void winReshapeFcn(int newWidth, int newHeight) / Set Viewport to window dimensions if (newHeight=0) /防止被0除newHeight=1; glViewport(0,0,newWidth,newHeight); /将视口区设置为原点位于左下角,宽度为w,高度为hglMatrixMode(GL_PROJECTION); /设置当前投影矩阵堆栈glLoadIdentity();/建立裁剪体 gluOrtho2D(-200,400,-200,400); glMatrixMode(GL_MODELVIEW); /设置模型观察矩阵堆栈glLoadIdentity();三、了解和掌握矩阵操作函数的原理和过程。使用矩阵的堆栈操作方式同样可以完成对图形的几何变换,且是一种简洁、高效的方式。可参考如下代码完成采用矩阵操作方式实现与第二步中相同的几何变换过程。glMatrixMode(GL_MODELVIEW); glColor3f(0.0,0.0,1.0);glRecti(50,100,200,150);glPushMatrix();glColor3f(1.0,0.0,0.0);glTranslatef(100.0,150.0,0.0);glRecti(50,100,200,150);glPopMatrix();glPushMatrix();glColor3f(0.0,1.0,0.0);glRotatef(90.0,0.0,0.0,1.0);glRecti(50,100,200,150);glPopMatrix();glColor3f(1.0,1.0,0.0);glScalef(-0.5,1.0,1.0); glRecti(50,100,200,150);四、实现绕任意点或任意轴为中心进行平移、旋转、缩放程序。绕任意轴进行旋转变换和以任意点为参考点进行缩放的自定义函数实现。其中wcPt3D为一个三维点类,其定义如下:class wcPt3D pulic: GLfloat x,y,z;/三维点的坐标值;l 绕任意轴进行三维旋转变换在如下的绕任意轴进行旋转变换的函数实现中,参数P1、P2为指定的旋转轴,theta为旋转角度。void rotate3D(wcPt3D p1,wcPt3D p2,GLfloat theta)/* 计算P2P1向量的x、y、z分量 */GLfloat vx=(p2.x-p1.x);GLfloat vy=(p2.y-p1.y);GLfloat vz=(p2.z-p1.z);/* 按5.52式中顺序进行逆平移-旋转-平移的变换 */glTranslatef(p1.x,p1.y,p1.z); /将 p1平移回原始位置glRotatef(theta,vx,vy,vz); /绕(vx,vy,vz)向量旋转theta角glTranslatef(-p1.x,-p1.y,-p1.z); /将p1平移到坐标原点l 以任意点为参考点进行三维缩放变换在如下的以任意点为参考点进行三维缩放变换的实现中,参数fixedPt为某参考点,sx、sy、sz为缩放因子。void scale3D(GLfloat sx,GLfloat sy,GLfloat sz,wcPt3D fixedPt)/*按5.50式中顺序进行逆平移-缩放-平移的变换 */* 将参考点移回到原始位置*/glTranslatef(fixedPt.x,fixedPt.y,fixedPt.z);glScalef(sx,sy,sz); /以原点为参考点进行缩放变换glTranslatef(-fixedPt.x,-fixedPt.y,-fixedPt.z); /将参考点移至坐标原点实验(三):线段、多边形裁剪算法实现本节是两个验证性实验,通过对代码的阅读,理解相应的算法是如何通过代码来实现。一、 根据Cohen-Sutherland直线裁剪算法的原理,实现用矩形对某线段的裁剪过程。根据Cohen-Sutherland直线裁剪算法的原理,编写实现该算法的各个子函数,并在屏幕上画出用于裁剪的矩形窗口,用不同的颜色和线型标注被裁剪的线段及裁剪后的结果。其算法实现如下:/ Cohen_Sutherland_console.cpp : Defines the entry point for the console application.#include #include / Header File For The Glut Library/*根据两个端点的编码code1、code2,判断线段是否在窗口内,若flag返回0则表明该线段不在窗口内,返回1则表明该线段在窗口内。*/int accept(int code1, int code2)int i,flag;flag=1;for(i=0;i4;i+)if(code1i=1)|(code2i)=1) /若code的某位不为0,则表明该线段不在窗口内flag=0;break;return flag;/根据点(x,y)所在区域,赋予code数组各位相应的编码void encode(int x, int y, int code, int xw_min, int xw_max, int yw_min, int yw_max)int i;/将code的各个元素初始化为0for(i=0;i4;i+)codei=0;if(xxw_max)code2=1;if(yyw_max)code1=1;else if(yyw_min)code0=1;/*根据两个端点的编码code1、code2,判断线段是否在窗口外,若flag返回1则表明该线段在窗口某边框的同一外侧,返回0则表明该线段不会在窗口的同一侧。*/int reject(int code1, int code2)int i,flag;flag=0;for(i=0;i4;i+)if(code1i=1)&(code2i=1) /code的某位同为1,则表明线段在窗口同一侧flag=1;break;return flag;/*判断(x1,y1)点是否在窗口内,若在窗口内,则将(x1,y1)与(x2,y2)进行交换,使得(x1,y1)点始终为被裁剪的线段的起点。*/int swap_if_needed(int code1, int code2)int i,flag1,flag2,tmp; flag1=1;/*若code1有1位为1,则flag1=0,表明端点1在窗外;若code1的每一位均为0,则flag1=1,表明端点1在窗内。*/for(i=0;i4;i+)if(code1i=1)flag1=0;break;/对第二个端点的判别与端点1相同flag2=1;for(i=0;i4;i+) if(code2i=1)flag2=0;break;/端点1、2均在窗外,返回0if(flag1=0)&(flag2=0)return 0;/若端点1在窗内,端点2在窗外,则需交换两个端点if(flag1=1)&(flag2=0)for(i=0;i4;i+)tmp=code1i;code1i=code2i;code2i=tmp;return 1;return 0;/*此为裁剪函数的主入口,上述4个辅助函数均在此处调用。函数参数(x1,y1)、(x2,y2)为两个端点坐标,后四个参数为裁剪窗口的坐标。done表示裁剪是否结束,值为0表示裁剪尚未结束。display表示是否需要显示,为1表示需要显示。*/void clip_line(float x1, float y1, float x2, float y2, int xw_min, int xw_max, int yw_min, int yw_max)int code14,code24,done,display;float m;float x11,y11,x22,y22,mark;done = 0;display = 0;while (done = 0)x11 = x1;x22 = x2;y11 = y1;y22 = y2;encode(x1,y1,code1,xw_min,xw_max,yw_min,yw_max); /给第一个端点编码encode(x2,y2,code2,xw_min,xw_max,yw_min,yw_max); /给第二个端点编码/若线段在窗口内部,则裁剪结束并显示该线段if (accept(code1,code2)done = 1;display = 1;break;/若线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 探秘软件设计师考试试题及答案攻略
- 统计学的应用实例研究试题及答案
- 投资决策风险题及答案
- 网络管理与用户体验试题及答案
- 软件设计师考试反馈与调整试题及答案
- 法学概论学生交流平台搭建试题及答案
- 信息系统架构的优化与合理化建议试题及答案
- 行政管理试题设计与答案分析
- 2025年软考设计师的核心试题及答案
- 高考数学自我提升与试题及答案
- 国标美标德标日表法兰尺寸标准
- 测绘生产困难类别细则及工日定额
- 国民经济行业分类2022年
- 兽医药理学 第15章 特效解毒药
- 空乘人员职业形象设计与化妆(169张课件)
- 会计工作年限证明个人承诺书
- 物业公共秩序管理课件
- 浅谈摩托艇的安全管理
- 女性功能治疗方案ppt课件
- 公路工程计量与计价考试B本科
- 医用耗材分类目录 (低值 ╱ 高值)
评论
0/150
提交评论