利用VC++进行OpenGL程序设计.docx
- 文档编号:25226335
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:26
- 大小:54.50KB
利用VC++进行OpenGL程序设计.docx
《利用VC++进行OpenGL程序设计.docx》由会员分享,可在线阅读,更多相关《利用VC++进行OpenGL程序设计.docx(26页珍藏版)》请在冰豆网上搜索。
利用VC++进行OpenGL程序设计
利用VC++进行OpenGL程序设计
随着计算机技术的飞速发展,计算机性价比越来越高。
这为计算机图形学发展奠定了
坚实的基础。
Microsoft、SGI等大公司推出了OpenGL三维图形标准,彻底改变过去只
能依赖于价格昂贵的图形工作站及复杂的三维图形软件从事三维图形计算机应用的历
史。
OpenGL的出现为大多数程序员利用C语言操纵PC机绘制复杂图形的想法变为现实
。
本文介绍了利用VC++5.0,借助于OpenGL库函数设计三维图形的基本方法及编程中
的注意事项。
由于采用了传统C语言设计方法,这大大方便那些初次接触OpenGL的程
序员,可使他们快速掌握设计OpenGL程序的方法和步骤。
1OpenGL介绍
OpenGL是独立于操作系统的、开放式的三维图形标准。
OpenGL实际上是一种图形与硬
件的接口,它包括了100多个图形函数,可以利用这些函数建立三维模型和三维实时
交互。
与其他图形软件程序设计接口不同的是,OpenGL提供了非常清晰的图形函数。
利用这些图形函数,用户不但可以直接使用自己的数据,而且可以利用其他的数据源
。
OpenGL也是网络透明的,它的运行机制是客户/服务器机制,由客户(OpenGL的应
用程序)向服务器(OpenGL的内核)发送OpenGL命令请求,服务器则解释执行这些命
令。
一般客户和服务器运行于同一台计算机上。
在WindowsNT平台上,OpenGL图
形库被封装在opengl32.dll中。
WindowsNT调用opengl32.dll动态链接库,处理用
户程序对OpenGL函数调用,然后再调用winsrv.dll,OpenGL的命令再次得到处理并直
接传给Win32的其他设备驱动接口,最后把处理的图形指令传递给视频显示驱动程序
。
2OpenGL程序设计方法及注意事项
A由于OpenGL的库函数主要分布在三个库(glu32.lib、glaux.lib、opengl32.lib
)中,所以在程序员的Porject中应包含这三个库文件。
B程序员的程序设计方法既可使用DOS程序的顺序的、过程驱动的程序设计方法,即
以main()函数开始。
也可选用Windows程序的事件驱动的设计方法,即以WinMain()
函数作为应用程序的入口点。
由于不同的程序设计方法决定程序员在用VC++5.0开发
程序时所选的Projects的类型不一样(Win32Application、Win32ConsoleApplication)。
所以编程前要决定程序的设计方法。
C利用VC++5.0设计基于NT平台的OpenGL程序,先选File|New决定Projects的类型,
建立Projects文件。
利用Project|Addtoproject将相关OpenGL库文件及源代码文
件加入Project中,编译、链接即可。
3举例
下面的程序在WindowsNT平台上,利用VC++5.0调试通过。
Project包含文件:
hu.c、glaux.lib、glu32.lib、opengl32.lib
Project类型:
Win32ConsoleApplication
hu.c源代码为:
#include"windows.h"
#include
#include
#include
voidCALLBACKdisplay(void);
voidCALLBACKdisplay(void)
{
inti;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(100.0,0.0,0.0);
glEnable(GL_LINE_STIPPLE);
glLineStipple(1,0x00FF);
glBegin(GL_LINES);
glVertex2f(10.0,100.0);
glVertex2f(260.0,100.0);
glEnd();
glFlush();
}
intmain(intargc,char**argv)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGB);
auxInitPosition(0,0,300,130);
auxInitWindow("简单的OpenGL程序");
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
auxMainLoop(display);
return(0);
}
4结论
上面的源程序仅是简单地绘制一条线,但从中可知OpenGL程序设计的方法。
在
VC++5.0中,Microsoft公司给出了许多OpenGL样例程序,读者可按照上文介绍的方法
调试VC++5.0中的OpenGL样例程序。
从中可进一步感受到OpenGL在三维图形计算机应
用中的微妙之处。
glBegin(GL_LINES);
glColor3f(1.0,0.0,0.0);
glVertex2f(0,0);
glVertex2f(1,1);
glColor3f(0,0.1,0.0);
glVertex2f(0.2,0);
glVertex2f(1.20,1);
glEnd();
#include
#include
#include
intxs,ys,xe,ye;
voidMidpointLine(intx0,inty0,intx1,inty1)
{
if((x0!
=x1)&&(y0!
=y1))
{
inta,bdelta1,delta2,d,x,y;
a=y0-y1;
b=x1-x0;
d=2*a+b;
delta1=2*a;
delta2=2*(a+b);
x=x0;
y=y0;
glVertex2i(x,y);
while(x { if(d<0) { x++; y++; d+=delta2; } else { x++; d+=delta1; } glvertex2i(x,y); } } else { intmin,d; if(x0==x1) { intx=x0,y; y=(y0<=y1)? y0: y1; d=fabs((double)(y0-y1)); while(d>=0) { glvertex2i(x,y); y++; d--; } } if(y0=y1) { intx,y=y0; x=(x0<=x1)? x0: x1; d=fabs((double)(x0-x1)); while(d>=0) { glVertex2i(x,y); X++; d--; } } } } voidlineSegment() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,0.0); glBegin(GL_POINTS); MidpointLine(xs,ys,xe,ye); glEnd(); glFlush(); } voidmain() { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); printf("输入线段起始和终止点坐标(范围为0-500,0-500)"); scanf("%d,%d,%d,%d",&xs,&ys,&xe,&ye); glutInitWIndowPosition(50,100); glutInitWindowSize(500,500); glutCreateWindow("中点画线算法"); glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,500.0,0.0,500.0); glutDisplayFunc(lineSegment); glutMainLoop(); } #include #include #include intxs,ys,xe,ye; voidMidpointLine(intx0,inty0,intx1,inty1) { if((x0! =x1)&&(y0! =y1)) { inta,b,delta1,delta2,d,x,y; a=y0-y1; b=x1-x0; d=2*a+b; delta1=2*a; delta2=2*(a+b); x=x0; y=y0; glVertex2i(x,y); while(x { if(d<0) { x++; y++; d+=delta2; } else { x++; d+=delta1; } glVertex2i(x,y); } } else { intmin,d; if(x0==x1) { intx=x0,y; y=(y0<=y1)? y0: y1; d=fabs((double)(y0-y1)); while(d>=0) { glVertex2i(x,y); y++; d--; } } if(y0=y1) { intx,y=y0; x=(x0<=x1)? x0: x1; d=fabs((double)(x0-x1)); while(d>=0) { glVertex2i(x,y); x++; d--; } } } } voidlineSegment() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,0.0); glBegin(GL_POINTS); MidpointLine(xs,ys,xe,ye); glEnd(); glFlush(); } voidmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); printf("输入线段起始和终止点坐标(范围为0-500,0-500)"); scanf("%d,%d,%d,%d",&xs,&ys,&xe,&ye); glutInitWindowPosition(50,100); glutInitWindowSize(500,500); glutCreateWindow("中点画线算法"); glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,500.0,0.0,500.0); glutDisplayFunc(lineSegment); glutMainLoop(); } 在现代社会,每天会发生很多事,这些事情有的耸人听闻,有的令人震惊,也有的好事、喜事令人开心,但是那些才有意义传播呢? 这就靠一个记者凭借自己的直觉,或根据新闻价值标准来判断,日常生活里发生的浩如烟海的事件中,只有最重要、最有意义和最令人感兴趣的才值得提供给读者。 在每一件新闻中,记者有没有掺杂个人态度,有没有完整真实反映这个事件,对每个人都意义重大,因为每个人都有了解事情真相的权利。 所以,: “新闻不是一个事件,新闻是一种态度。 ”记者也不是一种工作,也是一种态度。 #include #include #include intxs,ys,xe,ye; voidLineDDA(intx0,inty0,intx1,inty1) { floatdy,dx,x,y,m; dx=x1-x0; dy=y1-y0; if(dx! =0) { m=dy/dx; if(m<=1&&m>=-1) { y=y0; for(x=x0;x<=x1;x++) { glVertex2i(x,int(y+0.5)); y+=m; } } if(m>1||m<-1) { m=1/m; x=x0; for(y=y0;y=y1;y++) { glVertex2i(int(x+0.5),y); x+=m; } } } else { intx=x0,y; y=(y0<=y1)? y0: y1; intd=fabs((double)(y0-y1)); while(d>=0) { glVertex2i(x,y); y++; d--; } } } voidlineSegment() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,0.0); glBegin(GL_POINTS); LineDDA(xs,ys,xe,ye); glEnd(); glFlush(); } voidmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); printf("输入线段起始和终点坐标(范围为0-500,0-500)"); scanf("%d,%d,%d,%d",&xs,&ys,&xe,&ye); glutInitWindowPosition(50,100); glutInitWindowSize(500,500); glutCreateWindow("DDA算法"); glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,500.0,0.0,500.0); glutDisplayFunc(lineSegment); glutMainLoop(); } voidhorilineBrush(intx,inty,intnwidth) { for(inti=0;i<=nwidth;i++) { glVertex2i(x+i,y); glVertex2i(x-i,y); } } voidvertlineBrush(intx,inty,intnwidth) { for(inti=0;i<=nwidth;i++) { glVertex2i(x,y+i); glVertex2i(x,y-i); } } #include #include #include intxs,ys; structPoint { intx; inty; }; voidMultiplyMatrixAxB(inta[3][3],intb[3][3],intc[3][3],intnpt)//矩阵相乘 { inti,j,k,sum; for(i=0;i { for(k=0;k<3;k++) { sum=0; for(j=0;j<3;j++) sum+=a[i][j]*b[j][k]; c[i][k]=sum; } } } voidTranslation2D(Pointshape[],intn,intdeltax,intdeltay,PointRshape[]) { inttrans[3][3]={1,0,0,0,1,0,0,0,1}; trans[2][0]=deltax; trans[2][1]=deltay; intpnt[1][3]={0,0,1}; inti; intresult[1][3]={0}; for(i=0;i { pnt[0][0]=shape[i].x; pnt[0][1]=shape[i].y; MultiplyMatrixAxB(pnt,trans,result,1); Rshape[i].x=result[0][0]; Rshape[i].y=result[0][1]; } } voidLineDDA(intx0,inty0,intx1,inty1) { floatdy,dx,x,y,m; dx=x1-x0; dy=y1-y0; if(dx! =0) { m=dy/dx; if(m<=1&&m>=-1) { y=y0; for(x=x0;x<=x1;x++) { glVertex2i(x,int(y+0.5)); y+=m; } } if(m>=1||m<=-1) { m=1/m; x=x0; for(y=y0;y<=y1;y++) { glVertex2i(int(x+0.5),y); x+=m; } } } else { intx=x0,y; y=(y0<=y1)? y0: y1; intd=fabs((double)(y0-y1)); while(d>=0) { glVertex2i(x,y); y++; d--; } } } voidTranslation2DSegment() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,0.0); glBegin(GL_POINTS); //绘制坐标系,原点为显示屏幕像素(200,200)位置 LineDDA(10,200,400,200); LineDDA(395,195,400,200); LineDDA(400,200,395,205); LineDDA(200,400,200,10); LineDDA(200,10,205,15); LineDDA(200,10,195,15); //实验数据三角形 Pointap,bp,cp; ap.x=40;ap.y=40; bp.x=40;bp.y=80; cp.x=80;cp.y=40; //Pointshape[]={{ap.x,ap.y},{bp.x,bp.y},{cp.x,cp.y}}; Pointshape[3]; shape[0]=ap; shape[1]=bp; shape[2]=cp; PointRshape[3]={0}; Translation2D(shape,3,xs,ys,Rshape); //为了显示结果,需要在数据输出之前进行坐标变换 inti; for(i=0;i<=3;i++) { shape[i].x=200+shape[i].x; Rshape[i].x=200+Rshape[i].x; shape[i].y=200-shape[i].y; Rshape[i].y=200-Rshape[i].y; } //输出结果 LineDDA(shape[0].x,shape[0].y,shape[1].x,shape[1].y); LineDDA(shape[1].x,shape[1].y,shape[2].x,shape[2].y); LineDDA(shape[0].x,shape[0].y,shape[2].x,shape[2].y); LineDDA(Rshape[0].x,Rshape[0].y,Rshape[1].x,Rshape[1].y); LineDDA(Rshape[1].x,Rshape[1].y,Rshape[2].x,Rshape[2].y); LineDDA(Rshape[0].x,Rshape[0].y,Rshape[2].x,Rshape[2].y); glEnd(); glFlush(); } voidmain(intargc,char*argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); printf("输入x和y坐标平移量(范围为0-500,0-500)"); scanf("%d,%d",&xs,&ys); glutInitWindowPosition(50,100); glutInitWindowSize(500,500); glutCreateWindow("二维平移"); glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,500.0,0.0,500.0); glutDisplayFunc(Translation2DSegment); glutMainLoop(); } #include #include #include floatjiaodu; structPoint { intx; inty; }; voidMultiplyMatrixAxB(inta[3][3],floatb[3][3],floatc[3][3],intnpt)//矩阵相乘 { inti,j,k,sum; for(i=0;i { for(k=0;k<3;k++) { sum=0; for(j=0;j<3;j++) sum+=a[i][j]*b[j][k]; c[i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 VC 进行 OpenGL 程序设计