版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高级图形图像第一次实验报告1、 实验描述以及关键步骤1. opengl编程环境组建(基于VC6.0)1) 下载opengl开发库文件夹;2) 复制glut32.dll和glut.dll到windowssystem32;3) 复制glut.h到.Microsoft Visual StudioVC98IncludeGL;4) 复制glut32.lib和glut.lib到Microsoft Visual StudioVC98Lib;5) 新建工程后,进入Project菜单,选Settings项,弹出 Settings 对话框,选Link项,在 Libraries 栏目中加入OpenGL库:openg
2、l32.lib glu32.lib glaux.lib。2. 基本图形绘制 首先运行一个Windows环境下的一个基本OpenGL程序,直接打开60version文件夹内的工程,它将显示一个空的OpenGL窗口,可以在定制窗口大小和全屏模式下切换(按F1),按ESC退出,该程序为以后的应用程序提供了实验平台,并预留了绘图接口。 根据教材P67-70,了解绘制函数,根据附件2提供的源码baseshape.cpp,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,修改图形绘制命令和参数,显示出点、线、矩形、三角形等,可设置不同线宽。3. 图形的二维变换 根据附件3提供源码,
3、将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,通过调用glTranslate*, glRotate*,glscale*等二维变换函数实现平移、旋转、缩放等变换,通过参数操作和矩阵操作两种方式执行。 glTranslatef:在opengl中,函数glTranslatef的作用就是移动坐标原点。 glRotatef:glRotatef( angle, x, y, z )函数的作用是将当前坐标系以a( x, y, z )向量为旋转轴旋转angle角度,满足右手法则,即沿着右手握拳时四个手指指向的方向旋转。 glScalef:模型缩放函数。4. 二维观察流水线 根据附件v
4、iewport.cpp提供的源代码和课本P253-259,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,参考glut窗口操作函数,实现同一窗口中的视口变换和多视口显示。5. 分形 在完成前面工作的基础上,引入分形的递归算法,通过绘制小的三角形动作,生成Sierpinski镂垫。二、 实验步骤解析1. 首先用vc6.0新建一个支持MFC的工程,把附件所给的空窗口的源代码拷贝到工程里,运行,显示一个空窗。如图1。2. 将附件2提供的源码代替上一步骤中的Drawsence()函数,运行窗口中显示出一个三角形和一个正方形,如图2。3. 修改上述程序,实现画两个点,线段,矩形
5、,如图3。4. 改变上一个步骤中的线宽,画出不同宽度的线段。如图4。5. 将附件3提供的源代码代替上一步骤中的Drawsence()函数,运行窗口中显示缩放,平移,旋转的三角形和正方形。如图5。6. 修改上述程序,用矩阵方法实现平移,缩放和旋转。如图6。7. 修改上述程序,用参数方法实现平移、旋转和缩放,并添加颜色。如图7,图8。8. 将附件viewport.cpp代替上述程序中的Drawsence()函数,实现同一窗口中的视口变换和多视口显示。如图9。9. 修改上述程序,实现同一窗口中的视口变换和多视口显示。如图10。10. 在完成前面工作的基础上,引入分形的递归算法,通过绘制小的三角形动作
6、,生成Sierpinski镂垫。如图11。 3、 编程思路及实现1. 空窗程序 这个程序运行后给出一个黑色背景的空窗,在DrawGLScene函数中,不写任何图形绘制的代码,仅仅进行初始设置。设置F1键的功能为跳出全屏窗口。int DrawGLScene(GLvoid)/ 从这里开始进行所有的绘制glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清除屏幕和深度缓存glLoadIdentity();/ 重置当前的模型观察矩阵return TRUE;/ 一切 OK2. 画三角形和正方形 画三角形调用glBegin(GL_TRIANGLES)函
7、数,函数中只要指定三个点即可。接着在三角形右侧3个单位距离处画正方形,用glBegin(GL_QUADS),需要四个点。int DrawGLScene(GLvoid)/glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清除屏幕及深度缓存glLoadIdentity(); / 重置当前的模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f);/ 左移 1.5 单位,并移入屏幕 6.0 glBegin(GL_TRIANGLES); / 绘制三角形glVertex3f( 0.0f, 1.0f, 0.0f);/ 上顶点glVe
8、rtex3f(-1.0f,-1.0f, 0.0f);/ 左下glVertex3f( 1.0f,-1.0f, 0.0f);/ 右下glEnd(); / 三角形绘制结束 glTranslatef(3.0f,0.0f,0.0f);/ 右移3单位 glBegin(GL_QUADS); / 绘制正方形glVertex3f(-1.0f, 1.0f, 0.0f);/ 左上glVertex3f( 1.0f, 1.0f, 0.0f);/ 右上glVertex3f( 1.0f,-1.0f, 0.0f);/ 左下glVertex3f(-1.0f,-1.0f, 0.0f);/ 右下glEnd(); / 正方形绘制结束
9、return TRUE; / 继续运行3.画点,线段,矩形 画点是最基础的绘制,使用glBegin(GL_POINTS)函数。由于单独一个点非常小,我们渲染成原来的5倍大小,用函数glPointSize(5.0f)。画线段用glBegin(GL_LINES),线段加粗用函数glLineWidth(5.0f)。画长方形与画正方形一样,只是用函数glBegin(GL_POLYGON)。/画点,线,矩型int DrawGLScene(GLvoid)/ Heres Where We Do All The DrawingglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUF
10、FER_BIT);/ 清除屏幕及深度缓存glLoadIdentity(); / 重置当前的模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f);/ 左移 1.5 单位,并移入屏幕 6.0 glPointSize(5.0f); /画两个点 glBegin(GL_POINTS); glVertex2f(0.0f, 0.0f); glVertex2f(1.0f, 0.0f); glEnd();glLineWidth(5.0f); glBegin(GL_LINES); /画线段 glVertex2f(2.0f, 0.0f); glVertex2f(3.0f, 0.0f); glE
11、nd(); glBegin(GL_POLYGON); /按顺时针绘制一个长方形,在右上方 glVertex2f(0.0f, 1.0f); glVertex2f(0.0f, 1.5f); glVertex2f(1.0f, 1.5f); glVertex2f(1.0f, 1.0f); glEnd(); return TRUE; / 继续运行4.改变线段的宽度 根据上个步骤,画出几条粗细不同的线段,互为对比。/改变宽度int DrawGLScene(GLvoid)/ Heres Where We Do All The DrawingglClear(GL_COLOR_BUFFER_BIT | GL_D
12、EPTH_BUFFER_BIT);/ 清除屏幕及深度缓存glLoadIdentity(); / 重置当前的模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f);/ 左移 1.5 单位,并移入屏幕 6.0 glLineWidth(5.0f); glBegin(GL_LINES); /画线段 glVertex2f(0.0f, 1.0f); glVertex2f(2.0f, 1.0f);glEnd();glLineWidth(8.0f); glBegin(GL_LINES); /画线段 glVertex2f(0.0f, 0.0f); glVertex2f(2.0f, 0.0f)
13、; glEnd(); glLineWidth(12.0f); glBegin(GL_LINES); /画线段 glVertex2f(0.0f, -1.0f); glVertex2f(2.0f, -1.0f); glEnd();return TRUE; / 继续运行5. 平移,缩放,旋转 平移使用函数glTranslatef(3.0f,1.0f,0.0f),把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别是向x,y,z方向平移的距离。这个函数要用在绘制函数之前。缩放使用函数glScalef(1.5f,0.5f,0.0f),把当前矩阵和一个表示缩放物体的矩阵相乘。三个参数分别是x,y,z方向上
14、的缩放倍数。 旋转用函数glRotatef(rtri,0.0f,1.0f,0.0f),把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数rtri表示旋转的角度。/平移,缩放和旋转GLfloatrtri;/ 用于三角形的角度GLfloatrquad;/ 用于四边形的角度int DrawGLScene(GLvoid)/ Heres Where We Do All The Drawing glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清除屏幕及深度缓存glLoadIdentity();
15、/ 重置模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f); / 左移 1.5 单位,并移入屏幕 6.0 glBegin(GL_TRIANGLES); / 绘制三角形glColor3f(1.0f,0.0f,0.0f);/ 设置当前色为红色glVertex3f( 0.0f, 1.0f, 0.0f);/ 上顶点/glColor3f(0.0f,1.0f,0.0f);/ 设置当前色为绿色glVertex3f(-1.0f,-1.0f, 0.0f);/ 左下/glColor3f(0.0f,0.0f,1.0f);/ 设置当前色为蓝色glVertex3f( 1.0f,-1.0f, 0.0
16、f);/ 右下glEnd(); / 三角形绘制结束 glScalef(1.5f,0.5f,0.0f); / 三角形缩放glTranslatef(2.0f,1.0f,0.0f);/ 三角形向x方向移动1个单位 glRotatef(rquad,1.0f,0.0f,0.0f);/ 绕X轴旋转四边形 glBegin(GL_QUADS);/ 绘制正方形glVertex3f(-1.0f, 1.0f, 0.0f);/ 左上glVertex3f( 1.0f, 1.0f, 0.0f);/ 右上glVertex3f( 1.0f,-1.0f, 0.0f);/ 左下glVertex3f(-1.0f,-1.0f, 0.
17、0f);/ 右下glEnd();/ 正方形绘制结束rtri+=0.2f;/ 增加三角形的旋转变量rquad-=0.15f;/ 减少四边形的旋转变量return TRUE;/ 继续运行6. 矩阵方法实现平移,缩放和旋转GLfloatrtri;/ 用于三角形的角度GLfloatrquad;/ 用于四边形的角度int DrawGLScene(GLvoid)/ Heres Where We Do All The Drawing GLfloat moveMatrix= 1.0f, 0.0f,0.0f,0.0f, 0.0f,1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
18、 -1.5f, 0.0f, -6.0f, 1.0f ; GLfloat rotateYMatrix= cos(rtri),0.0f,-sin(rtri),0.0f, 0.0f,1.0f,0.0f,0.0f, sin(rtri),0.0f,cos(rtri),0.0f, 0.0f,0.0f,0.0f,1.0f ; GLfloat moveMatrix1= 1.0f, 0.0f,0.0f,0.0f, 0.0f,1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.5f, 0.0f, -6.0f, 1.0f ; GLfloat rotateXMatrix1= 1.0
19、f, 0.0f, 0.0f, 0.0f, 0.0f, cos(rquad), -sin(rquad), 0.0f, 0.0f, sin(rquad), cos(rquad), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f ; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清除屏幕及深度缓存glMatrixMode( GL_MODELVIEW ); glLoadIdentity();/ 重置模型观察矩阵glMultMatrixf(moveMatrix); / 左移 1.5 单位,并移入屏幕 6.0 glMultMatrixf
20、(rotateYMatrix); glBegin(GL_TRIANGLES);/ 绘制三角形/glColor3f(1.0f,0.0f,0.0f);/ 设置当前色为红色glVertex3f( 0.0f, 1.0f, 0.0f);/ 上顶点/glColor3f(0.0f,1.0f,0.0f);/ 设置当前色为绿色glVertex3f(-1.0f,-1.0f, 0.0f);/ 左下/glColor3f(0.0f,0.0f,1.0f);/ 设置当前色为蓝色glVertex3f( 1.0f,-1.0f, 0.0f);/ 右下glEnd();/ 三角形绘制结束 glLoadIdentity();/ 重置模
21、型观察矩阵glMultMatrixf(moveMatrix1); / 右移1.5单位,并移入屏幕 6.0 glMultMatrixf(rotateXMatrix1); / 绕X轴旋转四边形 /glColor3f(0.5f,0.5f,1.0f);/ 一次性将当前色设置为蓝色glBegin(GL_QUADS);/ 绘制正方形glVertex3f(-1.0f, 1.0f, 0.0f);/ 左上glVertex3f( 1.0f, 1.0f, 0.0f);/ 右上glVertex3f( 1.0f,-1.0f, 0.0f);/ 左下glVertex3f(-1.0f,-1.0f, 0.0f);/ 右下glE
22、nd(); / 正方形绘制结束rtri+=0.005f;/ 增加三角形的旋转变量rquad-=0.005f;/ 减少四边形的旋转变量return TRUE;/ 继续运行7.用参数方法平移、缩放和旋转三角形/用参数方法平移、缩放和旋转三角形GLfloatrtri;/ 用于三角形旋转的角度,需设为全局变量GLfloatrquad;/ 用于四边形旋转的角度,需设为全局变量int DrawGLScene(GLvoid)/ Heres Where We Do All The Drawing glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 清除屏幕
23、及深度缓存glLoadIdentity(); / 重置模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f); / 左移 1.5 单位,并移入屏幕 6.0 glBegin(GL_TRIANGLES); / 绘制三角形glColor3f(1.0f,0.0f,0.0f); / 设置当前色为红色glVertex3f( 0.0f, 1.0f, 0.0f);/ 上顶点glVertex3f(-1.0f,-1.0f, 0.0f);/ 左下glVertex3f( 1.0f,-1.0f, 0.0f);/ 右下glEnd(); / 三角形绘制结束 glRotatef(rtri,3.0f,0.0f
24、,0.0f);/ 绕x轴旋转三角形 glBegin(GL_TRIANGLES); / 绘制三角形glColor3f(0.0f,0.0f,1.0f); / 设置当前色为蓝色glVertex3f(3.0f,1.0f, 0.0f);/ 上顶点glVertex3f(1.5f,0.0f, 0.0f);/ 左下glVertex3f(4.5f,0.0f, 0.0f);/ 右下glEnd(); / 三角形绘制结束 rtri+=0.2f; / 增加三角形的旋转变量 return TRUE; / 继续运行8.视口变换和多视口显示void renderGL2() /视口一 左下角 glEnable(GL_SCISS
25、OR_TEST); glScissor(0,0,window_width/2-1,window_height/2-1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); glViewport(0,0,window_width/2-1,window_height/2-1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)window_width/(GLfloat)window_h
26、eight,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /绘制部分 glTranslatef(0.0f ,0.0f ,-5.0f ); glRotatef(rtri,0.0f ,1.0f ,0.0f ); /绘制一个三角锥 glBegin( GL_TRIANGLE_STRIP ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(-1.0, -1.0, 1.0 ); glCol
27、or3f( 0.0, 0.0, 1.0 ); glVertex3f( 1.0, -1.0, 1.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 ); glColor3f( 1.0, 0.0, 0.0 ); glVertex3f( 0.0, 1.0, 0.0 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex3f(-1.0, -1.0, 1.0 ); glEnd(); /视口二 左上角 glEnable(GL_SCISSOR_TEST); glScissor(0,window_height/2+
28、1,window_width/2-1,window_height/2-1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); glViewport(0,window_height/2+1,window_width/2-1,window_height/2-1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)window_width/(GLfloat)window_height,
29、0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /绘制部分 glColor3f(1.0f,0.0f,1.0f); glTranslatef(0.0f,0.0f,-9.0f); glRotatef(rtri,1.0,1.0,0.0); glBegin(GL_TRIANGLES); / 绘制三角形 glVertex3f( 0.0f, 1.0f, 0.0f);/ 上顶点 glVertex3f(-1.0f,-1.0f, 0.0f);/ 左下 glVertex3f( 1.0f,-1.0f, 0.0f);/ 右下 glEnd(); /
30、 三角形绘制结束 /视口三 右下角 glEnable(GL_SCISSOR_TEST); glScissor(window_width/2+1,0,window_width/2-1,window_height/2-1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); glViewport(window_width/2+1,0,window_width/2-1,window_height/2-1); glMatrixMode(GL_PROJECTION); glLoadIdentit
31、y(); gluPerspective(45.0f,(GLfloat)window_width/(GLfloat)window_height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /绘制部分 glTranslatef(0.0f,0.0f,-2.0f); glRotatef(-45.0f,1.0f,0.0f,0.0f); glRotatef(rtri,0.0f,0.0f,1.0f); glBegin(GL_QUADS); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 0.5f, 0.
32、5f, 0.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f(-0.5f, 0.5f, 0.0f); glColor3f(0.0f,0.0f,1.0f); glVertex3f(-0.5f, -1.0f, 0.0f); glColor3f(0.0f,0.0f,0.0f); glVertex3f( 0.5f, -1.0f, 0.0f); glEnd(); /视口四 右上角 glEnable(GL_SCISSOR_TEST); glScissor(window_width/2+1,window_height/2+1, window_width/2-1, wind
33、ow_height/2-1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); glViewport(window_width/2+1,window_height/2+1, window_width/2-1, window_height/2-1); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)window_width/(GLfloat)window_height,0.1f,1
34、00.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /绘制部分 glColor3f(0.0f,0.0f,0.0f); glTranslatef(0.0f,0.0f,-4.0f); glRotatef(-rtri/2,1.0f,0.0f,0.0f); glRotatef(-rtri/2,0.0f,1.0f,0.0f); glRotatef(-rquad/2,0.0f,0.0f,1.0f); glBegin(GL_QUADS); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 0.5f, 0.5f, 0.0f);
35、 glColor3f(0.0f,1.0f,0.0f); glVertex3f(-0.3f, 0.5f, 0.0f); glColor3f(0.0f,0.0f,1.0f); glVertex3f(-0.5f, -1.0f, 0.0f); glColor3f(0.0f,0.0f,0.0f); glVertex3f( 0.5f, -1.0f, 0.0f); glEnd(); rtri+=0.2f; / 旋转变量 rquad-=0.15f; / 旋转变量 SDL_GL_SwapBuffers( );void initGL( int width, int height ) float ratio = (
36、float) width / (float) height; / Our shading model-Gouraud (smooth). glShadeModel( GL_SMOOTH ); / Set the clear color. glClearColor( 0, 0, 0, 0 ); / Setup our viewport. glViewport( 0, 0, width, height ); /Change to the projection matrix and set our viewing volume. glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 60.0, ratio, 1.0, 100.0 ); 9.镂垫/二维递归镂垫#include / Windows的头文件#include /包含最新的gl.h#include /包含最新的glu.h库#include /X windows系统应用库#include / a point d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 景区水域内部管理制度范本
- 上海财经大学浙江学院《流行病学与循证医学》2024-2025学年第二学期期末试卷
- 机务段内部联系制度
- 机电工区内部市场制度
- 湘潭理工学院《国际新闻》2024-2025学年第二学期期末试卷
- 济南公司内部控制制度
- 海外工程内部规章制度
- 沈阳航空航天大学北方科技学院《住宅空间设计》2024-2025学年第二学期期末试卷
- 环保集团内部制度
- 科研内部公开制度
- 丹纳赫传奇+从100万到亿美金的奇迹+22%年化复利密码
- 2026年长沙商贸旅游职业技术学院单招职业技能测试题库完美版
- 广东省数字政府政务云服务(2025年)项目采购需求
- 2025年港澳联考真题卷子及答案
- 白求恩课件介绍
- 2025年国家公务员考试国考行测真题附答案详解【综合卷】
- 人事股工作职责
- 焊工入场安全教育培训课件
- 光敏反应药物科普
- 巡察课件讲稿
- 肿瘤生存者管理专家共识
评论
0/150
提交评论