图形学代码及截图马强.docx
《图形学代码及截图马强.docx》由会员分享,可在线阅读,更多相关《图形学代码及截图马强.docx(23页珍藏版)》请在冰点文库上搜索。
![图形学代码及截图马强.docx](https://file1.bingdoc.com/fileroot1/2023-5/21/ce2ba09c-f49b-40dd-8971-bca7add7ec8d/ce2ba09c-f49b-40dd-8971-bca7add7ec8d1.gif)
图形学代码及截图马强
我自己写的代码,仅供参考,若有雷同不胜荣幸。
。
。
。
。
。
实验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数组,产生我们需要的黑白格,然后就是纹理坐标与图形坐标的关系。