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曲线的绘制;