图形学代码及截图马强.docx
- 文档编号:9786258
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:23
- 大小:62.08KB
图形学代码及截图马强.docx
《图形学代码及截图马强.docx》由会员分享,可在线阅读,更多相关《图形学代码及截图马强.docx(23页珍藏版)》请在冰点文库上搜索。
图形学代码及截图马强
我自己写的代码,仅供参考,若有雷同不胜荣幸。
。
。
。
。
。
实验2:
代码:
#include
#include
GLdoubleangle=10.0;
voiddisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glBegin(GL_POLYGON);
glVertex2d(-0.5,-0.5);
glVertex2d(-0.5,0.5);
glVertex2d(0.5,0.5);
glVertex2d(0.5,-0.5);
glEnd();
glFlush();
}
voidmouseFunc(intbutton,intstate,intx,inty)
{
//旋转
if(state==GLUT_DOWN&&button==GLUT_LEFT_BUTTON)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if(angle<360)
angle+=10;
else
angle-=360;
glRotatef(angle,1,1,2);
glutPostRedisplay();
}
}
voidkeyboard(unsignedcharkey,intx,inty)
{
if(key==27)
{
exit(-1);
}
}
voidinit()
{
glClearColor(0.0,0.0,0.0,0.0);
glColor3f(1.0,0.0,0.0);
}
voidreshape(intw,inth)
{
glViewport(0,0,w,h);
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("OpenGL中的建模与变换");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMouseFunc(mouseFunc);
glutMainLoop();
return0;
}
截图:
点击旋转:
体会:
主要是我们在进行变换的时候,要注意glMatrixMode的设置,在进行投影变换的时候要设置为GL_PROJECTION,而当图形变换的时候要设置为GL_MODELVIEW模式。
实验3:
代码:
#include
#include
voiddisplay()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glEnable(GL_LIGHT0);
glDisable(GL_LIGHT1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-0.5,0,0);
glutSolidSphere(0.3,20,22);
glLoadIdentity();
glDisable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glTranslatef(0.5,0,0);
glutSolidSphere(0.3,20,22);
glutSwapBuffers();
}
voidkeyboard(unsignedcharkey,intx,inty)
{
if(key==27)
{
exit(-1);
}
}
voidinit()
{
glClearColor(0.0,0.0,0.0,0.0);
GLfloatposition0[4]={-10,10,-10,1};
GLfloatambient0[4]={1,0,0,1};
glLightfv(GL_LIGHT0,GL_POSITION,position0);
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient0);
GLfloatposition1[4]={10,10,-10,1};
GLfloatambient1[4]={0,1,0,1};
glLightfv(GL_LIGHT1,GL_POSITION,position1);
glLightfv(GL_LIGHT1,GL_AMBIENT,ambient1);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
voidreshape(intw,inth)
{
glViewport(0,0,w,h);
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("OpenGL中的光照");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return0;
}
截图:
体会:
不知道为什么,右边的球体好像没有左边的光线效果,这点查询了很久还是不明白。
实验4:
#include
#include
#include
usingnamespacestd;
GLintselect=0;
voiddrawObjects(GLenummode)
{
if(mode==GL_SELECT)//绘制红色的小球
glPushName
(1);
if(select==1)//判断选中的是什么颜色的球,然后采用什么颜色红球还是白色的球
glColor3f(1,1,1);
else
glColor3f(1,0,0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(-0.5,0,0);
glutSolidSphere(0.3,20,22);
glPopName();
glLoadIdentity();
if(mode==GL_SELECT)//绘制绿色的小球
glPushName
(2);
if(select==2)//判断选中的是什么颜色的球,然后采用什么颜色绘制
glColor3f(1,1,1);
else
glColor3f(0,1,0);
glTranslatef(0.5,0,0);
glutSolidSphere(0.3,20,22);
glPopName();
select=0;//显示完后将select设置为0
}
voiddisplay()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
drawObjects(GL_RENDER);
glutSwapBuffers();
}
voidkeyboard(unsignedcharkey,intx,inty)
{
if(key==27)
{
exit(-1);
}
}
voidinit()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glClearColor(0.0,0.0,0.0,0.0);
}
voidreshape(intw,inth)
{
glViewport(0,0,w,h);
}
voiddraw(GLinthits,GLuintbuffer[])//这个是操作堆栈,判断点击的是什么颜色的球
{
unsignedinti,j;
GLuintname,*ptr;
if(hits==0)
cout<<"未点击任何球体!
"< else { ptr=buffer; for(i=0;i { name=*ptr; ptr+=3; if(*ptr==1) { cout<<"红色球被点击! "< select=1; } else { cout<<"绿色球被点击"< select=2; } ptr++; } } drawObjects(GL_RENDER);//点击完后设置球的颜色,重绘 } #defineSIZE512 voidpickRects(intbutton,intstate,intx,inty) { GLuintselectBuf[SIZE]; GLinthits,viewport[4]; if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN) { glGetIntegerv(GL_VIEWPORT,viewport); glSelectBuffer(SIZE,selectBuf); glRenderMode(GL_SELECT); glInitNames(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPickMatrix((GLdouble)x,(GLdouble)(viewport[3]-y),3.0,3.0,viewport); drawObjects(GL_SELECT);//设置为选择模式 glMatrixMode(GL_PROJECTION); glPopMatrix(); glFlush();//绘制结束 hits=glRenderMode(GL_RENDER); draw(hits,selectBuf); } } intmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(100,100); glutCreateWindow("OpenGL中的拾取"); init(); glutDisplayFunc(display); glutMouseFunc(pickRects); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return0; } 截图: 初次显示 点击红球,然后点击绿球,或是点击黑色部分 命令行显示我们的操作 体会: 这个拾取过程我们控制select用来显示两个的球的显示颜色,特别注意显示完之后要将其select=0;同时在对堆栈进行操作的时候要特别注意,不然就溢出啦。 。 。 实验5: 代码: #include #include #defineImageWidth64 #defineImageHeight64 staticGLubyteImage[ImageHeight][ImageWidth][3]; staticGLuinttexName; voidmakeImage() { inti,j,c; for(i=0;i { for(j=0;j { if(i%16<8) { if(j%16<8) { c=225; } else c=0; } else { if(j%16<8) { c=0; } else c=225; } Image[i][j][0]=(GLubyte)c; Image[i][j][1]=(GLubyte)c; Image[i][j][2]=(GLubyte)c; } } } voiddisplay() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1.0,1.0,1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(-0.5,0,0); glBegin(GL_QUADS);//绘制四边形 //定义两个带纹理的平面: //指定纹理坐标和几何坐标,每个纹理 //坐标与其后的几何坐标对应 glTexCoord2d(0,0); glVertex2d(-0.4,-0.4); glTexCoord2d(1,0); glVertex2d(-0.4,0.4); glTexCoord2d(1,1); glVertex2d(0.4,0.4); glTexCoord2d(0,1); glVertex2d(0.4,-0.4); glEnd(); glLoadIdentity(); glTranslated(0.5,0,0); glBegin(GL_QUADS); glTexCoord2d(0,0); glVertex2d(0.4,-0.4); glTexCoord2d(1,0); glVertex2d(0.4,0.4); glTexCoord2d(1,1); glVertex2d(-0.4,0.4); glTexCoord2d(0,1); glVertex2d(-0.4,-0.4); glEnd(); glFlush(); } //相应ESC按键 voidkeyboard(unsignedcharkey,intx,inty) { if(key==27) { exit(-1); } } //纹理映射 voidinit() { glClearColor(0.0,0.0,0.0,0.0); glEnable(GL_DEPTH_TEST); makeImage(); glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexImage2D(GL_TEXTURE_2D,0,3,ImageWidth,ImageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,Image); //控制映射方式 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); //说明纹理颜色的作用方式,这里采用//粘贴(DECAL)方式,即以纹理颜 //色作为最后颜色 glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); //激活纹理,使其作用于其后绘制的纹理 glEnable(GL_TEXTURE_2D); glShadeModel(GL_FLAT); } voidreshape(intw,inth) { glViewport(0,0,w,h); } intmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500,500); glutInitWindowPosition(100,100); glutCreateWindow("OpenGL中的纹理映射"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return0; } 截图: 体会: 纹理映射首先是要填充Image数组,产生我们需要的黑白格,然后就是纹理坐标与图形坐标的关系。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 代码 截图