计算机图形学论文.docx
- 文档编号:8678062
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:13
- 大小:46.21KB
计算机图形学论文.docx
《计算机图形学论文.docx》由会员分享,可在线阅读,更多相关《计算机图形学论文.docx(13页珍藏版)》请在冰豆网上搜索。
计算机图形学论文
计算机图形学论文
一、算法设计
在程序中镜头上下转(沿红色线),左右转(沿绿色线)以及左右倾(沿蓝色线),
还有前后左右上下平移。
要实现这些,原理非常简单,分四步:
1.我们先需要声明一个矩阵;
2.变换的时候把矩阵加载到当前视口矩阵里;
3.调用opengl内置的坐标变换函数,然后取出矩阵;
4.用的时候,直接加载自定义的矩阵即可。
二、部分代码
#include"ramble.h"
#include
intw=640;
inth=480;
staticvoidresize(intwidth,intheight)
{
constfloatar=(float)width/(float)height;
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,ar,0.1,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
w=width;
h=height;
}
staticvoiddisplay(void)
{
constdoublet=glutGet(GLUT_ELAPSED_TIME)/1000.0;
constdoublea=t*90.0;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
Ramble();
glTranslated(0.0,0.0,-4.0);
glutSolidTeapot(1.0);
glutSwapBuffers();
}
staticvoidkey(unsignedcharkey,intx,inty)
{
switch(key)
{
case27:
exit(0);
break;
case'q':
case'Q':
RambleVK_Q();
break;
case'e':
case'E':
RambleVK_E();
break;
case'a':
case'A':
RambleVK_A();
break;
case'd':
case'D':
RambleVK_D();
break;
case'w':
case'W':
RambleVK_W();
break;
case's':
case'S':
RambleVK_S();
break;
case'r':
case'R':
RambleVK_R();
break;
case'f':
case'F':
RambleVK_F();
break;
}
glutPostRedisplay();
}
staticvoidspacialkey(intkey,intx,inty)
{
switch(key)
{
caseGLUT_KEY_LEFT:
RambleMoveLeft();
break;
caseGLUT_KEY_RIGHT:
RambleMoveRight();
break;
caseGLUT_KEY_UP:
RambleMoveForward();
break;
caseGLUT_KEY_DOWN:
RambleMoveBack();
break;
default:
break;
}
glutPostRedisplay();
}
voidMouse(intbutton,intstate,intx,inty)/*当鼠标按下或拿起时会回调该函数*/
{
if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)
{
RambleLButtonDown(x,y);
}
if(button==GLUT_LEFT_BUTTON&&state==GLUT_UP)
{
RambleLButtonUp(x,y);
}
}
voidOnMouseMove(intx,inty)/*当鼠标移动时会回调该函数*/
{
RambleMouseMove(x,y);
}
staticvoididle(void)
{
glutPostRedisplay();
}
constGLfloatlight_ambient[]={0.0f,0.0f,0.0f,1.0f};
constGLfloatlight_diffuse[]={1.0f,1.0f,1.0f,1.0f};
constGLfloatlight_specular[]={1.0f,1.0f,1.0f,1.0f};
constGLfloatlight_position[]={2.0f,5.0f,5.0f,0.0f};
constGLfloatmat_ambient[]={0.7f,0.7f,0.7f,1.0f};
constGLfloatmat_diffuse[]={0.8f,0.8f,0.8f,1.0f};
constGLfloatmat_specular[]={1.0f,1.0f,1.0f,1.0f};
constGLfloathigh_shininess[]={100.0f};
/*Programentrypoint*/
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitWindowSize(w,h);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("GLUTShapes");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutKeyboardFunc(key);
glutSpecialFunc(spacialkey);
glutMouseFunc(Mouse);
glutMotionFunc(OnMouseMove);/*设置各种消息处理函数*/
glutIdleFunc(idle);
RambleInitial();
RambleGetShape(&w,&h);
glClearColor(1,1,1,1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,high_shininess);
glutMainLoop();
returnEXIT_SUCCESS;
}
#include"ramble.h"
#include
#include
#include
#pragmacomment(lib,"OpenGL32.lib")
#pragmacomment(lib,"Glu32.lib")
#definePI3.14159265
#defineDEGtoRAD(angle)(angle*PI/180.0)
#defineNEAREST1.0f
#defineFAREST40.0f
#defineMAXSPEED100.0
#defineMINSPEED0.001f
#defineMAXSENSITIVITY45.0
#defineMINSENSITIVITY0.01
int*pwidth;//pointertoglobalvariable:
windowwidth
int*pheight;//pointertoglobalvariable:
widowheight
GLfloatmRamble[16];//Viewmodematrix
GLfloatmpstep=0.25;//movespeed
GLfloatanglepturn=DEGtoRAD(45.0);//turningsensitive(measuredinrad)
voidRambleInitial()
{
glGetFloatv(GL_MODELVIEW_MATRIX,mRamble);//Thisfunctionistogettheviewmatrix
}
//Getwindowsize
voidRambleGetShape(int*w,int*h)
{
pwidth=w;
pheight=h;
}
//whenpaint,putthisfunctionfirsttousetherambal
voidRamble()
{
glLoadMatrixf(mRamble);//loadviewmatrixtochangetheviewsight
}
voidRambleReset()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glGetFloatv(GL_MODELVIEW_MATRIX,mRamble);
}
voidRambleMouseMove(intx,inty)
{
}
voidRambleLButtonDown(intx,inty)
{
if(x<*pwidth/3)RambleTurnLeft();
if(x>*pwidth*2/3)RambleTurnRight();
if(y<*pheight/3)RambleTurnUp();
if(y>*pheight*2/3)RambleTurnDown();
}
voidRambleLButtonUp(intx,inty)
{
}
voidRambleSetSpeed(GLfloatmPStep)
{
if(mPStep>MINSPEED&&mPStep } voidRambleAddSpeed(GLfloatmPStep) { RambleSetSpeed(mPStep+mpstep); } voidRambleSetSensitivity(GLfloatanglePTurn) { if(anglePTurn>MINSENSITIVITY&&anglePTurn } voidRambleAddSensitivity(GLfloatanglePTurn) { RambleSetSensitivity(anglepturn+anglePTurn); } //Turningfunctions voidRambleTurnLeft(GLfloatangle) { glMatrixMode(GL_MODELVIEW);//toensurethatyouareoperatingviewmatrix glLoadMatrixf(mRamble);//loadourownmatrix glRotated(angle,0.0,-1.0,0.0);//turnleft glGetFloatv(GL_MODELVIEW_MATRIX,mRamble);//getoutourmatrixtosaveit. } voidRambleTurnRight(GLfloatangle) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glRotated(angle,0.0,1.0,0.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleTurnUp(GLfloatangle) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glRotated(angle,-1.0,0.0,0.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleTurnDown(GLfloatangle) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glRotated(angle,1.0,0.0,0.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleSlantLeft(GLfloatangle) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glRotated(angle,0.0,0.0,-1.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleSlantRight(GLfloatangle) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glRotated(angle,0.0,0.0,1.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } //Movingfunctions voidRambleMoveForward(GLfloatm) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glTranslated(0.0,0.0,m); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleMoveBack(GLfloatm) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glTranslated(0.0,0.0,-m); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleMoveLeft(GLfloatm) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glTranslated(m,0.0,0.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleMoveRight(GLfloatm) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glTranslated(-m,0.0,0.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleMoveUp(GLfloatm) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glTranslated(0.0,-m,0.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } voidRambleMoveDown(GLfloatm) { glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mRamble); glTranslated(0.0,m,0.0); glGetFloatv(GL_MODELVIEW_MATRIX,mRamble); } //forshortcall voidRambleTurnLeft() { RambleTurnLeft(anglepturn); } voidRambleTurnRight() { RambleTurnRight(anglepturn); } voidRambleTurnUp() { RambleTurnUp(anglepturn); } voidRambleTurnDown() { RambleTurnDown(anglepturn); } voidRambleSlantLeft() { RambleSlantLeft(anglepturn); } voidRambleSlantRight() { RambleSlantRight(anglepturn); } voidRambleMoveForward() { RambleMoveForward(mpstep); } voidRambleMoveBack() { RambleMoveBack(mpstep); } voidRambleMoveLeft() { RambleMoveLeft(mpstep); } voidRambleMoveRight() { RambleMoveRight(mpstep); } voidRambleMoveUp() { RambleMoveUp(mpstep); } voidRambleMoveDown() { RambleMoveDown(mpstep); } 三、运行结果: 运行程序后,使用w、s、a、d实现前后左右转动,q、e实现左右倾,方向键控制前后左右运动,r、f上下运动。 如果你离远点很远的话,视图投影会有些不正常,这和AutoDesk3DSMAX的渲染效果图里的漫游出现的情况有点类似,每次做视图变换的时候,OpenGL都会重新一些其它的参数,因此,这种方法有可能很不安全,而且会浪费一些运算时间。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 论文