opengl源文件plane作业Word格式文档下载.docx
- 文档编号:21319231
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:12
- 大小:17.58KB
opengl源文件plane作业Word格式文档下载.docx
《opengl源文件plane作业Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《opengl源文件plane作业Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
GLintm_state=0,space=1;
//mouseusageandthespacekey
GLfloatx_angle=12.0f,y_angle=8.0f,t_angle=0.0f;
//angleofeye
GLdoubledist=30;
//distancefromtheeye
GLuinti_pick=0;
//forpicking
GLdoubler=45000;
GLuinttexPhoto=0;
//phototexture
intsizeX,sizeY;
//photosize;
externvoidDrawBitmapString(LPCSTRstr);
externvoidDrawOutlineString(LPCSTRstr);
externSIZEGetStringSize(LPCSTRstr);
externvoidReadDEM(char*);
//readDEM
GLdoublenearclip;
GLdoublefarclip;
GLdoublesteps;
constGLdoublestepa=0.2;
GLdoublerx,rz;
floatxOrg,yOrg;
floatangle;
floatdx,dy;
intnx,ny;
float*pHight=NULL;
GLuinttexture=0;
voidinit(void)//初始化
{
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
if(loadModelData("
Aereo.ms3d"
)==0)//LoadsTheModelAndChecksForErrors
return;
loadTextures();
//LoadsModelTextures
load_oro();
load_photo();
}
voidload_photo(void)
{
AUX_RGBImageRec*pImage;
//Maketexture
pImage=auxDIBImageLoad("
photo.bmp"
);
sizeX=pImage->
sizeX;
sizeY=pImage->
sizeY;
glGenTextures(1,&
texPhoto);
glBindTexture(GL_TEXTURE_2D,texPhoto);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,pImage->
sizeX,pImage->
sizeY,GL_RGB,GL_UNSIGNED_BYTE,pImage->
data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
free(pImage->
free(pImage);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
voidload_oro(void)
//LoadDEM
ReadDEM("
terrain.dem"
rx=(nx-1)*dx;
//地形图的x长度
rz=(ny-1)*dy;
//地形图的z长度
nearclip=0.1*(rx+rz);
farclip=200*nearclip;
steps=dx+dy;
//每一步dist大小
dist=(rx+rz)*20/12;
terrain.bmp"
glGenTextures(1,&
texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexImage2D(GL_TEXTURE_2D,0,3,pImage->
sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,pImage->
voidCALLBACKAnimateFunc(void)//运动的图形,按下space静止
if(space==1)
{
t_angle=t_angle-5.0f;
if(t_angle<
=-360)
t_angle=360+t_angle;
display();
}
elsereturn;
voidCALLBACKreshape(GLsizeiw,GLsizeih)//调整窗口
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(h<
1)h=1;
gluPerspective(30.0,1.0*w/h,nearclip,farclip);
//实景深度400
glMatrixMode(GL_MODELVIEW);
voidCALLBACKOn0KeyDown(void){m_state=0;
voidCALLBACKOn1KeyDown(void){m_state=1;
voidCALLBACKOnSpaceDown(void){space=-space;
voidCALLBACKOnLButtonMove(AUX_EVENTREC*event)//鼠标移动视野
GLintdx,dy;
dx=event->
data[AUX_MOUSEX]-mx;
dy=event->
data[AUX_MOUSEY]-my;
mx=event->
data[AUX_MOUSEX];
my=event->
data[AUX_MOUSEY];
if(m_state==0)
y_angle+=dx*0.1f;
x_angle+=dy*0.1f;
elseif(m_state==1)
dist+=(dx+dy)*steps;
voidCALLBACKOnLButtonDown(AUX_EVENTREC*event)
pickObjects();
#defineBUFSIZE600
voidpickObjects(void)//用于实现picking,重新画出图形所处的位置
doublei;
GLuintselectBuf[BUFSIZE];
GLinthits;
GLintviewport[4];
glGetIntegerv(GL_VIEWPORT,viewport);
glSelectBuffer(BUFSIZE,selectBuf);
glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glPushMatrix();
glLoadIdentity();
gluPickMatrix((GLdouble)mx,(GLdouble)(viewport[3]-my),30,30,viewport);
gluPerspective(30.0,1.0*viewport[2]/viewport[3],nearclip,farclip);
//视景大小
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslated(-rx*2/3,0,-0.5*dist);
glRotatef(x_angle,1.0f,0.0f,0.0f);
glRotatef(y_angle,0.0f,1.0f,0.0f);
glPushMatrix();
glTranslated(rx*2/3,15000.0f,rz*1/2);
//画图点击的位置
glRotatef(t_angle,0.0f,1.0f,0.0f);
for(i=0;
i<
8;
i++)//飞机个数(8)
{
glPushName((GLuint)i);
glPushMatrix();
glTranslated(r*cos(i*pi/4),0.5,-(r*sin(i*pi/4)));
glRotated(i*45,0.0,1.0,0.0);
glScalef(500,500,500);
drawModel(0);
//theplaceofthemodel!
glPopMatrix();
glPopName();
}
glPopMatrix();
glPopMatrix();
glFlush();
hits=glRenderMode(GL_RENDER);
processHits(hits,selectBuf);
//纪录点击成功
glPopMatrix();
voidprocessHits(GLinthits,GLuintbuffer[])//纪录点击是否成功
GLuinti,minz;
if(hits<
1)return;
pick=1;
for(i=0;
(GLuint)hits;
i++)//foreachhit
if(i==0||minz>
buffer[i*5+1])
{
minz=buffer[i*5+1];
i_pick=buffer[i*5+4];
}
voidCALLBACKdisplay(void)//实现图形的显现
intk,j;
glClearColor(0.0f,0.2941176470588235f,0.4156862745098039f,0.0f);
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
gluPerspective(30.0,1.0*1200/688,nearclip,farclip);
glTranslated(-rx*2/3,0,-0.5*dist);
glRotatef(x_angle,1.0f,0.0f,0.0f);
glRotatef(y_angle,0.0f,1.0f,0.0f);
drawCoordinates();
glTranslated(rx*2/3,15000.0f,rz*1/2);
//画图的位置
glRotatef(t_angle,0.0f,1.0f,0.0f);
i++)//画出选择图形
{
glTranslated(r*cos(i*pi/4),0.5,-(r*sin(i*pi/4)));
//飞机的个数
glRotated(i*45,0.0,1.0,0.0);
if(i==i_pick&
&
pick==1)
glRotatef(-45,0.0,0.0,1.0);
//旋转飞机
glScalef(500,500,500);
//放大飞机
drawModel
(1);
glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D,texture);
glEnable(GL_TEXTURE_2D);
for(j=0;
j<
ny-1;
j++)
glBegin(GL_QUAD_STRIP);
for(k=0;
k<
nx;
k++)
{
glTexCoord2f(k*1.0f/(nx-1),j*1.0f/(ny-1));
glVertex3f(k*dx,pHight[j*nx+k],j*dy);
glTexCoord2f(k*1.0f/(nx-1),(j+1)*1.0f/(ny-1));
glVertex3f(k*dx,pHight[(j+1)*nx+k],(j+1)*dy);
}
glEnd();
glFlush();
draw_photo();
auxSwapBuffers();
voiddraw_photo()
GLintrect[4];
LPSTRpText="
******"
;
//yourname
SIZEsize;
glGetIntegerv(GL_VIEWPORT,rect);
glEnable(GL_TEXTURE_2D);
gluOrtho2D(0,rect[2],0,rect[3]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,0.0f);
glVertex2f(0.8f*rect[2],0.0f);
glTexCoord2f(1.0f,0.0f);
glVertex2f(1.0f*rect[2],0.0f);
glTexCoord2f(1.0f,1.0f);
glVertex2f(1.0f*rect[2],0.2f*rect[2]*sizeY/sizeX);
glTexCoord2f(0.0f,1.0f);
glVertex2f(0.8f*rect[2],0.2f*rect[2]*sizeY/sizeX);
glEnd();
glDisable(GL_TEXTURE_2D);
size=GetStringSize(pText);
glColor3f(1.0f,1.0f,0.0f);
glRasterPos2f(0.9f*rect[2]-size.cx/2,0.2f*rect[2]*sizeY/sizeX+5);
DrawBitmapString(pText);
voiddrawCoordinates(void)//画坐标轴
glColor3f(1.0f,0.0f,0.0f);
//画红色的x轴
glBegin(GL_LINES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(50000.0f,0.0f,0.0f);
glColor3f(0.0,1.0,0.0);
//画绿色的y轴
glVertex3f(0.0f,50000.0f,0.0f);
glColor3f(0.0,0.0,1.0);
//画蓝色的z轴
glVertex3f(0.0f,0.0f,50000.0f);
voidmain(void)
auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA|AUX_DEPTH24);
auxInitPosition(0,0,1266,668);
auxInitWindow("
my_program"
init();
printf("
按0可以转换视角\n"
按1可以拉近距离\n"
按space可以暂停\n"
auxIdleFunc(AnimateFunc);
auxReshapeFunc(reshape);
auxKeyFunc(AUX_0,On0KeyDown);
auxKeyFunc(AUX_1,On1KeyDown);
auxKeyFunc(AUX_SPACE,OnSpaceDown);
auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,OnLButtonDown);
auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSELOC,OnLButtonMove);
auxMainLoop(display);
freeModel();
free(pHight);
if(glIsTexture(texture))glDeleteTextures(1,&
if(glIsTexture(texPhoto))glDeleteTextures(1,&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- opengl 源文件 plane 作业