实验一OPENGL基本图形绘制.docx

上传人:b****6 文档编号:8555229 上传时间:2023-01-31 格式:DOCX 页数:13 大小:93.02KB
下载 相关 举报
实验一OPENGL基本图形绘制.docx_第1页
第1页 / 共13页
实验一OPENGL基本图形绘制.docx_第2页
第2页 / 共13页
实验一OPENGL基本图形绘制.docx_第3页
第3页 / 共13页
实验一OPENGL基本图形绘制.docx_第4页
第4页 / 共13页
实验一OPENGL基本图形绘制.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

实验一OPENGL基本图形绘制.docx

《实验一OPENGL基本图形绘制.docx》由会员分享,可在线阅读,更多相关《实验一OPENGL基本图形绘制.docx(13页珍藏版)》请在冰豆网上搜索。

实验一OPENGL基本图形绘制.docx

实验一OPENGL基本图形绘制

实验一 OpenGL基本图形绘制

一、实验目的和要求:

1、了解三维图形编程机制以及OpenGL三维图形绘制的程序结构;

2、通过编程实现简单三维图形的绘制;

3、掌握三维图形显示原理。

二、实验内容:

1、使用VisualC++6.0和OpenGL编写一个简单的三维程序。

2、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;

三、实验步骤:

1、初步了解OpenGL的功能以及语法特点;

2、下载glut包,复制glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;

3、创建VC工程:

选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32ConsoleApplication项,然后填入你自己的Projectname,如Test,回车即可。

VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;

4、为项目添加文件:

为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:

glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:

\programfiles\devstudio\vc\lib)中。

选中菜单Project->AddToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link->Object/libraryModules即可。

点击工具条中NewTextFile按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了;

5、请将下面的程序写入源文件Test.c;

#include

#include

constintn=60;

constGLfloatR=0.2f;

constGLfloatPi=3.1415926536f;

voidmyDisplay(void)

{

inti;

glClear(GL_COLOR_BUFFER_BIT);

//glShadeModel(GL_FLAT);

//glShadeModel(GL_SMOOTH);

//点

glPointSize(2.0);

glBegin(GL_POINTS);

glVertex2f(0.0f,0.0f);

glEnd();

//由闭合折线组成的圆

glBegin(GL_LINE_LOOP);

glColor3f(1.0,1.0,0.0);

for(i=0;i

glVertex2f(R*cos(2*Pi/n*i),R*sin(2*Pi/n*i));

glEnd();

//由不闭合折线组成的两个三角形构成的六星阵图

glBegin(GL_LINE_STRIP);

glColor3f(1.0,0.0,0.0);

glVertex2f(0.0,0.2);

glVertex2f(0.1732,-0.1);

glVertex2f(-0.1732,-0.1);

glVertex2f(0.0,0.2);

glEnd();

glBegin(GL_LINE_STRIP);

glVertex2f(0.0,-0.2);

glVertex2f(0.1732,0.1);

glVertex2f(-0.1732,0.1);

glVertex2f(0.0,-0.2);

glEnd();

//连续三角形组成的扇形

glBegin(GL_TRIANGLE_FAN);

glVertex2f(0.5,0.5);

glVertex2f(0.5,1.0);

glColor3f(0.8,0.2,0.5);

glVertex2f(0.8,0.9);

glColor3f(0.2,0.5,0.8);

glVertex2f(0.9,0.8);

glColor3f(0.8,0.5,0.2);

glVertex2f(1.0,0.5);

glEnd();

//虚线

glLineWidth(3.0);

glEnable(GL_LINE_STIPPLE);

glLineStipple(2,0x0F0F);

glBegin(GL_LINES);

glColor3f(0.0,0.0,1.0);

glVertex2f(-0.5f,1.0f);

glColor3f(1.0,1.0,1.0);

glVertex2f(-0.5f,-1.0f);

glEnd();

//线

glLineWidth(0.5);

glDisable(GL_LINE_STIPPLE);

glBegin(GL_LINES);

glColor3f(1.0,0.0,0.0);

glVertex2f(0.5f,1.0f);

glColor3f(1.0,1.0,1.0);

glVertex2f(1.0f,0.5f);

glEnd();

glFlush();

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutInitWindowPosition(0,0);

glutInitWindowSize(600,600);

glutCreateWindow("第一个OpenGL程序");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return0;

}

/*GL_POINTS单个顶点集

GL_LINES多组双顶点线段

GL_POLYGON单个简单填充凸多边形

GL_TRAINGLES多组独立填充三角形

GL_QUADS多组独立填充四边形

GL_LINE_STRIP不闭合折线

GL_LINE_LOOP闭合折线

GL_TRAINGLE_STRIP线型连续填充三角形串

GL_TRAINGLE_FAN扇形连续填充三角形串

GL_QUAD_STRIP连续填充四边形串

*/

6、修改绘图函数myDisplay中的内容,自由发挥并绘制一些简单的三维图形;

7、调试程序并使得效果最好;

完成实验报告并提交程序源代码。

实验二 OpenGL三维投影变换

一、实验目的和要求:

1、进一步熟悉OpenGL三维绘图操作;

2、理解三维物体的平行投影方式和透视投影方式;

3、了解OpenGL的投影变换操作。

二、实验内容:

1、使用VisualC++6.0和OpenGL进行简单的三维绘图,并设置不同的投影方式。

三、实验步骤:

1、下载glut包,复制glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;

2、创建VC工程:

选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32ConsoleApplication项,然后填入你自己的Projectname,如Test,回车即可。

VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;

3、为项目添加文件:

为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:

glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:

\programfiles\devstudio\vc\lib)中。

选中菜单Project->AddToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link->Object/libraryModules即可。

点击工具条中NewTextFile按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了;

4、请将下面的程序写入源文件Test.c;

#include

staticintangle=45;//定义旋转角度

voidreshape(GLsizeiw,GLsizeih)

{

//视口变换

glViewport(0,0,w,h);//使用glViewport来定义视口。

其中前两个参数定义了视口的左下脚(0,0表示最左下方)

//后两个参数分别是宽度和高度。

//投影变换

glMatrixMode(GL_PROJECTION);//OpenGL支持两种类型的投影变换,即透视投影和正投影。

//投影也是使用矩阵来实现的。

如果需要操作投影矩阵,需要以

//GL_PROJECTION为参数调用glMatrixMode函数。

//glLoadIdentity();//重置模型观察矩阵

//glFrustum(-1.0,1.0,-1.0,1.0,1.0,10.0);

//使用glFrustum函数可以将当前的可视空间设置为透视投影空间。

//用它之前先要用glMatrixMode()说明当前矩阵方式是投影GL_PROJECTION。

//也可以使用更常用的gluPerspective函数。

//空间可以是“正投影”的(使用glOrtho或gluOrtho2D),

//也可以是“透视投影”的(使用glFrustum或gluPerspective)。

glOrtho(-1.0,1.0,-1.0,1.0,-1.0,6.0);

//正射投影,同glFrustum,六个参数分别为:

左右垂直切面坐标,底上水平切面坐标

//近深度切面和远深度切面的距离,可为负值。

}

voidmyDisplay()

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

//模型变换

glMatrixMode(GL_MODELVIEW);

glTranslatef(0.0f,0.0f,0.0f);//物体在三个坐标上的位移值。

glRotatef(angle,0.5f,0.5f,0.0f);//物体绕(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。

glScalef(1.0,1.0,1.0);//三个参数分别是X、Y、Z轴向的比例变换因子。

//金字塔底边

glBegin(GL_QUADS);

glVertex3f(0.5f,-0.5f,0.5f);

glVertex3f(-0.5f,-0.5f,0.5f);

glVertex3f(0.5f,-0.5f,-0.5f);

glVertex3f(-0.5f,-0.5f,-0.5f);

glEnd();

glBegin(GL_TRIANGLES);

//三角形前侧面

glColor3f(1.0f,0.0f,0.0f);

glVertex3f(0.0f,0.5f,0.0f);

glColor3f(0.0f,0.5f,0.0f);

glVertex3f(-0.5f,-0.5f,0.5f);

glColor3f(0.0f,0.0f,0.5f);

glVertex3f(0.5f,-0.5f,0.5f);

//三角形右侧面

glColor3f(0.0f,1.0f,0.0f);

glVertex3f(0.0f,0.5f,0.0f);

glColor3f(0.0f,0.0f,0.5f);

glVertex3f(0.5f,-0.5f,0.5f);

glColor3f(0.0f,0.5f,0.0f);

glVertex3f(0.5f,-0.5f,-0.5f);

//三角形后侧面

glColor3f(0.0f,0.0f,0.1f);

glVertex3f(0.0f,0.5f,0.0f);

glColor3f(0.0f,0.5f,0.0f);

glVertex3f(0.5f,-0.5f,-0.5f);

glColor3f(0.0f,0.0f,0.5f);

glVertex3f(-0.5f,-0.5f,-0.5f);

//三角形左侧面

glColor3f(1.0f,1.0f,1.0f);

glVertex3f(0.0f,0.5f,0.0f);

glColor3f(0.0f,0.0f,0.5f);

glVertex3f(-0.5f,-0.5f,-0.5f);

glColor3f(0.0f,0.5f,0.0f);

glVertex3f(-0.5f,-0.5f,0.5f);

glEnd();

glFlush();

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutInitWindowPosition(0,0);

glutInitWindowSize(500,500);

glutCreateWindow("OpenGL3D坐标转换");

glutReshapeFunc(reshape);

glutDisplayFunc(&myDisplay);

glutMainLoop();

return0;

}

5、修改投影方式,观察不同的投影变换效果,适当修改绘图函数myDisplay中的内容,自由发挥并绘制三维图形;

6、完成实验报告并提交程序源代码。

实验三 绘制Bezier曲线

一、实验目的和要求:

1、理解Bezier曲线的生成方式;

2、掌握二次Bezier曲线和三次Bezier曲线的生成算法;

3、使用C语言实现Bezier曲线的绘制。

二、实验内容:

1、使用VisualC++6.0和OpenGL进行二次Bezier曲线和三次Bezier曲线的绘制。

三、实验步骤:

1、下载glut包,复制glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;

2、创建VC工程:

选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32ConsoleApplication项,然后填入你自己的Projectname,如Test,回车即可。

VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;

3、为项目添加文件:

为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:

glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:

\programfiles\devstudio\vc\lib)中。

选中菜单Project->AddToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link->Object/libraryModules即可。

点击工具条中NewTextFile按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了;

4、请将下面的程序写入源文件Test.c,下面的程序完成二次Bezier曲线的绘制;

#include

#include

intSCREEN_HEIGHT=480;//屏幕高度

//跟踪鼠标点击次数,达到3次后绘制Bezier曲线

intNUMPOINTS=0;

//点

classPoint{

public:

floatx,y;

voidsetxy(floatx2,floaty2){x=x2;y=y2;}

constPoint&operator=(constPoint&rPoint){

x=rPoint.x;

y=rPoint.y;

return*this;

}

};

Pointabc[3];

voidmyInit(){

glClearColor(0.0,0.0,0.0,0.0);

glColor3f(1.0,0.0,0.0);

glPointSize(4.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,640.0,0.0,480.0);

}

voiddrawDot(intx,inty){

glBegin(GL_POINTS);

glVertex2i(x,y);

glEnd();

glFlush();

}

voiddrawLine(Pointp1,Pointp2){

glBegin(GL_LINES);

glVertex2f(p1.x,p1.y);

glVertex2f(p2.x,p2.y);

glEnd();

glFlush();

}

//计算下一个Bezier曲线上的点

PointdrawBezier(PointA,PointB,PointC,doublet){

PointP;

P.x=pow((1-t),2)*A.x+2*t*(1-t)*B.x+pow(t,2)*C.x;

P.y=pow((1-t),2)*A.y+2*t*(1-t)*B.y+pow(t,2)*C.y;

returnP;

}

voidmyMouse(intbutton,intstate,intx,inty){

//左键按下

if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN){

//存储鼠标点击的点

abc[NUMPOINTS].setxy((float)x,(float)(SCREEN_HEIGHT-y));

NUMPOINTS++;

//绘制红点

drawDot(x,SCREEN_HEIGHT-y);

//绘制Bezier曲线

if(NUMPOINTS==3){

glColor3f(1.0,1.0,1.0);

//绘制控制多边形

drawLine(abc[0],abc[1]);

drawLine(abc[1],abc[2]);

PointPOld=abc[0];

//绘制Bezier曲线段,控制t的增量可以控制曲线精度

for(doublet=0.0;t<=1.0;t+=0.1){

PointP=drawBezier(abc[0],abc[1],abc[2],t);

drawLine(POld,P);

POld=P;

}

glColor3f(1.0,0.0,0.0);

NUMPOINTS=0;

}

}

}

voidmyDisplay(){

glClear(GL_COLOR_BUFFER_BIT);

glFlush();

}

intmain(intargc,char*argv[]){

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(640,480);

glutInitWindowPosition(100,150);

glutCreateWindow("BezierCurve");

glutMouseFunc(myMouse);

glutDisplayFunc(myDisplay);

myInit();

glutMainLoop();

return0;

}

5、扩展程序代码,可以支持3次Bezier曲线的绘制;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1