图形学代码及截图马强.docx

上传人:b****0 文档编号:9786258 上传时间:2023-05-21 格式:DOCX 页数:23 大小:62.08KB
下载 相关 举报
图形学代码及截图马强.docx_第1页
第1页 / 共23页
图形学代码及截图马强.docx_第2页
第2页 / 共23页
图形学代码及截图马强.docx_第3页
第3页 / 共23页
图形学代码及截图马强.docx_第4页
第4页 / 共23页
图形学代码及截图马强.docx_第5页
第5页 / 共23页
图形学代码及截图马强.docx_第6页
第6页 / 共23页
图形学代码及截图马强.docx_第7页
第7页 / 共23页
图形学代码及截图马强.docx_第8页
第8页 / 共23页
图形学代码及截图马强.docx_第9页
第9页 / 共23页
图形学代码及截图马强.docx_第10页
第10页 / 共23页
图形学代码及截图马强.docx_第11页
第11页 / 共23页
图形学代码及截图马强.docx_第12页
第12页 / 共23页
图形学代码及截图马强.docx_第13页
第13页 / 共23页
图形学代码及截图马强.docx_第14页
第14页 / 共23页
图形学代码及截图马强.docx_第15页
第15页 / 共23页
图形学代码及截图马强.docx_第16页
第16页 / 共23页
图形学代码及截图马强.docx_第17页
第17页 / 共23页
图形学代码及截图马强.docx_第18页
第18页 / 共23页
图形学代码及截图马强.docx_第19页
第19页 / 共23页
图形学代码及截图马强.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

图形学代码及截图马强.docx

《图形学代码及截图马强.docx》由会员分享,可在线阅读,更多相关《图形学代码及截图马强.docx(23页珍藏版)》请在冰点文库上搜索。

图形学代码及截图马强.docx

图形学代码及截图马强

我自己写的代码,仅供参考,若有雷同不胜荣幸。

实验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数组,产生我们需要的黑白格,然后就是纹理坐标与图形坐标的关系。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2