aspect裁剪四棱台上底面
命令:
glViewport
函数原型:
voidglViewport(GLintx0,GLinty0,GLsizeiwidth,GLsizeiheight);
功能:
产生视口变换,将在三维空间中可以显示在屏幕上的点映射到视口中。
参数:
x0,y0视口左下角点在视图窗口坐标下的坐标值;
width视口的宽度;
height视口的高度。
命令:
glVertex3d
函数原型:
voidglVertex3d(GLdoublex,GLdoubley,GLdoublez);
功能:
用在一对函数glBegin和glEnd之间,用来指定一个顶点的坐标值。
参数:
x,y,z顶点坐标的三个分量。
命令:
glBegin和glEnd
函数原型:
voidglBegin(GLenummode);
voidglEnd(void);
功能:
函数glBegin和glEnd共同组成一个函数对。
在函数glBegin和glEnd之
间的语句定义了一个或一组图形元素的顶点坐标、颜色和法向量等信息。
同时函数glBegin的参数mode指定图形元素的类型。
参数:
mode指定图形元素的类型。
参数mode所有可能取值及其含义如下:
GL_POINTS:
要求在glBegin和glEnd之间至少包含一个顶点,每个顶点
都是孤立的点。
GL_LINES:
要求在glBegin和glEnd之间至少包含两个顶点,如果有2n
个顶点,生成n条直线段。
GL_LINE_LOOP:
要求在glBegin和glEnd之间至少包含两个顶点,依次
相连生成一个封闭的环。
GL_LINE_STRIP:
要求在glBegin和glEnd之间至少包含两个顶点,依次
相连生成一条折线段。
GL_TRIANGLES:
要求在glBegin和glEnd之间至少包含三个顶点,如果
有3n个顶点,生成n个三角形。
GL_TRIANGLE_STRIP:
要求在glBegin和glEnd之间至少包含三个顶点,
如果有n个顶点,生成(n-2)个三角形组成的带。
GL_TRIANGLE_FAN:
要求在glBegin和glEnd之间至少包含三个顶点,
如果有n个顶点,生成(n-2)个三角形组成的扇。
GL_QUADS:
要求在glBegin和glEnd之间至少包含四个顶点,如果
有4n个顶点,生成n个四边形。
GL_QUAD_STRIP:
要求在glBegin和glEnd之间至少包含四个顶点,
如果有n个顶点,生成(n-1)个四边形组成的带。
GL_POLYGON:
要求在glBegin和glEnd之间至少包含三个顶点,对于n
个顶点,一次相连组成一个多边形。
实验一
实验目的:
熟悉VC++控制台编程环境,掌握基于C语言的OpenGL编程结构。
实验内容:
1.GLUT工具包的安装;
2.基于VC++控制台的C语言编程;
3.VC++控制台编程环境与OpenGL的连接;
4.基于VC++控制台的OpenGL编程;
实验过程:
1.阅读以下程序,掌握基于C语言的OpenGL编程结构:
1.源程序
#include
#include
voiddisplay(void){
glClearColor(0.0f,0.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
}
voidmain(int&argc,char**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutCreateWindow("hello");
glutDisplayFunc(display);
displayMainLoop();
}
2.程序内容理解
(1)两个包含文件
#include包含了windows环境下编程所需要的信息。
#include包含了OpenGL编程所需要的信息。
(2)main函数
glutInit(&argc,argv);初始化GLUT库,使系统识别GLUT库中的命令。
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);告诉GLUT库在创建窗口时使用的显示模式和颜色模型,其中参数GLUT_SINGLE指定单缓冲显示模式,绘图命令在用于显示的窗口执行。
参数GLUT_RGB指定RGBA颜色模型。
单缓冲显示模式不能做动画,第一个参数的另一种选择是GLUT_DOUBLE,指定双缓冲显示模式,可以作动画。
第二个参数的其它选择现在不常用,RGBA颜色模型通过设置红、绿,、三种颜色的成分来确定颜色。
glutCreateWindow("hello");创建应用程序窗口,参数指定窗口标题。
glutDisplayFunc(display);通过调用用户程序绘制图形。
displayMainLoop();只能放在main函数的最后,所有已经创建的窗口将在此时显示,对创建窗口的绘制开始生效,事件处理开始启动。
(3)display函数
glClearColor(0.0f,0.0f,1.0f,1.0f);设置颜色缓冲区的颜色为蓝色,即设置背景色,
参数(0.0f,0.0f,1.0f,1.0f)指定颜色中红、绿、蓝的成分,每个成分在0~1(伙伴0~255)之间取值;最后一个参数指定是否透明,0表示透明,1表示不透明。
glClear(GL_COLOR_BUFFER_BIT);用glClearColor命令指定的颜色清除颜色缓冲区中原来的颜色,参数GL_COLOR_BUFFER_BIT代表颜色缓冲区。
glFlush();用于刷新OpenGL中的命令队列,使所有未被执行OpenGL命令得到执行。
由于OpenGL内部使用渲染(绘图)流水线的顺序处理命令,OpenGL的命令常常会排队并成批处理,以便优化性能。
glFlush函数告诉OpenGL应该处理到目前为止收到的命令。
命令glFinish();除了具有glFlush()的功能外,还等待图形硬件和网络的响应,但是性能没有glFlush()高。
3.运行程序
(1)安装GLUT工具包(只需一次):
先下载,解压。
解压后包含三个文件:
glut.h,glut32.lib,glut32.dll。
安装过程:
*将glut32.dll复制到Windows系统的system32文件夹中;
*将glut32.lib复制到VC的lib文件夹中;
*将glut.h复制到VC的include\GL文件夹中。
(2)启动VC++,创建基于控制台的程序框架
*启动VC++
(3)设置OpenGL编程环境
*在应用程序窗口,选择“Project”→“Settings”→“Link”
*在“Object/LibraryModules”一栏中加入:
opengl32.Lib、glu32.Lib、glut32.Lib,两个文件名以及与原有内容之间用空格间隔。
(4)运行程序
*输入代码;
*编译和连接:
在应用程序窗口,选择“Build”→“Compile”或“Build”。
*运行:
在应用程序窗口,选择“Build”→“Execute”或工具栏按钮“!
”执行程序。
(5)编译、修改
*窗口最下方显示编译和连接信息,如果编译出错,双击错误信息,系统自动定位到程序中的出错语句,修改后再次编译。
4.程序运行结果:
该程序仅创建一个系统默认的应用程序窗口。
5.保存
在应用程序窗口,选择“saveProject”
6修改display函数中的glClearColor命令中参数,观察应用程序窗口的颜色变化。
7.清除程序(内存)
在应用程序窗口,选择“ClearProject”
2.阅读以下程序,掌握应用程序窗口参数的设置和渲染对象的颜色设置(前景色)
1.源程序
#include
#include
voidinit(){
glClearColor(0.0,0.0,1.0,1.0);
}
voiddisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor4f(0.0,1.0,1.0,1.0);
glRotatef(60,1.0,1.0,1.0);
glutWireCube(0.8);
glFlush();
}
voidmain(int&argc,char**argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(200,200);
glutInitWindowPosition(100,100);
glutCreateWindow("cube");
init();
glutDisplayFunc(display);
glutMainLoop();
}
2.程序内容理解
(1)main函数
glutInitWindowSize(200,200);设置应用程序窗口的大小,参数表示宽和高。
glutInitWindowPosition(100,100);设置应用程序窗口的位置,参数表示窗口的左上角坐标。
(2)init函数
init函数设置应用程序的初始化,其中包括应用程序启动时执行的代码,并且往往只执行一遍。
因为颜色缓冲区的颜色设置不经常变化,所以将其放入init函数中。
从main函数中的调用次序可以看出,与程序一中代码的写法没有本质区别。
(3)display函数
glColor4f(0.0,1.0,1.0,1.0);设置渲染对象的颜色,其中参数(0.0,1.0,1.0,1.0)的含义和解释与glClearColor(0.0f,0.0f,1.0f,1.0f);相同。
glRotatef(60,1.0,1.0,1.0);将绘制图象旋转60度。
参数(60,1.0,1.0,1.0)表示(旋转角度,x轴,y轴,z轴)。
其中,对应x轴、y轴、z轴的数值,如果为1表示饶该轴旋转,为0表示不饶该轴旋转。
glutWireCube(0.8);绘制一个边长为0.8的线框(Wire)立方体(Cube)。
3.运行、保存和清除程序同程序一。
4.观察并分析程序运行结果。
5.修改程序
(1)修改立方体的颜色;
(2)修改立方体的旋转角度;
(3)修改应用程序窗口的大小和在屏幕显示位置。
3.glutWireCube(GLdoublesize);绘制GLUT中的三维物体
1.GLUT中的三维物体:
命令中“Solid”表示实心物体,“Wire”图形。
下面仅给出函数原型,命令的使用利用C语言知识调用。
(1)立方体
函数原型:
glutWireCube(GLdoublesize);
glutSolidCube(GLdoublesize);
功能:
绘制一个边长为siaze的立方体,立方体中心位于原点。
参数说明:
size为立方体的边长。
(2)圆锥体
数原型:
glutWireCone(GLdoublebase,GLdoubleheight,GLintslices,GLintstacks);
glutSolidCone(GLdoublebase,GLdoubleheight,GLintslices,GLintstacks);
功能:
绘制一个圆锥体,圆锥底面中心位于坐标原点(0,0,0),圆锥顶点位于z轴上。
参数说明:
base圆锥底面半径,height圆锥高。
slices环绕z轴的剖面数,stacks沿着z轴的剖面数。
(3)正十二面体
函数原型:
glutWireDodecahedron(void);
glutSolidDodecahedron(void);
功能:
绘制一个正十二面体,中心位于原点,半径为
。
参数说明:
没有参数。
(4)正二十面体
函数原型:
glutWireIcosahedron(void);
glutSolidIcosahedron(void);
功能:
绘制一个正二十面体,中心位于原点,半径为1。
参数说明:
没有参数。
(5)
函数原型:
glutWireOctahedron(void);
glutSolidOctahedron(void);
功能:
绘制一个正八面体,中心位于原点,半径为1。
参数说明:
没有参数。
(6)
函数原型:
glutWireSphere(GLdoubleradius,GLintslices,GLintstacks);
glutSolidSphere(GLdoubleradius,GLintslices,GLintstacks);
功能:
绘制一个球体,球体的中心位于原点,半径为radius。
参数说明:
Radius球体半径,slices环绕z轴的剖面数,即球体的经线数目,stacks沿着z轴的剖面数,即球体的纬