计算机图形学论文.docx

上传人:b****6 文档编号:8678062 上传时间:2023-02-01 格式:DOCX 页数:13 大小:46.21KB
下载 相关 举报
计算机图形学论文.docx_第1页
第1页 / 共13页
计算机图形学论文.docx_第2页
第2页 / 共13页
计算机图形学论文.docx_第3页
第3页 / 共13页
计算机图形学论文.docx_第4页
第4页 / 共13页
计算机图形学论文.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

计算机图形学论文.docx

《计算机图形学论文.docx》由会员分享,可在线阅读,更多相关《计算机图形学论文.docx(13页珍藏版)》请在冰豆网上搜索。

计算机图形学论文.docx

计算机图形学论文

 

计算机图形学论文

 

一、算法设计

在程序中镜头上下转(沿红色线),左右转(沿绿色线)以及左右倾(沿蓝色线),

还有前后左右上下平移。

要实现这些,原理非常简单,分四步:

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都会重新一些其它的参数,因此,这种方法有可能很不安全,而且会浪费一些运算时间。

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

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1