基于OpenGL 的3D图形绘制.docx

上传人:b****3 文档编号:27009722 上传时间:2023-06-25 格式:DOCX 页数:29 大小:104.59KB
下载 相关 举报
基于OpenGL 的3D图形绘制.docx_第1页
第1页 / 共29页
基于OpenGL 的3D图形绘制.docx_第2页
第2页 / 共29页
基于OpenGL 的3D图形绘制.docx_第3页
第3页 / 共29页
基于OpenGL 的3D图形绘制.docx_第4页
第4页 / 共29页
基于OpenGL 的3D图形绘制.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

基于OpenGL 的3D图形绘制.docx

《基于OpenGL 的3D图形绘制.docx》由会员分享,可在线阅读,更多相关《基于OpenGL 的3D图形绘制.docx(29页珍藏版)》请在冰豆网上搜索。

基于OpenGL 的3D图形绘制.docx

基于OpenGL的3D图形绘制

实验二基于OpenGL的3D图形绘制

一、实验目的与要求

1.学习OpenGL图形格式、数学原理;

2.掌握OpenGL基本图元的绘制,熟悉曲线、曲面、二次几何体的绘制技术;

3.掌握OpenGL光照、材质、纹理的基本原理;

4.掌握基于Win32、VisualC++环境绘制3D图形绘制原理、过程与步骤。

二、实验仪器与设备

1.微型电子计算机80台

2.Windows2000以上版本操作系统80套

3.VisualC++6.0开发系统80套

4.OpenGL2.0以上函数库80套

三、实验内容与步骤

本实验主要做使用图形绘制系统,实现线条,矩形,圆,文本等基本图形的绘制,保存与打开功能。

实验步骤如下。

1.设计流程图

图1设计流程图

2.关键代码解析

2.1基于Win32Conslole

voidbackground(void)

{

glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色

}

voidmyDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写

glBegin(GL_TRIANGLES);//开始画三角形

glShadeModel(GL_SMOOTH);//设置为光滑明暗模式

glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色

glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标

glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色

glVertex2f(0.0,-1.0);//设置第二个顶点的坐标

glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色

glVertex2f(-0.5,1.0);//设置第三个顶点的坐标

glEnd();//三角形结束

glPointSize(5.0f);

glBegin(GL_POINTS);

glVertex2f(1.0f,-0.5f);

glEnd();

glLineWidth(3.0f);

glBegin(GL_LINES);

glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色

glVertex2f(0.3f,-1.0f);

glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色

glVertex2f(1.3f,-1.0f);

glEnd();

glBegin(GL_POLYGON);//画五边形

glColor3f(1.0,0.0,0.0);

glVertex2f(0.0f,0.0f);

glColor3f(0.0,1.0,0.0);

glVertex2f(1.0f,0.0f);

glColor3f(0.0,0.0,1.0);

glVertex2f(1.5f,1.0f);

glColor3f(1.0,1.0,0.0);

glVertex2f(0.5f,1.5f);

glColor3f(0.0,0.0,1.0);

glVertex2f(-0.5f,1.0f);

glEnd();//五边形结束

glFlush();//强制OpenGL函数运行

}

voidmyReshape(GLsizeiw,GLsizeih)

{

glViewport(0,0,w,h);//设置视口

glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION

glLoadIdentity();//将当前矩阵置换为单位阵

if(w<=h)

gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);

//定义二维正视投影矩阵

else

gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);

glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW

}

intmain(intargc,char**argv)

{

/*初始化*/

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(400,400);

glutInitWindowPosition(200,200);

/*创建窗口*/

glutCreateWindow("OpenGL_Win32Console-1071301211高磊");

/*绘制与显示*/

background();

glutReshapeFunc(myReshape);//注册当前窗口的形状变化回调函数

glutDisplayFunc(myDisplay);//注册当前窗口的显示回调函数

glutMainLoop();//进入GLUT事件处理循环

return(0);

}

2.2基于Win32API

intWINAPIWinMain(HINSTANCEhInstance,//实例

HINSTANCEhPrevInstance,//前一个实例

LPSTRlpCmdLine,//命令行参数

intnCmdShow)//窗口显示状态

{

MSGmsg;//Windowsx消息结构

BOOLdone=FALSE;//用来退出循环的Bool变量

//创建OpenGL窗口

if(!

CreateGLWindow("OpenGL_Win32C-1071301211高磊",640,480,16))

{

return0;//失败退出

}

while(!

done)//保持循环直到done=TRUE

{

if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))//有消息在等待吗?

{

if(msg.message==WM_QUIT)//收到退出消息?

{

done=TRUE;

}

else

{

TranslateMessage(&msg);//翻译消息

DispatchMessage(&msg);//发送消息

}

}

else//如果没有消息

{

//绘制场景。

监视ESC键和来自DrawGLScene()的退出消息

if(active)//程序激活的么?

{

if(keys[VK_ESCAPE])//ESC按下了么?

{

done=TRUE;//ESC发出退出信号

}

else//不是退出的时候,刷新屏幕

{

DrawGLScene();//绘制场景

SwapBuffers(hDC);//交换缓存(双缓存)

}

}

}

}

KillGLWindow();//销毁窗口

return(msg.wParam);

}

BOOLCreateGLWindow(char*title,intwidth,intheight,intbits)

{

GLuintPixelFormat;//保存查找匹配的结果

WNDCLASSwc;//窗口类结构

DWORDdwExStyle;//扩展窗口风格

DWORDdwStyle;//窗口风格

RECTWindowRect;//取得矩形的左上角和右下角的坐标值

WindowRect.left=(long)0;//将Left设为0

WindowRect.right=(long)width;//将Right设为要求的宽度

WindowRect.top=(long)0;//将Top设为0

WindowRect.bottom=(long)height;//将Bottom设为要求的高度

hInstance=GetModuleHandle(NULL);//取得我们窗口的实例

wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;//移动时重画,并为窗口取得DC

wc.lpfnWndProc=(WNDPROC)WndProc;//WndProc处理消息

wc.cbClsExtra=0;//无额外窗口数据

wc.cbWndExtra=0;//无额外窗口数据

wc.hInstance=hInstance;//设置实例

wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);//装入缺省图标

wc.hCursor=LoadCursor(NULL,IDC_ARROW);//装入鼠标指针

wc.hbrBackground=NULL;//GL不需要背景

wc.lpszMenuName=NULL;//不需要菜单

wc.lpszClassName="OpenGL";//设定类名字

if(!

RegisterClass(&wc))//尝试注册窗口类

{

MessageBox(NULL,"窗口类注册失败!

","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;//退出并返回FALSE

}

dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;//扩展窗体风格

dwStyle=WS_OVERLAPPEDWINDOW;//窗体风格

//调整窗口达到真正要求的大小

AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);

if(!

(hWnd=CreateWindowEx(dwExStyle,//扩展窗体风格

"OpenGL",//类名字

title,//窗口标题

dwStyle|//必须的窗体风格属性

WS_CLIPSIBLINGS|//必须的窗体风格属性

WS_CLIPCHILDREN,//选择的窗体属性

0,0,//窗口位置

WindowRect.right-WindowRect.left,//计算调整好的窗口宽度

WindowRect.bottom-WindowRect.top,//计算调整好的窗口高度

NULL,//无父窗口

NULL,//无菜单

hInstance,//实例

NULL)))//不向WM_CREATE传递任何东东

{

KillGLWindow();//重置显示区

MessageBox(NULL,"窗口创建失败!

","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;

}

staticPIXELFORMATDESCRIPTORpfd=//告诉窗口我们所希望的东东

{

sizeof(PIXELFORMATDESCRIPTOR),//格式描述符的大小

1,//版本号

PFD_DRAW_TO_WINDOW|//格式必须支持窗口

PFD_SUPPORT_OPENGL|//格式必须支持OpenGL

PFD_DOUBLEBUFFER,//必须支持双缓冲

PFD_TYPE_RGBA,//申请RGBA格式

bits,//选定色彩深度

0,0,0,0,0,0,//忽略的色彩位

0,//无Alpha缓存

0,//忽略ShiftBit

0,//无聚集缓存

0,0,0,0,//忽略聚集位

16,//16位Z-缓存(深度缓存)

0,//无模板缓存

0,//无辅助缓存

PFD_MAIN_PLANE,//主绘图层

0,//保留

0,0,0//忽略层遮罩

};

if(!

(hDC=GetDC(hWnd)))//取得设备描述表了么?

{

KillGLWindow();//重置显示区

MessageBox(NULL,"创建GLDC失败!

","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;

}

if(!

(PixelFormat=ChoosePixelFormat(hDC,&pfd)))

{

KillGLWindow();//重置显示区

MessageBox(NULL,"找不到象素格式!

","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;

}

if(!

SetPixelFormat(hDC,PixelFormat,&pfd))

{

KillGLWindow();//重置显示区

MessageBox(NULL,"不能设置象素格式!

","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;

}

if(!

(hRC=wglCreateContext(hDC)))//能否取得着色描述表?

{

KillGLWindow();//重置显示区

MessageBox(NULL,"Can'tCreateAGLRenderingContext.","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;

}

if(!

wglMakeCurrent(hDC,hRC))//尝试激活着色描述表

{

KillGLWindow();//重置显示区

MessageBox(NULL,"创建GLRC失败!

","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;

}

ShowWindow(hWnd,SW_SHOW);//显示窗口

SetForegroundWindow(hWnd);//略略提高优先级

SetFocus(hWnd);//设置键盘的焦点至此窗口

ReSizeGLScene(width,height);//设置透视GL屏幕

if(!

InitGL())//初始化新建的GL窗口

{

KillGLWindow();//重置显示区

MessageBox(NULL,"初始化失败!

","错误",MB_OK|MB_ICONEXCLAMATION);

returnFALSE;

}

returnTRUE;

}

LRESULTCALLBACKWndProc(HWNDhWnd,//窗口的句柄

UINTuMsg,//窗口的消息

WPARAMwParam,//附加的消息内容

LPARAMlParam)//附加的消息内容

{

switch(uMsg)//检查Windows消息

{

caseWM_ACTIVATE:

//监视窗口激活消息

{

if(!

HIWORD(wParam))//检查最小化状态

active=TRUE;//程序处于激活状态

else

active=FALSE;//程序不再激活

return0;//返回消息循环

}

caseWM_SYSCOMMAND:

//中断系统命令

{

switch(wParam)//检查系统调用

{

caseSC_SCREENSAVE:

//屏保要运行?

caseSC_MONITORPOWER:

//显示器要进入节电模式?

return0;//阻止发生

}

break;//退出

}

caseWM_CLOSE:

//收到Close消息?

{

PostQuitMessage(0);//发出退出消息

return0;

}

caseWM_KEYDOWN:

//有键按下么?

{

keys[wParam]=TRUE;//如果是,设为TRUE

return0;//返回

}

caseWM_KEYUP:

//有键放开么?

{

keys[wParam]=FALSE;//如果是,设为FALSE

return0;//返回

}

caseWM_SIZE:

//调整OpenGL窗口大小

{

ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));

return0;//返回

}

}

//向DefWindowProc传递所有未处理的消息。

returnDefWindowProc(hWnd,uMsg,wParam,lParam);

}

GLvoidKillGLWindow(GLvoid)

{

if(hRC)//拥有着色描述表吗?

{

if(!

wglMakeCurrent(NULL,NULL))//能否释放DC和RC描述表?

{

MessageBox(NULL,"释放DC、RC失败!

","关闭失败",MB_OK|MB_ICONINFORMATION);

}

if(!

wglDeleteContext(hRC))//能否删除RC?

{

MessageBox(NULL,"释放RC失败!

","关闭失败",MB_OK|MB_ICONINFORMATION);

}

hRC=NULL;//将RC设为NULL

}

if(hDC&&!

ReleaseDC(hWnd,hDC))//能否释放DC?

{

MessageBox(NULL,"释放DC失败!

",

"关闭失败",MB_OK|MB_ICONINFORMATION);

hDC=NULL;//将DC设为NULL

}

if(hWnd&&!

DestroyWindow(hWnd))//能否销毁窗口?

{

MessageBox(NULL,"销毁窗口失败!

","关闭失败",

MB_OK|MB_ICONINFORMATION);

hWnd=NULL;//将hWnd设为NULL

}

if(!

UnregisterClass("OpenGL",hInstance))//能否注销类?

{

MessageBox(NULL,"不能注销类!

",

"关闭失败",MB_OK|MB_ICONINFORMATION);

hInstance=NULL;//将hInstance设为NULL

}

}

intInitGL(GLvoid)

{

glShadeModel(GL_SMOOTH);//启用阴影平滑

glClearColor(255.0f,255.0f,255.0f,0.5f);//黑色背景

glClearDepth(1.0f);//设置深度缓存

glEnable(GL_DEPTH_TEST);//启用深度测试

glDepthFunc(GL_LEQUAL);//所作深度测试的类型

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精细的透视修正

returnTRUE;//初始化OK

}

GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)//重置并初始化GL窗口大小

{

if(height==0)//防止被零除

{

height=1;//将Height设为1

}

glViewport(0,0,width,height);//重置当前的视口

glMatrixMode(GL_PROJECTION);//选择投影矩阵

glLoadIdentity();//重置投影矩阵

//计算窗口的外观比例

gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵

glLoadIdentity();//重置模型观察矩阵

}

intDrawGLScene(GLvoid)

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除屏幕及深度缓存

glLoadIdentity();//重置视口

glTranslatef(-1.5f,1.0f,-6.0f);//左移1.5单位,上移1.0,并移入屏幕6.0

glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色

glBegin(GL_TRIANGLES);//绘制三角形

glVertex3f(0.0f,1.0f,0.0f);//上顶点

glVertex3f(-1.0f,-1.0f,0.0f);//左下

glVertex3f(1.0f,-1.0f,0.0f);//右下

glEnd();//三角形绘制结束

glTranslatef(3.0f,0.0f,0.0f);//右移3单位

glColor3f(0.0,0.0,1.0);

glBegin(GL_QUADS);//绘制矩形

glVertex3f(-1.0f,1.0f,0.0f);//左上

glVertex3f(1.5f,1.0f,0.0f);//右上

glVertex3f(1.5f,-1.0f,0.0f);//右下

glVertex3f(-1.0f,-1.0f,0.0f);//左下

glEnd();//矩形绘制结束

glTranslatef(-2.0f,-2.5f,2.0f);

glRotated(yAngle,0.0f,1.0f,0.0f

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

当前位置:首页 > 经管营销 > 经济市场

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

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