opengl图形填充、正余弦曲线绘制、字符输出(C++)(推荐文档)
OpenGL程序-输出-学号、姓名、照片等信息。直线、线型、字体程序
作业1一:作业目的及要求:采用OpenGL程序,输出学号、姓名、照片等信息。
直线、线型、字体程序。
二:理论基础:1.使用GLUT进行窗口管理:(1)与大小有关的glutInitWindowSize(800,600); //用来定义显示窗口的初始化宽度和高度的像素数glutInitWindowPosition(200,200); //显示窗口左上角应该在屏幕左边界向右50个像素、屏幕上边界100像素的位置上。
gluOrth02D(0.0,200.0,0.0,150.0); //这表示使用正投影将世界坐标系二维矩形区域的内容映射到屏幕上。
以上三个概念需要弄清,其中gluOrtho2D是指屏幕区域对应的模型坐标范围,比如横向范围是0到200米,纵向是0到150米,而后面的glutInitWindowSize是指glut的窗口弹出来后相对于你电脑屏幕的位置和大小,单位是像素。
(2)窗口颜色设置glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //指出显示窗口使用单个缓存且使用RGB (红绿蓝)颜色模型来设置颜色值glClearColor(1.0,1.0,1.0,0.0) //设置窗口背景颜色为白色,前三个变量为红绿蓝分量,最后一个为调和参数,相当于透明度。
glClear(GL_COLOR_BUFFER_BIT); //让赋予窗口的颜色在屏幕上显示。
Glcolor3f(1.0,0.0,0.0); //显示场景中各种对象的颜色,左边的简单的设置为红色(3)其他glutInit(&argc, argv); //GLUT初始化函数glutCreateWindow(" "); //显示窗口创建定一个标题glutDisplayFunc(Display); //将创建的图形的定义传递给GLUT函数glutMainLoop(); //创建的窗口及其中的图形内容激活2.输出图元(1)OpenGL画点函数OpenGL中定义的点放在函数glBegin()和glEnd()之间,有函数glBegin()的参数指定绘制图元的类型。
OpenGL 3基本图形绘制
模型-视图变换过程就是一个将顶点坐标从世界坐标变换到 视觉坐标的过程。这里很重要的是对两个坐标系的认识。 世界坐标系也称为全局坐标系。它是一个右手坐标系,可 以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏
幕水平向右,y轴为沿屏幕垂直向上,z轴则为垂直屏幕面
向外指向用户。
视觉坐标系(即观察坐标系)也称为局部坐标系。它是一个
(1)确定当前矩阵栈 void glMatrixMode(Glenum mode); 参数取值:
GL_MODELVIEW:模型视图矩阵
GL_PROJECTION:投影矩阵 GL_TEXTURE:纹理矩阵 默认的选定矩阵为模型-视图变换。
矩阵栈及其操作(2/8)
清矩阵栈栈顶
void glLoadIdentity(void); •将栈顶矩阵替换为单位矩阵 •取消之前变换的作用 M … I
对于二维图形向二维屏幕的投影,则应使用实 用库中的如下函数:
void gluOrtho2D(Gldouble left, Gldouble right,
Gldouble bottom, Gldouble top);
前面提到过,用二维顶点命令绘制的二维物体 的z坐标均为零,而gluOrtho2D()命令假定场景 中的 z 坐标介于-1.0和 1.0 之间。
左手坐标系,该坐标系是可以活动的。在初始态下,其原
点及x、y轴分别与世界坐标系的原点及x、y轴重合,而z轴 则正好相反,即为垂直屏幕面向内。
默认:视点在原点,视线沿Z轴负方向。
坐标系
右手坐标系
y
窗口 x
o z
缺省的观察坐标系
视点变换
View变换可以改变视点的位置和方向,要在 Model变换之前调用。设置任意观察坐标点。
opengl图形填充正余弦曲线绘制字符输出C推荐文档
实验五1、实验目的和要求了解且掌握图形填充、曲线绘制和字符输出等技术。
2、实验内容1)用OpenGL实现用黑白相间的棋盘图案填充多边形2)用OpenGL分别用点和折线模式实现正弦和余弦的绘制3)用OpenGL在屏幕上输出”OpenGL”字样3、实验步骤1)相关算法及原理描述①图案填充多边形多边形模式设置函数为:void glPolygonMode(GLenum face,GLenum mode);控制多边形指定面的绘制模式。
参数face为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;参数mode为GL_POINT、GL_LINE或GL_FILL,分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。
缺省时,绘制的是正反面全填充式多边形。
设置图案填充式多边形函数为:void glPolygonStipple(const GLubyte *mask);为当前多边形定义填充图案模式。
参数mask是一个指向32x32位图的指针。
与虚点线绘制的道理一样,某位为1时绘制,为0时什么也不绘。
注意,在调用这个函数前,必须先启动一下,即用glEnable(GL_POLYGON_STIPPLE);不用时用glDisable(GL_POLYGON_STIPPLE) 关闭。
②正弦和余弦曲线的绘制线的绘制需要用到GL_LINES模式,它指定在glBegin/glEnd函数对中,从第一个点开始,两两构成一条直线段。
绘制正余弦曲线的话,只需要编写一段循环语句,指定绘制路线,设置不同线型。
③在屏幕上显示字符实用程序工具包中包含了一些预定义的字符库,用来OpenGL在.显示点阵和矢量字符。
函数void glutBitmapCharacter(void *font,int character); 显示一个GLUT位图字符。
其中font是GLUT符号常数,指定点阵字库。
参数character采用ASCII编码的形式指定要显示的字符。
使用opengl程序在屏幕输出自己设定的字符
GIS专业实验报告(计算机图形学)实验7 使用opengl程序在屏幕输出自己设定的字符。
使用opengl程序在屏幕输出自己设定的字符。
二.理论基础1.ASCII:ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。
它主要用于显示现代英语和其他西欧语言。
它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
2.GB2312:GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。
新加坡等地也使用此编码。
3.ANSI:unicode和ansi都是字符代码的一种表示形式。
为使计算机支持更多语言,通常使用0x80~0xFF 范围的2 个字节来表示1 个字符。
比如:汉字'中' 在中文操作系统中,使用[0xD6,0xD0] 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产生了GB2312, BIG5, JIS 等各自的编码标准。
这些使用2 个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI 编码。
在简体中文系统下,ANSI 编码代表GB2312 编码,在日文操作系统下,ANSI 编码代表JIS 编码。
不同ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI 编码的文本中。
4.MultiByteToWideChar:OpenGL的一个函数,该函数映射一个字符串到一个宽字符(unicode)的字符串。
由该函数映射的字符串没必要是多字节字符组。
三.算法设计与分析运行之前,在工程属性>>>参数中需要增加(libwinmm.a)和(libgdi32.a)引用,这样才能保证字体选择和字符绘制可以正常运行。
OpenGL基本图形的绘制
OpenGL基本图形的绘制1.使用glColor,glPointSize函数绘制三个不同颜色和大小的点// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glColor3f(1.0,0.0,0.0);glVertex2f(0.3f,0.5f);glEnd();glPointSize(8.0f);glBegin(GL_POINTS);glColor3f(0.0,1.0,0.0);glVertex2f(0.0f,0.0f);glEnd();glPointSize(10.0f);glBegin(GL_POINTS);glColor3f(0.0,0.0,1.0);glVertex2f(-0.3f,-0.5f);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB); glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Three Point");glutDisplayFunc(&Display);glutMainLoop();return 0;}2.使用glColor,glLineWidth,glLineStripple函数绘制实心、虚线及渐变色线(1)实心线// T.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(2,0xFFFF);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Solid Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(2)虚线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(4,0xAAAA);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Dotted Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(3)渐变线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includeGLuint Line;void Initial(void) {glClearColor(0.0f, 0.0f, 0.0f, 0.0f);Line = glGenLists(1);glNewList(Line, GL_COMPILE);glTranslatef(-50.0, 20.0, 0.0);glColor3f(255.0, 0.0, 0.0);glLineWidth(2);glBegin(GL_LINES);glColor3f(255.0, 0.0, 0.0);glVertex2i(0,-20);glColor3f(0.0, 0.0, 255.0);glVertex2i(100,-20);glEnd();glEndList();void ChangeSize(int w, int h) {glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);}void Display(void) {glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, 0.0);glCallList(Line);glFlush();}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(600,450);glutInitWindowPosition(100,100);glutCreateWindow("渐变色线");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}3.使用glColor,glPolygonMode函数绘制纯色、渐变色、轮廓多边形(1)纯色六边形// a.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("纯色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(2)渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(3)轮廓渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0); glPolygonMode (GL_FRONT_AND_BACK,GL_LINE); gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300); glutCreateWindow("轮廓渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop(); }。
OpenGL入门学习之二——绘制几何图形
glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush(); }
例三、画出正弦函数的图形 /* 由于 OpenGL 默认坐标值只能从-1 到 1,(可以修改,但方法留到以后讲) 所以我们设置一个因子 factor,把所有的坐标值等比例缩小, 这样就可以画出更多个正弦周期
int i; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); for(i=0; i<n; ++i)
glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i)); glEnd(); glFlush(); }
例二、画一个五角星 /* 设五角星的五个顶点分布位置关系如下:
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f); (五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
实验一vc6.0opengl绘图环境及简单图形的输出
任课教师:马文娟《3D图形学》(2013-2014学年第1学期)实验报告学号:姓名:班级:实验一VC++6.0+OpenGL绘图环境及简单图形的输出一、实验目的1、熟练使用实验主要开发平台VC++6.0;2、进一步熟悉OpenGL的主要功能;3、掌握OpenGL的绘图流程和原理;4、掌握OpenGL的基本数据类型、核心函数的使用。
二、实验内容创建一个OpenGL工程,利用OpenGL库函数进行简单图形设计与绘制。
三、实验原理1、基本语法(C版本下的OpenGL语法)OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。
OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。
一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式,如glColor3b()、glColor3d()、glColor3f()和glColor3bv ()等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。
OpenGL定义了一些特殊标识符,如GLfloat、GLvoid,它们其实就是C中的float 和void。
2、程序的基本结构OpenGL程序的基本结构可分为三个部分:1)第一部分是初始化,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA 或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验、裁剪等。
这些状态一般都用函数glEnable(…)、glDisable(…)来设置,“…”表示特定的状态。
2)第二部分设置观察坐标系下的取景模式和取景框位置大小,主要利用了三个函数:函数void glViewport(left, top, right, bottom) 设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以像素表示);函数void glOrtho(left, right, bottom, top, near, far) 设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;函数void gluPerspective(fovy, aspect, zNear, zFar) 设置投影方式为透视投影,其取景体积是一个截头锥体。
详解OpenGL的坐标系、投影和几何变换
详解OpenGL的坐标系、投影和几何变换作者:charlee 按:我也是在迷茫中走过来的,初学OpenGL时,略微了解了一些有关变换的基本知识,但是却不知道具体的使用方法,因此经常需要在布置场景时反复调整各种参数。
当我终于有一天明白了它们的用法时,就觉得应该把这些心得体会写下来,让那些和我一样曾经迷茫过的人能够迅速地找到出路。
本文的读者对象为那些初学OpenGL,了解了一些坐标系、几何变换等基本知识,但是又不知道具体应该如何运用这些操作的人。
如果你对OpenGL一无所知,建议你先去学学OpenGL的基本知识。
1 坐标系OpenGL中使用的坐标系有两种,分别为世界坐标系和屏幕坐标系。
世界坐标系即OpenGL内部处理时使用的三维坐标系,而屏幕坐标系即为在计算机屏幕上绘图时使用的坐标系。
通常,OpenGL所使用的世界坐标系为右手型,如下图所示。
从计算机屏幕的角度来看,x轴正方向为屏幕从左向右,y轴正方向为屏幕从下向上,z轴正方向为屏幕从里向外。
而进行旋转操作时需要指定的角度θ的方向则由右手法则来决定,即右手握拳,大拇指直向某个坐标轴的正方向,那么其余四指指向的方向即为该坐标轴上的θ角的正方向(即θ角增加的方向),在上图中用圆弧形箭头标出。
2 投影将世界坐标系中的物体映射到屏幕坐标系上的方法称为投影。
投影的方式包括平行投影和透视投影两种。
平行投影的投影线相互平行,投影的结果与原物体的大小相等,因此广泛地应用于工程制图等方面。
透视投影的投影线相交于一点,因此投影的结果与原物体的实际大小并不一致,而是会近大远小。
因此透视投影更接近于真实世界的投影方式。
B 平行投影B透视投影xzy 02.1 平行投影OpenGL 中使用下面的函数来设置投影方式为平行投影。
glOrtho(xleft, xright, ybottom, ytop, znear, zfar); 各参数的含义如下图所示。
注意,只有位于立方体之内的物体才可见。
opengl详解
[OPENGL怎么用]OPENGL编程类似C编程,实际接口就是C,所以熟悉C是必要的一般编程可用到的函数库包括:OPENGL实用库:函数以glu开头OPENGL辅助库:函数以aux开头Windows专用函数库:函数以wgl开头Win32API:无专用前缀OPENGL中有115个核心函数,可以在任何OPENGL平台上使用OPENGL实用库比上面这115个函数高一级,提供高级调用OPENGL辅助库本来是提供初学者入门的函数,不保证在任何平台的使用但恰好可以在WIN32下使用,所以本讲座将大量引用WIN32下OPENGL编程有两个方便途径:1使用辅助库2使用C++基于消息驱动的编程显然1要简单一些,入门从这里开始吧。
[用之前的准备]1首先你需要下列*.lib包含在你的工程中:opengl32.lib glu32.lib glaux.lib本讲座所有例子“将”在VC5下调试通过,所以从project->setting->link->general->object/libary modules中加入上面三个*.lib(这些LIB,VC4以上版本已经自带,加入即可,不用在四处搜寻文件)2另外在你的运行程序路径下或\win95\system\下你需要一些*.dll动态连接库opengl32.dll glu32.dll rxddi.dll mga.drv第一讲[编程入门]这里我将给出一个小例子让大家熟悉用辅助库的编程结构:// GLOS.H//////////////////////////////////////////////////////////// This is an OS specific header file//判别操作系统的基本头文件#include <windows.h>// disable data conversion warnings#pragma warning(disable : 4244) // MIPS#pragma warning(disable : 4136) // X86#pragma warning(disable : 4051) // ALPHA////////////////////////////////////////////////////////// //opengl.cpp//主程序#include "glos.h"#include <GL/gl.h>#include <GL/glaux.h>#include "windows.h"void main(void){/*初始化:*/auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);//窗口显示单缓存和RGB(彩色)模式auxInitPosition(0,0,500,500);//大小x=500 y=500 (0,0)是屏幕左上点auxInitWindow("sample1");//窗口初始化,参数是标题glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色glClear(GL_COLOR_BUFFER_BIT);//将颜色缓存清为glClearColor命令所设置的颜色//即背景色/*绘图*/glColor3f(1.0,0.0,0.0);//选颜色(R,G,B),参数0<x<1,这里就是红色glRectf(-0.5,-0.5,0.5,0.5);//画个方块glFlush();//强制绘图,不驻留缓存_sleep(1000);//windows函数,显示1秒(单位是毫秒)}//end of sample根据注释,应该看出程序功能:显示红色方块(2D)一秒钟。
OpenGL图形编程2基本图形绘制(陈永强)只是分享
这个函数采用一个参数来指定画点时以象素为单位的近似 直径。
7
2.2点的绘制
点的属性(大小)
通常使用下面的代码来获取点大小的范围和它们之间最小的中间值:
GLfloat sizes[2]; //保存绘制点的尺寸范围
GLfloat step;
将指定的各个顶点用于创建单个的点
GL_LINES GL_LINE_STRIP GL_LINE_LOOP
GL_TRIANGLES
将指定的顶点用于创建线段。每两个顶点指定一条单独的线 段。如果顶点个数是奇数,则忽略后一个
将指定的顶点用于创建线条。第一个顶点之后的每个顶点指 定的是线条延伸到的下一个点
特性和GL_LINE_STRIP 相似,只不过最后一条线段是在 指定的后一个和第一个顶点之间绘制。典型情况下,这用于 绘制那些可能违反了 GL_POLYGON 用法规则的封闭区域
glBegin(GL_LINE_STRIP); glVertex3f(0.0f,0.0f,0.0f); glVertex3f(10.0f,10.0f,0.0f); glVertex3f(20.0f,5.0f,0.0f);
glEnd();
在xy平面内绘制了两条直线(0,0,0)到(10,0,0)和(0,10,0)到(20,5,0)。
OpenGL图形编程2基本图形绘 制(陈永强)
2.1glBegin/glEnd
OpenGL的图元绘制放在函数glBegin和 glEnd之间,由函数glBegin的参数指定绘制 图元的类型。
2.1glBegin/glEnd
模式
GL_POINTS
表 glBegin可支持的OpenGL图元
OpenGL基本几何图形的绘制
2020/7/1
2
3终都是通过一组有序顶点来描述的。 OpenGL中有十种基本图元,从空间中绘制的简单的 点到任意边数的封闭多边形。用glBegin命令可告诉 OpenGL开始把一组顶点解释为特定图元。然后用 glEnd命令结束该图元的顶点列表。
glEnd();
100 150 200
2020/7/1
8
3.4.2 线的绘制(续)
连接线段的绘制:
glColor3f(1.0,0.0,0.0);
glLineWidth(5.0);
200
glBegin(GL_LINE_STRIP);
150
glVertex3f(0.0,0.0,0.0);
100
glVertex3f(50.0,50.0,0.0);
glVertex3f(-10.0,5.0,0.0);
glVertex3f(-10.0, 0.0,0.0);
glEnd();
2020/7/1
12
3.4.3 多边形的绘制(续)
四边形的绘制:
✓OpenGL中的GL_QUADS图元用来绘制一个四边形。 与三角形一样,GL_QUADS_STRIP图元指定一条相互连 接的四边形。 ✓由于矩形在图形应用中非常普遍,它不必通过glBegin 和glEnd之间的顶点来进行绘制,而是通过使用如下的函 数:
10
3.4.3 多边形的绘制
三角形的绘制:
glColor3f(1.0,0.0,0.0);
glBegin(GL_TRIANGLES); glVertex3f(0.0,0.0,0.0); glVertex3f(5.0,5.0,0.0); glVertex3f(10.0, 0.0,0.0);
用OpenGL绘制正弦曲线
//这个是一个效果图,仅仅是演示一下。
///本文档基于NeHe的教程,在此感谢他的无私奉献,让大家学会了怎样使用OpenGL。
//这段生成sin数据int main(int argc, char** argv){for (int i = -360; i <= 360; i += 10) {cout<<" { "<<i / 20<<" , "<<15 * sin(i * 3.1416 / 180)<<" , 0 }, "<<"\n";}}//生成的数据放在这里typedef struct tagV ector {float X, Y, Z;} VECTOR, *PVECTOR;VECTOR vec[] = {{ -18 , -0.000220392 , 0 },{ -17 , 2.60451 , 0 },{ -17 , 5.13011 , 0 },{ -16 , 9.64166 , 0 }, { -15 , 11.4905 , 0 }, { -15 , 12.9903 , 0 }, { -14 , 14.0953 , 0 }, { -14 , 14.7721 , 0 }, { -13 , 15 , 0 },{ -13 , 14.7721 , 0 }, { -12 , 14.0954 , 0 }, { -12 , 12.9905 , 0 }, { -11 , 11.4908 , 0 }, { -11 , 9.64192 , 0 }, { -10 , 7.50011 , 0 }, { -10 , 5.13042 , 0 }, { -9 , 2.60484 , 0 }, { -9 , 0.000110196 , 0 }, { -8 , -2.60462 , 0 }, { -8 , -5.13021 , 0 }, { -7 , -7.49992 , 0 }, { -7 , -9.64175 , 0 }, { -6 , -11.4906 , 0 }, { -6 , -12.9903 , 0 }, { -5 , -14.0954 , 0 }, { -5 , -14.7721 , 0 }, { -4 , -15 , 0 },{ -4 , -14.7721 , 0 }, { -3 , -14.0954 , 0 }, { -3 , -12.9904 , 0 }, { -2 , -11.4907 , 0 }, { -2 , -9.64183 , 0 }, { -1 , -7.50002 , 0 }, { -1 , -5.13031 , 0 }, { 0 , -2.60473 , 0 }, { 0 , 0 , 0 },{ 0 , 2.60473 , 0 },{ 1 , 5.13031 , 0 }, { 1 , 7.50002 , 0 },{ 2 , 9.64183 , 0 },{ 2 , 11.4907 , 0 },{ 3 , 12.9904 , 0 },{ 3 , 14.0954 , 0 },{ 4 , 14.7721 , 0 },{ 4 , 15 , 0 },{ 5 , 14.7721 , 0 },{ 6 , 12.9903 , 0 },{ 6 , 11.4906 , 0 },{ 7 , 9.64175 , 0 },{ 7 , 7.49992 , 0 },{ 8 , 5.13021 , 0 },{ 8 , 2.60462 , 0 },{ 9 , -0.000110196 , 0 },{ 9 , -2.60484 , 0 },{ 10 , -5.13042 , 0 },{ 10 , -7.50011 , 0 },{ 11 , -9.64192 , 0 },{ 11 , -11.4908 , 0 },{ 12 , -12.9905 , 0 },{ 12 , -14.0954 , 0 },{ 13 , -14.7721 , 0 },{ 13 , -15 , 0 },{ 14 , -14.7721 , 0 },{ 14 , -14.0953 , 0 },{ 15 , -12.9903 , 0 },{ 15 , -11.4905 , 0 },{ 16 , -9.64166 , 0 },{ 16 , -7.49983 , 0 },{ 17 , -5.13011 , 0 },{ 17 , -2.60451 , 0 },{ 18 , 0.000220392 , 0 }};//在这里进行调用绘制#include <windows.h>// Header File For Windows#include <cstdio>// Header File For Standard Input/Output#include <cmath>#include <gl\gl.h>// Header File For The OpenGL32 Library#include <gl\glu.h>// Header File For The GLu32 Library#include "NeHeGL.h"// Header File For NeHeGL#include "Data.h"//让数据单独在一个文件里#pragma comment( lib, "opengl32.lib" )// Search For OpenGL32.lib While Linking #pragma comment( lib, "glu32.lib" )// Search For GLu32.lib While Linkingusing namespace std;#ifndef CDS_FULLSCREEN// CDS_FULLSCREEN Is Not Defined By Some#define CDS_FULLSCREEN 4// Compilers. By Defining It This Way,#endif// We Can A void ErrorsGL_Window* g_window;Keys* g_keys;float timeElapsed = 0;// Elapsed Time In TheGLuint base;// Base Display List For The Font SetGLYPHMETRICSFLOA T gmf[256];// Storage For Information About Our Outline Font CharactersGLvoid BuildFont(GL_Window* window)// Build Our Bitmap Font{HFONT font;// Windows Font IDbase = glGenLists(256);// Storage For 256 Charactersfont = CreateFont( -12,// Height Of Font0,// Width Of Font0,// Angle Of Escapement0,// Orientation AngleFW_BOLD,// Font WeightFALSE,// ItalicFALSE,// UnderlineFALSE,// StrikeoutANSI_CHARSET,// Character Set IdentifierOUT_TT_PRECIS,// Output PrecisionCLIP_DEFAULT_PRECIS,// Clipping PrecisionANTIALIASED_QUALITY,// Output QualityFF_DONTCARE|DEFAULT_PITCH,// Family And PitchNULL);// Font NameHDC hDC = window->hDC;SelectObject(hDC, font);// Selects The Font We CreatedwglUseFontOutlines( hDC,// Select The Current DC0,// Starting Character255,// Number Of Display Lists To Buildbase,// Starting Display Lists0.0f,// Deviation From The True Outlines0.0f,// Font Thickness In The Z DirectionWGL_FONT_POLYGONS,// Use Polygons, Not Linesgmf);// Address Of Buffer To Recieve Data}GLvoid KillFont(GLvoid)// Delete The Font{glDeleteLists(base, 256);// Delete All 256 Characters}GLvoid glPrint(float x, float y, float z, const char *fmt, ...) // Custom GL "Print" Routine{float length=0;// Used To Find The Length Of The Textchar text[256];// Holds Our Stringva_list ap;// Pointer To List Of Argumentsif (fmt == NULL)// If There's No Textreturn;// Do Nothingva_start(ap, fmt);// Parses The String For V ariablesvsprintf(text, fmt, ap);// And Converts Symbols To Actual Numbersva_end(ap);// Results Are Stored In Textfor (unsigned int loop=0;loop<(strlen(text));loop++)// Loop To Find Text Length{length+=gmf[text[loop]].gmfCellIncX;// Increase Length By Each Characters Width }glTranslatef(x - length, y, z);// Position Text On The ScreenglPushAttrib(GL_LIST_BIT);// Pushes The Display List BitsglListBase(base);// Sets The Base Character to 0glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);// Draws The Display List TextglPopAttrib();// Pops The Display List BitsglTranslatef(-x, -y, -z);// Position Text On The Screen}BOOL Initialize (GL_Window* window, Keys* keys)// Any GL Init Code & User Initialiazation Goes Here{g_window = window;g_keys = keys;glClearColor (0.0f, 0.0f, 0.0f, 0.5f);// Black BackgroundglShadeModel (GL_SMOOTH);// Select Smooth ShadingglHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Set PerspectiveCalculations To Most AccurateBuildFont(window);// Build The Fontreturn TRUE;// Return TRUE (Initialization Successful)}void Deinitialize (void)// Any User DeInitialization Goes Here{KillFont();}void Update (DWORD milliseconds)// Perform Motion Updates Here{if (g_keys->keyDown [VK_ESCAPE] == TRUE)// Is ESC Being Pressed?TerminateApplication (g_window);// Terminate The Programif (g_keys->keyDown [VK_F1] == TRUE)// Is F1 Being Pressed?ToggleFullscreen (g_window);// Toggle Fullscreen Mode// dt Is The Time Interval (As Seconds) From The Previous Frame To The Current Frame.// dt Will Be Used To Iterate Simulation V alues Such As V elocity And Position Of Masses.float dt = milliseconds / 1000.0f;// Let's Convert Milliseconds To SecondstimeElapsed += dt;// Iterate Elapsed Timefloat maxPossible_dt = 0.1f;// Say That The Maximum Possible dt Is 0.1 Seconds// This Is Needed So We Do Not Pass Over A Non Precise dt V alueint numOfIterations = (int)(dt / maxPossible_dt) + 1;// Calculate Number Of Iterations To Be Made At This Update Depending On maxPossible_dt And dtif (numOfIterations != 0)// A void Division By Zerodt = dt / numOfIterations;// dt Should Be Updated According To numOfIterationsfor (int a = 0; a < numOfIterations; ++a)// We Need To Iterate Simulations "numOfIterations" Times{//Add iteration action...}void Draw (void){glMatrixMode(GL_MODELVIEW);glLoadIdentity ();// Reset The Modelview Matrix// Position Camera 40 Meters Up In Z-Direction.// Set The Up V ector In Y-Direction So That +X Directs To Right And +Y Directs To Up On The Window.gluLookAt(0, 0, 40, 0, 0, 0, 0, 1, 0);glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Clear Screen And Depth Buffer// Drawing The Coordinate Plane Starts Here.// We Will Draw Horizontal And V ertical Lines With A Space Of 1 Meter Between Them.glColor3ub(0, 255, 255);// Draw In BlueglBegin(GL_LINES);//Add lines...int i;for ( i = 0; i < sizeof(vec) / sizeof(vec[0]) - 1; i++) {glV ertex3f(vec[i].X, vec[i].Y, vec[i].Z);glV ertex3f(vec[i+1].X, vec[i+1].Y, vec[i+1].Z);}glV ertex3f(-20, 0, 0);glV ertex3f(20, 0, 0);glEnd();glColor3ub(255, 0, 0);glPointSize(4);glBegin(GL_POINTS);//Add points...for (int i = 0; i < sizeof(vec) / sizeof(vec[0]); i++) {glV ertex3f(vec[i].X, vec[i].Y, vec[i].Z);}glEnd();glColor3ub(255, 255, 255);// Draw In WhiteglPrint(-5.0f, 14, 0, "Time elapsed (seconds): %.2f", timeElapsed); // Print timeElapsedglPrint(-5.0f, 13, 0, "Add What Y ou WANT To Say HERE"); // PrintglFlush ();// Flush The GL Rendering Pipeline}//这边是框架#include <windows.h>// Header File For The Windows Library#include <gl/gl.h>// Header File For The OpenGL32 Library#include <gl/glu.h>// Header File For The GLu32 Library#include "NeHeGL.h"// Header File For The NeHeGL Basecode#define WM_TOGGLEFULLSCREEN (WM_USER+1)// Application Define Message For Togglingstatic BOOL g_isProgramLooping;// Window Creation Loop, For FullScreen/Windowed Toggle// Between Fullscreen / Windowed Modestatic BOOL g_createFullScreen;// If TRUE, Then Create Fullscreenvoid TerminateApplication (GL_Window* window)// Terminate The Application{PostMessage (window->hWnd, WM_QUIT, 0, 0);// Send A WM_QUIT Messageg_isProgramLooping = FALSE;// Stop Looping Of The Program}void ToggleFullscreen (GL_Window* window)// Toggle Fullscreen/Windowed{PostMessage (window->hWnd, WM_TOGGLEFULLSCREEN, 0, 0);// Send A WM_TOGGLEFULLSCREEN Message}void ReshapeGL (int width, int height)// Reshape The Window When It's Moved Or Resized{glViewport (0, 0, (GLsizei)(width), (GLsizei)(height));// Reset The Current V iewportglMatrixMode (GL_PROJECTION);// Select The Projection MatrixglLoadIdentity ();// Reset The Projection MatrixgluPerspective (45.0f, (GLfloat)(width)/(GLfloat)(height),// Calculate The Aspect Ratio Of The Window1.0f, 100.0f);glMatrixMode (GL_MODELVIEW);// Select The Modelview MatrixglLoadIdentity ();// Reset The Modelview Matrix}BOOL ChangeScreenResolution (int width, int height, int bitsPerPixel)// Change The Screen ResolutionDEVMODE dmScreenSettings;// Device ModeZeroMemory (&dmScreenSettings, sizeof (DEVMODE));// Make Sure Memory Is Cleared dmScreenSettings.dmSize = sizeof (DEVMODE);// Size Of The Devmode StructuredmScreenSettings.dmPelsWidth = width;// Select Screen WidthdmScreenSettings.dmPelsHeight = height;// Select Screen HeightdmScreenSettings.dmBitsPerPel = bitsPerPixel;// Select Bits Per PixeldmScreenSettings.dmFields= DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;if (ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL){return FALSE;// Display Change Failed, Return False}return TRUE;// Display Change Was Successful, Return True}BOOL CreateWindowGL (GL_Window* window)// This Code Creates Our OpenGL Window {DWORD windowStyle = WS_OVERLAPPEDWINDOW;// Define Our Window StyleDWORD windowExtendedStyle = WS_EX_APPWINDOW;// Define The Window's Extended StylePIXELFORMA TDESCRIPTOR pfd =// pfd Tells Windows How We Want Things To Be{sizeof (PIXELFORMA TDESCRIPTOR),// Size Of This Pixel Format Descriptor1,// V ersion NumberPFD_DRA W_TO_WINDOW |// Format Must Support WindowPFD_SUPPORT_OPENGL |// Format Must Support OpenGLPFD_DOUBLEBUFFER,// Must Support Double BufferingPFD_TYPE_RGBA,// Request An RGBA Formatwindow->init.bitsPerPixel,// Select Our Color Depth0, 0, 0, 0, 0, 0,// Color Bits Ignored0,// No Alpha Buffer0,// Shift Bit Ignored0,// No Accumulation Buffer0, 0, 0, 0,// Accumulation Bits Ignored16,// 16Bit Z-Buffer (Depth Buffer)0,// No Stencil Buffer0,// No Auxiliary BufferPFD_MAIN_PLANE,// Main Drawing Layer0,// Reserved0, 0, 0// Layer Masks Ignored};RECT windowRect = {0, 0, window->init.width, window->init.height}; // Define Our Window CoordinatesGLuint PixelFormat;// Will Hold The Selected Pixel Formatif (window->init.isFullScreen == TRUE)// Fullscreen Requested, Try Changing Video Modes {if (ChangeScreenResolution (window->init.width, window->init.height, window->init.bitsPerPixel) == FALSE){// Fullscreen Mode Failed. Run In Windowed Mode InsteadMessageBox (HWND_DESKTOP, "Mode Switch Failed.\nRunning In Windowed Mode.", "Error", MB_OK | MB_ICONEXCLAMA TION);window->init.isFullScreen = FALSE;// Set isFullscreen To False (Windowed Mode)}else// Otherwise (If Fullscreen Mode Was Successful){ShowCursor (FALSE);// Turn Off The CursorwindowStyle = WS_POPUP;// Set The WindowStyle To WS_POPUP (Popup Window)windowExtendedStyle |= WS_EX_TOPMOST;// Set The Extended Window Style To WS_EX_TOPMOST}// (Top Window Covering Everything Else)}else// If Fullscreen Was Not Selected{// Adjust Window, Account For Window BordersAdjustWindowRectEx (&windowRect, windowStyle, 0, windowExtendedStyle);}// Create The OpenGL Windowwindow->hWnd = CreateWindowEx (windowExtendedStyle,// Extended Stylewindow->init.application->className, // Class Namewindow->init.title,// Window TitlewindowStyle,// Window Style0, 0,// Window X,Y PositionwindowRect.right - windowRect.left, // Window WidthwindowRect.bottom - windowRect.top, // Window HeightHWND_DESKTOP,// Desktop Is Window's Parent0,// No Menuwindow->init.application->hInstance, // Pass The Window Instancewindow);if (window->hWnd == 0)// Was Window Creation A Success?{return FALSE;// If Not Return False}window->hDC = GetDC (window->hWnd);// Grab A Device Context For This Windowif (window->hDC == 0)// Did We Get A Device Context?{// FailedDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}PixelFormat = ChoosePixelFormat (window->hDC, &pfd);// Find A Compatible Pixel Formatif (PixelFormat == 0)// Did We Find A Compatible Format?{// FailedReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}if (SetPixelFormat (window->hDC, PixelFormat, &pfd) == FALSE)// Try To Set The Pixel Format{// FailedReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}window->hRC = wglCreateContext (window->hDC);// Try To Get A Rendering Contextif (window->hRC == 0)// Did We Get A Rendering Context?{// FailedReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}// Make The Rendering Context Our Current Rendering Contextif (wglMakeCurrent (window->hDC, window->hRC) == FALSE){// FailedwglDeleteContext (window->hRC);// Delete The Rendering Contextwindow->hRC = 0;// Zero The Rendering ContextReleaseDC (window->hWnd, window->hDC);// Release Our Device Contextwindow->hDC = 0;// Zero The Device ContextDestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handlereturn FALSE;// Return False}ShowWindow (window->hWnd, SW_NORMAL);// Make The Window V isiblewindow->isV isible = TRUE;// Set isVisible To TrueReshapeGL (window->init.width, window->init.height);// Reshape Our GL WindowZeroMemory (window->keys, sizeof (Keys));// Clear All Keyswindow->lastTickCount = GetTickCount ();// Get Tick Countreturn TRUE;// Window Creating Was A Success// Initialization Will Be Done In WM_CREA TE}BOOL DestroyWindowGL (GL_Window* window)// Destroy The OpenGL Window & Release Resources{if (window->hWnd != 0)// Does The Window Have A Handle?{if (window->hDC != 0)// Does The Window Have A Device Context?{wglMakeCurrent (window->hDC, 0);// Set The Current Active Rendering Context To Zeroif (window->hRC != 0)// Does The Window Have A Rendering Context?{wglDeleteContext (window->hRC);// Release The Rendering Contextwindow->hRC = 0;// Zero The Rendering Context}ReleaseDC (window->hWnd, window->hDC);// Release The Device Contextwindow->hDC = 0;// Zero The Device Context}DestroyWindow (window->hWnd);// Destroy The Windowwindow->hWnd = 0;// Zero The Window Handle}if (window->init.isFullScreen)// Is Window In Fullscreen Mode{ChangeDisplaySettings (NULL,0);// Switch Back To Desktop ResolutionShowCursor (TRUE);// Show The Cursor}return TRUE;// Return True}// Process Window Message CallbacksLRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){// Get The Window ContextGL_Window* window = (GL_Window*)(GetWindowLong (hWnd, GWL_USERDA TA));switch (uMsg)// Evaluate Window Message{case WM_SYSCOMMAND:// Intercept System Commands{switch (wParam)// Check System Calls{case SC_SCREENSA VE:// Screensaver Trying To Start?case SC_MONITORPOWER:// Monitor Trying To Enter Powersave?return 0;// Prevent From Happening}break;// Exit}return 0;// Returncase WM_CREA TE:// Window Creation{CREA TESTRUCT* creation = (CREA TESTRUCT*)(lParam);// Store WindowStructure Pointerwindow = (GL_Window*)(creation->lpCreateParams);SetWindowLong (hWnd, GWL_USERDA TA, (LONG)(window));}return 0;// Returncase WM_CLOSE:// Closing The WindowTerminateApplication(window);// Terminate The Applicationreturn 0;// Returncase WM_SIZE:// Size Action Has Taken Placeswitch (wParam)// Evaluate Size Action{case SIZE_MINIMIZED:// Was Window Minimized?window->isV isible = FALSE;// Set isV isible To Falsereturn 0;// Returncase SIZE_MAXIMIZED:// Was Window Maximized?window->isV isible = TRUE;// Set isVisible To TrueReshapeGL (LOWORD (lParam), HIWORD (lParam));// Reshape Window - LoWord=Width, HiWord=Heightreturn 0;// Returncase SIZE_RESTORED:// Was Window Restored?window->isV isible = TRUE;// Set isVisible To TrueReshapeGL (LOWORD (lParam), HIWORD (lParam));// Reshape Window - LoWord=Width, HiWord=Heightreturn 0;// Return}break;// Breakcase WM_KEYDOWN:// Update Keyboard Buffers For Keys Pressedif ((wParam >= 0) && (wParam <= 255))// Is Key (wParam) In A V alid Range?{window->keys->keyDown [wParam] = TRUE;// Set The Selected Key (wParam) To Truereturn 0;// Return}break;// Breakcase WM_KEYUP:// Update Keyboard Buffers For Keys Releasedif ((wParam >= 0) && (wParam <= 255))// Is Key (wParam) In A V alid Range?{window->keys->keyDown [wParam] = FALSE;// Set The Selected Key(wParam) To Falsereturn 0;// Return}break;// Breakcase WM_TOGGLEFULLSCREEN:// Toggle FullScreen Mode On/Offg_createFullScreen = (g_createFullScreen == TRUE) ? FALSE : TRUE;PostMessage (hWnd, WM_QUIT, 0, 0);break;// Break}return DefWindowProc (hWnd, uMsg, wParam, lParam);// Pass Unhandled Messages To DefWindowProc}BOOL RegisterWindowClass (Application* application)// Register A Window Class For This Application.{// TRUE If Successful// Register A Window ClassWNDCLASSEX windowClass;// Window ClassZeroMemory (&windowClass, sizeof (WNDCLASSEX));// Make Sure Memory Is Cleared windowClass.cbSize = sizeof (WNDCLASSEX);// Size Of The windowClass StructurewindowClass.style = CS_HREDRA W | CS_VREDRA W | CS_OWNDC; // Redraws The Window For Any Movement / ResizingwindowClass.lpfnWndProc = (WNDPROC)(WindowProc);// WindowProc Handles MessageswindowClass.hInstance = application->hInstance;// Set The InstancewindowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);// Class Background Brush ColorwindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);// Load The Arrow PointerwindowClass.lpszClassName = application->className;// Sets The Applications Classname if (RegisterClassEx (&windowClass) == 0)// Did Registering The Class Fail?{// NOTE: Failure, Should Never HappenMessageBox (HWND_DESKTOP, "RegisterClassEx Failed!", "Error", MB_OK | MB_ICONEXCLAMA TION);return FALSE;// Return False (Failure)}return TRUE;// Return True (Success)}// Program Entry (WinMain)int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){Application application;// Application StructureGL_Window window;// Window StructureKeys keys;// Key StructureBOOL isMessagePumpActive;// Message Pump Active?MSG msg;// Window Message StructureDWORD tickCount;// Used For The Tick Counter// Fill Out Application Dataapplication.className = "OpenGL";// Application Class Nameapplication.hInstance = hInstance;// Application Instance// Fill Out WindowZeroMemory (&window, sizeof (GL_Window));// Make Sure Memory Is Zeroedwindow.keys = &keys;// Window Key Structurewindow.init.application = &application;// Window Applicationwindow.init.title = "OPENGL FRAME DEMOS"; // Window Titlewindow.init.width = 640;// Window Widthwindow.init.height = 480;// Window Heightwindow.init.bitsPerPixel = 16;// Bits Per Pixelwindow.init.isFullScreen= TRUE;// Fullscreen? (Set To TRUE)ZeroMemory (&keys, sizeof (Keys));// Zero keys Structure// Ask The User If They Want To Start In FullScreen Mode?if (MessageBox (HWND_DESKTOP, "Would Y ou Like To Run In Fullscreen Mode?", "Start FullScreen?", MB_YESNO | MB_ICONQUESTION) == IDNO){window.init.isFullScreen = FALSE;// If Not, Run In Windowed Mode }// Register A Class For Our Window To Useif (RegisterWindowClass (&application) == FALSE)// Did Registering A Class Fail?{// FailureMessageBox (HWND_DESKTOP, "Error Registering Window Class!", "Error", MB_OK | MB_ICONEXCLAMA TION);return -1;// Terminate Application}g_isProgramLooping = TRUE;// Program Looping Is Set To TRUEg_createFullScreen = window.init.isFullScreen;// g_createFullScreen Is Set To User Defaultwhile (g_isProgramLooping)// Loop Until WM_QUIT Is Received{// Create A Windowwindow.init.isFullScreen = g_createFullScreen;// Set Init Param Of Window Creation To Fullscreen?if (CreateWindowGL (&window) == TRUE)// Was Window Creation Successful?{// At This Point We Should Have A Window That Is Setup To Render OpenGLif (Initialize (&window, &keys) == FALSE)// Call User Intialization{// FailureTerminateApplication (&window);// Close Window, This Will Handle The Shutdown}else// Otherwise (Start The Message Pump){ // Initialize was a successisMessagePumpActive = TRUE;// Set isMessagePumpActive To TRUEwhile (isMessagePumpActive == TRUE)// While The Message Pump Is Active{// Success Creating Window. Check For Window Messagesif (PeekMessage (&msg, window.hWnd, 0, 0, PM_REMOVE) != 0){// Check For WM_QUIT Messageif (msg.message != WM_QUIT)// Is The Message A WM_QUIT Message?{DispatchMessage (&msg);// If Not, Dispatch The Message}else// Otherwise (If Message Is WM_QUIT){isMessagePumpActive = FALSE;// Terminate The Message Pump}}else// If There Are No Messages{if (window.isVisible == FALSE)// If Window Is Not V isible{WaitMessage ();// Application Is Minimized Wait For A Message}else// If Window Is V isible{// Process Application LooptickCount = GetTickCount ();// Get The Tick CountUpdate (tickCount - stTickCount); // Update The CounterstTickCount = tickCount;// Set Last Count To Current CountDraw ();// Draw Our SceneSwapBuffers (window.hDC);// Swap Buffers (Double Buffering)}}}// Loop While isMessagePumpActive == TRUE}// If (Initialize (...// Application Is FinishedDeinitialize ();// User Defined DeInitializationDestroyWindowGL (&window);// Destroy The Active Window}else// If Window Creation Failed{// Error Creating WindowMessageBox (HWND_DESKTOP, "Error Creating OpenGL Window", "Error", MB_OK | MB_ICONEXCLAMA TION);g_isProgramLooping = FALSE;// Terminate The Loop}}// While (isProgramLooping)UnregisterClass (application.className, application.hInstance);// UnRegister Window Class return 0;}// End Of WinMain()///这个是框架的头文件#ifndef GL_FRAMEWORK__INCLUDED#define GL_FRAMEWORK__INCLUDED#include <windows.h>// Header File For Windowstypedef struct {// Structure For Keyboard StuffBOOL keyDown [256];// Holds TRUE / FALSE For Each Key} Keys;// Keystypedef struct {// Contains Information Vital To ApplicationsHINSTANCE hInstance;// Application Instanceconst char* className;// Application ClassName} Application;// Applicationtypedef struct {// Window Creation InfoApplication* application;// Application Structurechar* title;// Window Titleint width;// Widthint height;// Heightint bitsPerPixel;// Bits Per PixelBOOL isFullScreen;// FullScreen?} GL_WindowInit;// GL_WindowInittypedef struct {// Contains Information Vital To A WindowKeys* keys;// Key StructureHWND hWnd;// Window HandleHDC hDC;// Device ContextHGLRC hRC;// Rendering ContextGL_WindowInit init;// Window InitBOOL isVisible;// Window Visible?DWORD lastTickCount;// Tick Counter} GL_Window;// GL_Windowvoid TerminateApplication (GL_Window* window);// Terminate The Applicationvoid ToggleFullscreen (GL_Window* window);// Toggle Fullscreen / Windowed Mode// These Are The Function Y ou Must ProvideBOOL Initialize (GL_Window* window, Keys* keys);// Performs All Y our Initialization void Deinitialize (void);// Performs All Y our DeInitializationvoid Update (DWORD milliseconds);// Perform Motion Updatesvoid Draw (void);// Perform All Y our Scene Drawing#endif// GL_FRAMEWORK__INCLUDED////////////////////////////////////////////////////////////////////////////////。
opengl使用手册 简书
opengl使用手册简书【实用版】目录一、OpenGL 简介二、OpenGL 函数库1.核心函数库2.矩阵操作、几何变换和投影变换函数3.扩展库 GLEW三、OpenGL 菜单的使用1.交互式输入设备的处理2.glut 命令与鼠标函数四、总结正文一、OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染 2D 和 3D 图形。
它被广泛应用于游戏开发、计算机辅助设计、虚拟现实等领域。
OpenGL 提供了丰富的函数库,可以实现各种复杂的图形效果。
二、OpenGL 函数库OpenGL 的函数库主要可以分为核心函数库和扩展库。
核心函数库包含了基本的绘图功能,如绘制几何图元、矩阵操作、几何变换和投影变换等。
扩展库 GLEW(GLEW Extension Wrangler Library)则提供了更多的高级功能,如阴影、纹理贴图等。
1.核心函数库核心函数库包含了许多常用的绘图函数,如:- glBegin():开始绘制- glEnd():结束绘制- glVertex():绘制一个顶点- glColor():设置颜色2.矩阵操作、几何变换和投影变换函数OpenGL 提供了丰富的矩阵操作、几何变换和投影变换函数,如:- glPushMatrix():矩阵入栈- glPopMatrix():矩阵出栈- glTranslate():几何变换(平移)- glRotate():几何变换(旋转)- glScale():几何变换(缩放)- gluPerspective():投影变换3.扩展库 GLEWGLEW 是一个方便的扩展库,可以方便地管理 OpenGL 扩展。
它提供了一系列的函数,如:- glewInit():初始化 GLEW- glewGetError():获取 GLEW 错误- glewCreateContext():创建 OpenGL 上下文- glewMakeCurrent():设置当前 OpenGL 上下文三、OpenGL 菜单的使用OpenGL 支持交互式输入设备,如鼠标和键盘。
OpenGL图形编程2基本图形绘制(陈永强)只是分享
31
2.4多边形面的绘制
多边形面的属性 颜色
glShadeModel(GL_FLAT) 指定多边形最后一个顶点 时的当前颜色作为填充多边形的纯色,唯一例外 是GL_POLYGON图元,它采用的是第一个顶点的 颜色。
glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&step);
数组 sizes中保存了glLineWidth的最小有效值和最大有效值,而变量step将 保存线宽之间允许的最小增量。OpenGL规范只要求支持一种线宽:1.0。
Microsoft的OpenGL实现允许线宽从0.5到10.0,最小增量为 0.125。
点的坐标(x,y,z,w)实际上构成了一个齐次坐标。在OpenGL中 ,仍然使用规范化齐次坐标以保证点的齐次坐标与三维坐标的一一对应关 系,最后指定的空间点的坐标为(x/w,y/w,z/w,1),w成了坐
标值的一个缩放因子。
5
2.2点的绘制
点的绘制 glBegin(GL_POINTS); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(10.0f, 0.0f, 0.0f); glEnd();
与点的大小类似,glLineWidth函数采用一个参数 来指定要画的线以象素计的近似宽度 。
15
2.3直线的绘制
直线的属性
线宽
可以用下面的代码来获取线宽范围和它们之间的最小间隔:
GLfloat sizes[2]; //保存线宽的尺寸范围
GLfloat step;
//保存线宽尺寸的最小间隔
Байду номын сангаас
glGetFloarv(GL_LINE_WIDTH_RANGE,sizes);
opengl图形填充、正余弦曲线绘制、字符输出(C++)电子教案
o p e n g l图形填充、正余弦曲线绘制、字符输出(C++)实验五1、实验目的和要求了解且掌握图形填充、曲线绘制和字符输出等技术。
2、实验内容1)用OpenGL实现用黑白相间的棋盘图案填充多边形2)用OpenGL分别用点和折线模式实现正弦和余弦的绘制3)用OpenGL在屏幕上输出”OpenGL”字样3、实验步骤1)相关算法及原理描述①图案填充多边形多边形模式设置函数为:void glPolygonMode(GLenum face,GLenum mode);控制多边形指定面的绘制模式。
参数face为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;参数mode为GL_POINT、GL_LINE或GL_FILL,分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。
缺省时,绘制的是正反面全填充式多边形。
设置图案填充式多边形函数为:void glPolygonStipple(const GLubyte *mask);为当前多边形定义填充图案模式。
参数mask是一个指向32x32位图的指针。
与虚点线绘制的道理一样,某位为1时绘制,为0时什么也不绘。
注意,在调用这个函数前,必须先启动一下,即用glEnable(GL_POLYGON_STIPPLE);不用时用glDisable(GL_POLYGON_STIPPLE) 关闭。
②正弦和余弦曲线的绘制线的绘制需要用到GL_LINES模式,它指定在glBegin/glEnd函数对中,从第一个点开始,两两构成一条直线段。
绘制正余弦曲线的话,只需要编写一段循环语句,指定绘制路线,设置不同线型。
③在屏幕上显示字符在OpenGL实用程序工具包中包含了一些预定义的字符库,用来显示点阵和矢量字符。
函数 void glutBitmapCharacter(void *font,int character); 显示一个GLUT位图字符。
其中font是GLUT符号常数,指定点阵字库。
opengl教程
opengl教程OpenGL是一种图形编程接口,常用于计算机图形学和游戏开发。
本文将介绍OpenGL的基本概念、功能和使用方法。
首先,OpenGL是一种跨平台的图形编程接口,可以在不同操作系统和硬件上运行。
它是一个开放标准,由Khronos Group维护和发展,因此可以在各种平台上使用,如Windows、MacOS、Linux等。
OpenGL的核心是图形渲染管线。
图形渲染管线是指一系列的图形处理阶段,用于将3D图形数据转化为2D图像。
这些阶段包括几何处理、光栅化、片元处理等。
每个阶段都包含了一些特定的操作和功能,通过这些操作和功能,我们可以实现各种不同的图形效果和渲染技术。
在使用OpenGL之前,需要初始化OpenGL的上下文,并创建一个OpenGL窗口。
通过OpenGL的API(Application Programming Interface),我们可以控制各个渲染阶段的操作和参数。
例如,我们可以设置物体的位置、颜色、纹理等属性,还可以控制光照、深度测试等渲染参数。
OpenGL还提供了一些基本的几何图形绘制函数,如绘制点、线段、三角形等。
通过这些函数,我们可以绘制各种基本的几何图形。
此外,OpenGL还支持纹理映射、着色器编程等高级渲染技术,可以实现更加复杂的视觉效果。
在OpenGL中,最常用的是顶点数组和顶点缓冲对象。
顶点数组用于存储顶点的位置、颜色、纹理坐标等属性,而顶点缓冲对象用于管理顶点数组的内存。
通过顶点数组和顶点缓冲对象,我们可以高效地传输大量的顶点数据到显存,并在图形渲染管线中使用。
除了基本的图形绘制,OpenGL还支持一些高级的渲染技术,如光照、阴影、深度测试等。
这些技术可以让我们实现更加逼真和真实感的图形效果。
例如,通过光照技术,我们可以模拟不同光源的光照效果,使物体看起来更加立体和有质感。
而深度测试可以确保正确的渲染顺序,使得物体之间的遮挡关系得到正确的呈现。
总结一下,OpenGL是一种功能丰富且强大的图形编程接口。
opengl用法
opengl用法OpenGL(Open Graphics Library)是一种用于图形渲染的跨平台编程接口,它提供了一组函数和命令,用于创建和操作2D、3D图形。
OpenGL被广泛应用于计算机图形学、游戏开发、虚拟现实和科学可视化等领域,具有强大的图形处理能力和灵活性。
一、OpenGL的基本概念OpenGL使用一种状态机的方式来管理和调用图形渲染的函数。
在开始使用OpenGL之前,我们需要了解一些基本概念和术语。
1. 坐标系:OpenGL使用右手坐标系,其中x轴向右延伸,y轴向上延伸,z轴指向观察者。
2. 顶点:顶点是构成图形的基本元素,它们包含位置、颜色和纹理坐标等信息。
3. 三角形:OpenGL最基本的图形是三角形。
通过连接三个顶点,可以构成一个平面上的三角形。
4. 缓冲区对象:OpenGL使用缓冲区来存储顶点数据、纹理数据等。
通过绑定缓冲区对象,我们可以将数据发送到显卡中进行处理。
5. 着色器(Shader):着色器是OpenGL中用于将顶点数据转换为屏幕上可见像素的程序。
二、OpenGL的基本用法下面我们将介绍一些常用的OpenGL函数,以帮助你了解如何使用OpenGL进行图形渲染。
1. 初始化OpenGL环境在开始渲染之前,我们首先需要初始化OpenGL环境。
通过调用glutInit函数和glutCreateWindow函数,可以创建一个OpenGL窗口。
2. 设置视口设置视口是指确定OpenGL窗口中要渲染的区域。
通过调用glViewport函数,我们可以指定视口的位置、宽度和高度。
3. 设置投影矩阵投影矩阵用于将三维坐标转换为二维坐标。
通过调用glMatrixMode和glOrtho函数,我们可以设置投影矩阵的类型和具体数值。
4. 绘制图形在设置好渲染环境后,我们可以开始绘制图形。
通过调用glBegin和glEnd函数,我们可以定义一个形状(如三角形或四边形)并填充颜色、添加纹理等。
OpenGL状态下的字符串的显示
OpenGL状态下的字符串的显示一直以来,OpenGL状态下的文字显示都是一个问题,本文使用嵌套显示列表的方式进行OpenGL状态下的字符串的显示。
有以下几点需要注意:1:本程序显示按照给定的高度和文字的位置显示某一种字体的文字,其中一些字体的参数定义在OpenGLText内部给定,可以随意将它抽出来。
如果将代码用于实际应用中,建议文字的文字间距自己设定,也可以随意添加文字的倾斜角、旋转角度、定位方式等等参数。
2:wglUseFontOutlines函数的第五个参数表示文字的精度(弦偏差),一般设置成零,但这样缺省的做法会导致文字太粗糙,可以将它设置成一个比较小的数,以提高文字显示的精确度,但这样会增加内存的占用量。
3:如果文字的高度比较小,文字的线条可能会出现断裂的现象,影响美观,解决这类问题有以下几种方式:(1)使用OpenGL反走样技术;(2)把文字的轮廓用线条勾勒出来;(3)在文字的Draw成员函数中多次调用glCallList函数,每次调用向周围平移一个像素,这样的话会使文字的线条断裂问题大为改观,速度也是三种方式中最快的。
本文的详细代码在这里,欢迎参考:/doc/d811878199.html,/opengltext.rar应用方式如下:COpenGLText text;COpenGLText text2;text2.m_dX=0;text2.m_dY=200; glLoadIdentity();glClear(GL_COLOR_BUFFER_BIT); glColor4f(0.0f, 0.0f, 1.0f, 1.0f); text.Draw("宋体");text2.Draw("楷体_GB2312"); glFlush();类的声明和实现如下:#includeusing namespace std;class COpenGLText{public://构造文字COpenGLText();virtual ~COpenGLT ext();//绘制制定字体的文字,字体只在第一次绘制时进行设置,之后可以传入空值void Draw(char *strFontName);//释放文字所占空间void Free();//文字字符串string m_str;//字符串高度double m_dHeight;//字符串位置double m_dX;double m_dY;protected:BOOL GenList();BOOL GenCharsLists(char *strFontName);int m_iDisplayList;};/////////////////////////////////////////////////////////////////// ///// COpenGLText Class/////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ///// Construction/Destruction/////////////////////////////////////////////////////////////////// ///COpenGLText::COpenGLText(){m_dX=0;m_dY=0;m_str="abc中国";m_dHeight=100;m_iDisplayList=0;}COpenGLText::~COpenGLText(){Free();}BOOL COpenGLText::GenCharsLists(char *strFontName) {HDC hdc;const char *str=m_str.c_str();hdc=CreateDC( "DISPLAY", "", "", NULL );int iNum=_mbslen((const unsigned char *)str);m_iDisplayList=glGenLists(iNum+1);HFONT hNewCFont;LOGFONT CLogFont; //存储当前字体参数//初始化字体参数memset( &CLogFont, 0, sizeof(LOGFONT) );CLogFont.lfEscapement = CLogFont.lfOrientation = 0; CLogFont.lfWeight = FW_NORMAL;CLogFont.lfCharSet = GB2312_CHARSET;CLogFont.lfOutPrecision = OUT_DEFAULT_PRECIS; CLogFont.lfQuality=DEFAULT_QUALITY;CLogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS; strcpy( CLogFont.lfFaceName, LPCTSTR(strFontName) );CLogFont.lfHeight=-10;CLogFont.lfWidth=0;hNewCFont=CreateFontIndirect(&CLogFont);HFONT hOldFont=(HFONT)SelectObject(hdc,hNewCFont); int i=0,j=0,iTotal=strlen(str);;UINT nChar=0;while(i{j++;if(IsDBCSLeadByte(str[i])){nChar=((unsigned char)str[i])*0x100+(unsigned char)str[i+1]; i+=2;}else{nChar=str[i];i++;}GLYPHMETRICSFLOAT agmf[1];BOOLbOK=wglUseFontOutlines(hdc,nChar,1,m_iDisplayList+j,0.002f,0, WGL_FONT_POLYGONS,agmf);}SelectObject(hdc,hOldFont);DeleteObject(hNewCFont);DeleteDC(hdc);return TRUE;}BOOL COpenGLText::GenList(){int iNum=_mbslen((const unsigned char *)m_str.c_str()); glNewList( m_iDisplayList, GL_COMPILE);for(int i=1;i<=iNum;i++){glPushMatrix();//此处修改文字间距glTranslated(m_dX+m_dHeight*(i-1),m_dY,0); glScaled(m_dHeight,m_dHeight,1);glCallList(m_iDisplayList+i);glPopMatrix();}glEndList();return TRUE;}void COpenGLText::Free(){if(glIsList(m_iDisplayList))glDeleteLists(m_iDisplayList,_mbslen((const unsigned char *)m_str.c_str())+1);m_iDisplayList=0;}void COpenGLText::Draw(char *strFontName){if(!glIsList(m_iDisplayList)){GenCharsLists(strFontName);GenList();}glCallList(m_iDisplayList); }。
OpenGL之曲线和曲面10页word
计算机图形学中,所有的光滑曲线、曲面都采用线段或三角形逼近来模拟,但为了精确地表现曲线,通常需要成千上万个线段或三角形来逼近,这种方法对于计算机的硬件资源有相当高的要求。
然而,许多有用的曲线、曲面在数学上只需要用少数几个参数(如控制点等)来描述。
这种方法所需要的存储空间比线段、三角形逼近的方法来所需要的空间要小得多,并且控制点方法描述的曲线、曲面比线段、三角形逼近的曲线、曲面更精确。
为了说明如何在OpenGL中绘制复杂曲线和曲面,我们对上述两类比方法都进行了介绍。
下面我们先来介绍有关基础知识,然后再看是如何实现的吧。
一、曲线的绘制OpenGL通过一种求值器的机制来产生曲线和曲面,该机制非常灵活,可以生成任意角度的多项式曲线,并可以将其他类型的多边形曲线和曲面转换成贝塞尔曲线和曲面。
这些求值器能在任何度的曲线及曲面上计算指定数目的点。
随后,OpenGL利用曲线和曲面上的点生成标准OpenGL图元,例如与曲线或曲面近似的线段和多边形。
由于可让OpenGL计算在曲线上所需的任意数量的点,因此可以达到应用所需的精度。
对于曲线,OpenGL中使用glMap1*()函数来创建一维求值器,该函数原型为:表一、参数target的取值表使用求值器定义曲线后,必须要启动求值器,才能进行下一步的绘制工作。
启动函数仍是glEnable(),其中参数与glMap1*()的第一个参数一致。
同样,关闭函数为glDisable(),参数也一样。
一旦启动一个或多个求值器,我们就可以构造近似曲线了。
最简单的方法是通过调用计算坐标函数glEvalcoord1*()替换所有对函数glVertex*()的调用。
与glVertex*()使用二维、三维和四维坐标不同,glEvalcoord1*()将u值传给所有已启动的求值器,然后由这些已启动的求值器生成坐标、法向量、颜色或纹理坐标。
OpenGL曲线坐标计算的函数形式如下:为了进一步说明OpenGL中曲线的绘制方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五1、实验目的和要求了解且掌握图形填充、曲线绘制和字符输出等技术。
2、实验内容1)用OpenGL实现用黑白相间的棋盘图案填充多边形2)用OpenGL分别用点和折线模式实现正弦和余弦的绘制3)用OpenGL在屏幕上输出”OpenGL”字样3、实验步骤1)相关算法及原理描述①图案填充多边形多边形模式设置函数为:void glPolygonMode(GLenum face,GLenum mode);控制多边形指定面的绘制模式。
参数face为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;参数mode为GL_POINT、GL_LINE或GL_FILL,分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。
缺省时,绘制的是正反面全填充式多边形。
设置图案填充式多边形函数为:void glPolygonStipple(const GLubyte *mask);为当前多边形定义填充图案模式。
参数mask是一个指向32x32位图的指针。
与虚点线绘制的道理一样,某位为1时绘制,为0时什么也不绘。
注意,在调用这个函数前,必须先启动一下,即用glEnable(GL_POLYGON_STIPPLE);不用时用glDisable(GL_POLYGON_STIPPLE) 关闭。
②正弦和余弦曲线的绘制线的绘制需要用到GL_LINES模式,它指定在glBegin/glEnd函数对中,从第一个点开始,两两构成一条直线段。
绘制正余弦曲线的话,只需要编写一段循环语句,指定绘制路线,设置不同线型。
③在屏幕上显示字符在OpenGL实用程序工具包中包含了一些预定义的字符库,用来显示点阵和矢量字符。
函数void glutBitmapCharacter(void *font,int character); 显示一个GLUT位图字符。
其中font是GLUT符号常数,指定点阵字库。
参数character采用ASCII编码的形式指定要显示的字符。
用函数glutBitmapCharacter 显示字符时,是将当前的光栅位置作为字符的左下角点,函数执行后,点阵字符装入刷新缓冲存储器,当前的光栅位置会在x坐标方向上获得一个字符宽度的增量,这样可以较轻易的生成一个水平方向的字符串。
2)程序调试、测试与运行结果分析①图案填充多边形②正余弦曲线的绘制③在屏幕上显示字符4、实验总结这次的实验有三个,其中显示字符比较简单,只需要调用一个函数就可以完成,各字母对应的ASCII码查找也简单,所以完成的很快很顺利。
再就是正余弦曲线的绘制,之前都有做过直线的绘制,基本都是大同小异,稍有难处的就是曲线坐标的确定。
在函数中我用一段循环语句来确定曲线点的坐标。
最难做的就是棋盘填充多边形了。
这个实验的代码也很简单,遇到困难的是数组定义位图。
其实数组的编写现在也没有搞太明白,感觉设计起来很难,有在网上查资料,才最终解决了。
对知识了解,但编写还是有些困难。
这次的实验也是一样的有趣,吸引人,以后会更加努力的。
5、附录1)棋盘填充多边形#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0); }GLubyte tianchong[]={/* 填充模式定义(32x32)*/0x00, 0x01, 0x80, 0x00,0x00, 0x03, 0xc0, 0x00,0x00, 0x07, 0xe0, 0x00,0x00, 0x0f, 0xf0, 0x00,0x00, 0x1f, 0xf8, 0x00,0x00, 0x3f, 0xfc, 0x00,0x00, 0x7f, 0xfe, 0x00,0x00, 0xff, 0xff, 0x00,0x01, 0xff, 0xff, 0x80,0x03, 0xff, 0xff, 0xc0,0x07, 0xff, 0xff, 0xe0,0x0f, 0xff, 0xff, 0xf0,0x1f, 0xff, 0xff, 0xf8,0x3f, 0xff, 0xff, 0xfc,0x7f, 0xff, 0xff, 0xfe,0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff,0x7f, 0xff, 0xff, 0xfe,0x3f, 0xff, 0xff, 0xfc,0x1f, 0xff, 0xff, 0xf8,0x0f, 0xff, 0xff, 0xf0,0x07, 0xff, 0xff, 0xe0,0x03, 0xff, 0xff, 0xc0,0x01, 0xff, 0xff, 0x80,0x00, 0xff, 0xff, 0x00,0x00, 0x7f, 0xfe, 0x00,0x00, 0x3f, 0xfc, 0x00,0x00, 0x1f, 0xf8, 0x00,0x00, 0x0f, 0xf0, 0x00,0x00, 0x07, 0xe0, 0x00,0x00, 0x03, 0xc0, 0x00,0x00, 0x01, 0x80, 0x00 };void Display(void){glClear(GL_COLOR_BUFFER_BIT);///* 绘制一个指定图案填充的矩形*/glColor3f(0.1,0.8,0.7);glEnable(GL_POL YGON_STIPPLE);glPolygonStipple(tianchong);glRectf(50.0f,100.0f,150.0f,50.0f);/* 绘制一个指定图案填充的三角形*/ glColor3f(0.9,0.86,0.4);glPolygonStipple(tianchong);glBegin(GL_TRIANGLES);glVertex2i(10,10);glVertex2i(90,10);glVertex2i(10,90);glEnd();glDisable (GL_POL YGON_STIPPLE);glFlush();glutSwapBuffers();}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGB);glutInitWindowSize(500,300);glutInitWindowPosition(100,100);glutCreateWindow("棋盘图形填充");glutDisplayFunc(Display);Initial();glutMainLoop();return 0;}2)正余弦曲线的绘制#include<math.h>#include <gl/glut.h>void MyDisplay();void Init();void DrawSin();void MyDisplay(){glClear(GL_COLOR_BUFFER_BIT);DrawSin();glFlush();}void Init(){glColor3f(1.0f,0.0f,0.0f);glClearColor(1.0f,1.0f,1.0f,1.0f);}void DrawSin(){const float factor=0.1;glBegin(GL_LINES);glVertex2f(-1,0);glVertex2f(1,0);glVertex2f(0,-1);glVertex2f(0,1);glEnd();//glLineStipple (5,0x1C47);//glBegin (GL_LINES); //用虚线绘制glBegin(GL_LINE_STRIP);for(floatx=-1/factor;x<1/factor;x+=0.001){glVertex2f(x*factor,sin(x)*factor);}glEnd();glBegin(GL_LINE_STRIP);for(floaty=-1/factor;y<1/factor;y+=0.001){glVertex2f(y*factor,cos(y)*factor);}glEnd();glutSwapBuffers();}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|G LUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(100,150);glutCreateWindow("正余弦曲线绘制");Init();glutDisplayFunc(MyDisplay);glutMainLoop();return 0;}3)在屏幕显示字符#include<gl/glut.h>int winWidth=600,winHeight=300;void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f);}void ChangeSize(int w,int h){winWidth=w; winHeight=h;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,winWidth,0.0,winHeight);}void Display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glutStrokeCharacter(GLUT_STROKE_ROMAN,79);glutStrokeCharacter(GLUT_STROKE_ROMAN,112);glutStrokeCharacter(GLUT_STROKE_ROMAN,101);glutStrokeCharacter(GLUT_STROKE_ROMAN,110);glutStrokeCharacter(GLUT_STROKE_ROMAN,71);glutStrokeCharacter(GLUT_STROKE_ROMAN,76);glutSwapBuffers();}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(500,300);glutInitWindowPosition(100,100);glutCreateWindow("Write Words");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}。