图形学代码及截图Word文档下载推荐.docx
《图形学代码及截图Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《图形学代码及截图Word文档下载推荐.docx(21页珍藏版)》请在冰点文库上搜索。
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:
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glEnable(GL_LIGHT0);
glDisable(GL_LIGHT1);
glLoadIdentity();
glTranslatef(-0.5,0,0);
glutSolidSphere(0.3,20,22);
glDisable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glTranslatef(0.5,0,0);
glutSwapBuffers();
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);
OpenGL中的光照"
不知道为什么,右边的球体好像没有左边的光线效果,这点查询了很久还是不明白。
实验4:
iostream>
usingnamespacestd;
GLintselect=0;
voiddrawObjects(GLenummode)
if(mode==GL_SELECT)//绘制红色的小球
glPushName
(1);
if(select==1)//判断选中的是什么颜色的球,然后采用什么颜色红球还是白色的球
glColor3f(1,1,1);
else
glColor3f(1,0,0);
glPopName();
if(mode==GL_SELECT)//绘制绿色的小球
glPushName
(2);
if(select==2)//判断选中的是什么颜色的球,然后采用什么颜色绘制
glColor3f(0,1,0);
select=0;
//显示完后将select设置为0
drawObjects(GL_RENDER);
voiddraw(GLinthits,GLuintbuffer[])//这个是操作堆栈,判断点击的是什么颜色的球
unsignedinti,j;
GLuintname,*ptr;
if(hits==0)
cout<
<
"
未点击任何球体!
endl;
ptr=buffer;
for(i=0;
i<
hits;
i++)
{
name=*ptr;
ptr+=3;
if(*ptr==1)
{
cout<
红色球被点击!
select=1;
}
else
绿色球被点击"
select=2;
ptr++;
}
//点击完后设置球的颜色,重绘
#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();
gluPickMatrix((GLdouble)x,(GLdouble)(viewport[3]-y),3.0,3.0,viewport);
drawObjects(GL_SELECT);
//设置为选择模式
glPopMatrix();
glFlush();
//绘制结束
hits=glRenderMode(GL_RENDER);
draw(hits,selectBuf);
OpenGL中的拾取"
glutMouseFunc(pickRects);
初次显示
点击红球,然后点击绿球,或是点击黑色部分
命令行显示我们的操作
这个拾取过程我们控制select用来显示两个的球的显示颜色,特别注意显示完之后要将其select=0;
同时在对堆栈进行操作的时候要特别注意,不然就溢出啦。
。
实验5:
#defineImageWidth64
#defineImageHeight64
staticGLubyteImage[ImageHeight][ImageWidth][3];
staticGLuinttexName;
voidmakeImage()
inti,j,c;
for(i=0;
ImageWidth;
for(j=0;
j<
ImageHeight;
j++)
if(i%16<
8)
if(j%16<
{
c=225;
}
else
c=0;
Image[i][j][0]=(GLubyte)c;
Image[i][j][1]=(GLubyte)c;
Image[i][j][2]=(GLubyte)c;
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);
glTranslated(0.5,0,0);
//相应ESC按键
//纹理映射
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);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
OpenGL中的纹理映射"
纹理映射首先是要填充Image数组,产生我们需要的黑白格,然后就是纹理坐标与图形坐标的关系。