图形程序设计教材示例源代码.docx
- 文档编号:1868184
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:145
- 大小:61.17KB
图形程序设计教材示例源代码.docx
《图形程序设计教材示例源代码.docx》由会员分享,可在线阅读,更多相关《图形程序设计教材示例源代码.docx(145页珍藏版)》请在冰点文库上搜索。
图形程序设计教材示例源代码
第1章OpenGL基础知识
一个简单的OpenGL程序:
#include
#include
#include
#include
voidmain(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("simple");
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
glFlush();
_sleep(100000);
}
绘制一个彩色的三角形。
代码如下:
#include
#include
voidbackground(void)
{
glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色
}
voidmyDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写
glBegin(GL_TRIANGLES);//开始画三角形
glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)
glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色
glVertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)
glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色
glVertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0)
glEnd();//三角形结束
glFlush();//强制OpenGL函数在有限时间内运行
}
voidmyReshape(GLsizeiw,GLsizeih)
{
glViewport(0,0,w,h);//设置视口
glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION
glLoadIdentity();//将当前矩阵置换为单位阵
if(w<=h)
gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵
else
gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW
}
intmain(intargc,char**argv)
{
/*初始化*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(200,200);
/*创建窗口*/
glutCreateWindow("Triangle");/*绘制与显示*/
background();
glutReshapeFunc(myReshape);
glutDisplayFunc(myDisplay);
glutMainLoop();
return(0);
}
第2章OpenGL建模技术
开发实例:
基本三维几何物体绘制
{
staticvoidSetColor(intindex)
if(rgb){
switch(index){
case0:
glColor3f(0.0,0.0,0.0);
break;
case1:
glColor3f(1.0,0.0,0.0);
break;
case2:
glColor3f(0.0,1.0,0.0);
break;
case3:
glColor3f(1.0,1.0,0.0);
break;
case4:
glColor3f(0.0,0.0,1.0);
break;
case5:
glColor3f(1.0,0.0,1.0);
break;
case6:
glColor3f(0.0,1.0,1.0);
break;
case7:
glColor3f(1.0,1.0,1.0);
break;
}
}
else
{
glIndexi(index);
}
//键盘响应函数
staticvoidKey(unsignedcharkey,intx,inty)
{
switch(key)
{
case‘1’:
mode1=!
mode1;
glutPostRedisplay();
break;
case‘2’:
mode2=!
mode2;
glutPostRedisplay();
break;
case‘3’:
RotateColorMask();
glutPostRedisplay();
break;
case27:
exit(0);
}
}
编写各图形的绘制位置设置函数。
staticvoidViewport(GLintrow,GLintcolumn)
{
GLintx,y;
boxW=(windW-(COLS+1)*GAP)/COLS;
boxH=(windH-(ROWS+1)*GAP)/ROWS;
x=GAP+column*(boxW+GAP);
y=GAP+row*(boxH+GAP);
glViewport(x,y,boxW,boxH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-boxW/2,boxW/2,-boxH/2,boxH/2,0.0,1.0);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_SCISSOR_TEST);
glScissor(x,y,boxW,boxH);
}
点图元的绘制函数。
//绘制点
staticvoidPoint(void)
{
GLinti;
glBegin(GL_POINTS);
for(i=1;i<8;i++){
GLintj=i*2;
SetColor(i);
glVertex2i(-j,-j);
glVertex2i(-j,0);
glVertex2i(-j,j);
glVertex2i(0,j);
glVertex2i(j,j);
glVertex2i(j,0);
glVertex2i(j,-j);
glVertex2i(0,-j);
}
glEnd();
}
线图元的绘制函数。
//绘制线
staticvoidLines(void)
{
GLinti;
glPushMatrix();
glTranslatef(-12,0,0);
for(i=1;i<8;i++)
{
SetColor(i);
glBegin(GL_LINES);
glVertex2i(-boxW/4,-boxH/4);
glVertex2i(boxW/4,boxH/4);
glEnd();
glTranslatef(4,0,0);
}
glPopMatrix();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_LINES);
glVertex2i(0,0);
glEnd();
}
不闭合折线图元的绘制函数。
//绘制不闭合的折线
staticvoidLineStrip(void)
{
glBegin(GL_LINE_STRIP);
SetColor
(1);
glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(-boxH/4));
SetColor
(2);
glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(boxH/4));
SetColor(3);
glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(boxH/4));
SetColor(4);
glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(-boxH/4));
glEnd();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_LINE_STRIP);
glVertex2i(0,0);
glEnd();
}
闭合折线图元的绘制函数。
//绘制闭合折线
staticvoidLineLoop(void)
{
glBegin(GL_LINE_LOOP);
SetColor
(1);
glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(-boxH/4));
SetColor
(2);
glVertex2f(PIXEL_CENTER(-boxW/4),PIXEL_CENTER(boxH/4));
SetColor(3);
glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(boxH/4));
SetColor(4);
glVertex2f(PIXEL_CENTER(boxW/4),PIXEL_CENTER(-boxH/4));
glEnd();
glEnable(GL_LOGIC_OP);
glLogicOp(GL_XOR);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE);
SetColor(5);
glBegin(GL_LINE_LOOP);
glVertex2f(PIXELCENTER(-boxW/8),PIXEL_CENTER(-boxH/8));
glVertex2f(PIXEL_CENTER(-boxW/8),PIXEL_CENTER(boxH/8));
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2f(PIXEL_CENTER(-boxW/8),PIXEL_CENTER(boxH/8+5));
glVertex2f(PIXEL_CENTER(boxW/8),PIXEL_CENTER(boxH/8+5));
glEnd();
glDisable(GL_LOGIC_OP);
glDisable(GL_BLEND);
SetColor(6);
glBegin(GL_POINTS);
glVertex2i(0,0);
glEnd();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_LINE_LOOP);
glVertex2i(0,0);
glEnd();
}
位图图元的绘制函数
//绘制位图
staticvoidBitmap(void)
{
glBegin(GL_LINES);
SetColor
(1);
glVertex2i(-boxW/2,0);
glVertex2i(boxW/2,0);
glVertex2i(0,-boxH/2);
glVertex2i(0,boxH/2);
SetColor
(2);
glVertex2i(0,-3);
glVertex2i(0,-3+OPENGL_HEIGHT);
SetColor(3);
glVertex2i(0,-3);
glVertex2i(OPENGL_WIDTH,-3);
glEnd();
SetColor(4);
glPixelStorei(GL_UNPACK_LSB_FIRST,GL_TRUE);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glRasterPos2i(0,0);
glBitmap(OPENGL_WIDTH,OPENGL_HEIGHT,0,3,0.0,0.0,OpenGL_
bits);
}
三角形图元的绘制函数。
//绘制三角形
staticvoidTriangles(void)
{
glBegin(GL_TRIANGLES);
SetColor
(1);
glVertex2i(-boxW/4,-boxH/4);
SetColor
(2);
glVertex2i(-boxW/8,-boxH/16);
SetColor(3);
glVertex2i(boxW/8,-boxH/16);
SetColor(4);
glVertex2i(-boxW/4,boxH/4);
SetColor(5);
glVertex2i(-boxW/8,boxH/16);
SetColor(6);
glVertex2i(boxW/8,boxH/16);
glEnd();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_TRIANGLES);
glVertex2i(0,0);
glVertex2i(-100,100);
glEnd();
}
连线三角形串图元的绘制函数。
//绘制线性的连线三角形串
staticvoidTriangleStrip(void)
{
glBegin(GL_TRIANGLE_STRIP);
SetColor
(1);
glVertex2i(-boxW/4,-boxH/4);
SetColor
(2);
glVertex2i(-boxW/4,boxH/4);
SetColor(3);
glVertex2i(0,-boxH/4);
SetColor(4);
glVertex2i(0,boxH/4);
SetColor(5);
glVertex2i(boxW/4,-boxH/4);
SetColor(6);
glVertex2i(boxW/4,boxH/4);
glEnd();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_TRIANGLE_STRIP);
glVertex2i(0,0);
glVertex2i(-100,100);
glEnd();
}
扇形连线三角形串图元的绘制函数。
//绘制扇形的连线三角形串
staticvoidTriangleFan(void)
{
GLintvx[8][2];
GLintx0,y0,x1,y1,x2,y2,x3,y3;
GLinti;
y0=-boxH/4;
y1=y0+boxH/2/3;
y2=y1+boxH/2/3;
y3=boxH/4;
x0=-boxW/4;
x1=x0+boxW/2/3;
x2=x1+boxW/2/3;
x3=boxW/4;
vx[0][0]=x0;vx[0][1]=y1;
vx[1][0]=x0;vx[1][1]=y2;
vx[2][0]=x1;vx[2][1]=y3;
vx[3][0]=x2;vx[3][1]=y3;
vx[4][0]=x3;vx[4][1]=y2;
vx[5][0]=x3;vx[5][1]=y1;
vx[6][0]=x2;vx[6][1]=y0;
vx[7][0]=x1;vx[7][1]=y0;
glBegin(GL_TRIANGLE_FAN);
SetColor(7);
glVertex2i(0,0);
for(i=0;i<8;i++;
{
SetColor(7-i);
glVertex2iv(vx[i]);
}
glEnd();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_TRIANGLE_FAN);
glVertex2i(0,0);
glVertex2i(-100,100);
glEnd();
}
矩形图元的绘制函数。
//绘制矩形
staticvoidRect(void)
{
(rgb)?
glColor3f(1.0,0.0,1.0):
glIndexi(5);
glRecti(-boxW/4,-boxH/4,boxW/4,boxH/4);
}
//绘制连线多边形
staticvoidPolygons(void)
{
GLintvx[8][2];
GLintx0,y0,x1,y1,x2,y2,x3,y3;
GLinti;
y0=-boxH/4;
y1=y0+boxH/2/3;
y2=y1+boxH/2/3;
y3=boxH/4;
x0=-boxW/4;
x1=x0+boxW/2/3;
x2=x1+boxW/2/3;
x3=boxW/4;
vx[0][0]=x0;vx[0][1]=y1;
vx[1][0]=x0;vx[1][1]=y2;
vx[2][0]=x1;vx[2][1]=y3;
vx[3][0]=x2;vx[3][1]=y3;
vx[4][0]=x3;vx[4][1]=y2;
vx[5][0]=x3;vx[5][1]=y1;
vx[6][0]=x2;vx[6][1]=y0;
vx[7][0]=x1;vx[7][1]=y0;
glBegin(GL_POLYGON);
for(i=0;i<8;i++){
SetColor(7-i);
glVertex2iv(vx[i]);
}
glEnd();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_POLYGON);
glVertex2i(0,0);
glVertex2i(100,100);
glEnd();
}
独立连线的四边形图元的绘制函数。
//绘制多个独立的连线四边形
staticvoidQuads(void)
{
glBegin(GL_QUADS);
SetColor
(1);
glVertex2i(-boxW/4,-boxH/4);
SetColor
(2);
glVertex2i(-boxW/8,-boxH/16);
SetColor(3);
glVertex2i(boxW/8,-boxH/16);
SetColor(4);
glVertex2i(boxW/4,-boxH/4);
SetColor(5);
glVertex2i(-boxW/4,boxH/4);
SetColor(6);
glVertex2i(-boxW/8,boxH/16);
SetColor(7);
glVertex2i(boxW/8,boxH/16);
SetColor(0);
glVertex2i(boxW/4,boxH/4);
glEnd();
(rgb)?
glColor3f(1.0,1.0,1.0):
glIndexi(7);
glBegin(GL_QUADS);
glVertex2i(0,0);
glVertex2i(100,100);
glVertex2i(-100,100);
glEnd();
}
连续连线四边形串图元的绘制函数。
//绘制连续的连线四边形串
staticvoidQuadStrip(void)
{
glBegin(GL_QUAD_STRIP);
SetColor
(1);
glVertex2i(-boxW/4,-boxH/4);
SetColor
(2);
glVertex2i(-boxW/4,boxH/4);
SetColor(3);
glVertex2i(0,-boxH/4);
SetColor(4);
glVertex2i(0,boxH/4);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形 程序设计 教材 示例 源代码