计算机系统综合课程设计
简单的OpenGL动画
设计报告
学生陈鲁蔡滨
班级成教02计算机本科
指导陆卫忠
时间2005年12月23日
苏州科技学院成教02计算机科学与技术
总任务
课题名称
使用OpenGL技术,制作一个彩色旋转立方体.
制作单位
苏州科技学院成教02计算机科学与技术
完成地点
电子系学生机房
完成时间
2006年1月6日
用户需求分析
1.背景
a.使用OpenGL制作彩色旋转立方体
b.05年第一学期末实验周课程设计
c.电子系学生机房完成该课程设计
1.1参考资料
VisualC++CAD应用程序开发技术《王清辉王彪编着》机械工业出版社
VisualC++实践与提高图形图像编程篇《李于剑编着》中国铁道出版社
2.任务概述
2.1目标
利用OpenGL的动画功能,实现运动彩色立方体的旋转.效果如图所示.
2.2使用特点
程序编译成功后生成EXE文件,可以观看到利用OpenGL的函数实现动画功能,使彩色立方体旋转.
3需求规定
3.1对技术的需求
OpenGL技术:OpenGL(OpenGraphicsLibrary)是一个优秀的三维图形硬件接口,实际上是一个维图形和模型库.使用OpenGL可以绘制出真实感很强的三维图形,且由于越来越多的高档加速卡支持OpenGL,所以使用OpenGL绘图可以获得很快的执行速度.OpenGL是一个与硬件无关的图形编程接口,可以在不同的硬件平台上实现.OpenGL最初目的是将用户从具体的硬件环境的操作系统中解放出来,而可以完全不到理解这些系统的结构和指令系统.
OpenGL本身不提供高级的造型命令,而是通过基本的几何图元---点,线和多边形来建立几何模型.用户则是通过这些基本图元来建立高级的几何模型.OpenGL可以提供的功能主要包括:
图形绘制.
充换操作
颜色模式
光照
图像效果增强
位图和图像
纹理映射
交互与动画
4运行环境规定
4.1设备
硬件:CPUP3533内存128M显示卡:支持OpenGL硬盘空间:20G
软件:Win98/Winme/WinNT/Win2000/WinXP/Win2003VisualC++编程工具
详细设计说明书
1引言
1.1编写目的
本系统可以提供一个彩色旋转立方体,使用户直接就可以看到一个使用OpenGL技术而旋转的彩色立方体.
1.2背景
a.使用OpenGL制作彩色旋转立方体
b.05年第一学期末实验周课程设计
c.电子系学生机房完成该课程设计
1.3定义
OpenGL(OpenGraphicsLibrary)是一个三维图形硬件接口,实际上是一个三维图形和模型库.
1.4参考资料
VisualC++CAD应用程序开发技术《王清辉王彪编着》机械工业出版社
VisualC++实践与提高图形图像编程篇《李于剑编着》中国铁道出版社
2总体设计
2.1需求规定
为用户提供一个可以旋转的彩色立方体.
2.2运行环境
硬件:CPUP3533内存128M显示卡:支持OpenGL硬盘空间:20G
软件:Win98/Winme/WinNT/Win2000/WinXP/Win2003VisualC++编程工具2.3设计概念
OpenGL支持双缓存技术.使用双缓存可以实现平滑的图形动画效果.在双缓存模式下,帧存被分为两个视频缓存:前台视频和后台视频.当绘制函数调用结束,并完成了后台视频缓的内容时,OpenGL便将它拷贝到前台视频缓存.由于这个视频交换的时间极短,肉眼感觉不出来,因此可以实现平滑的图形动画效果.
2.4结构
CGLView的结构
CGLView的消息处理
2.5尚未问决的问题
在本系统中,该立方体的绕XYZ轴旋转的时间还没有具体的程序来确定.
3接口设计
3.1用户接口
向用户提供一个.exe文件,用户直接运行该文件就可以得到一个彩色旋转立方体.
4运行设计
4.1运行控制
直接运行
4.2运行时间
由于程序占用资源很少,运行时间快,点击后即可看见图形效果.
5系统出错处理设计
由于该系统简单可靠,出错后关闭再重新运行就可以再次得到该立方体.
主要源代码
DialogGLDlg.h
classCDialogGLDlg:publicCDialog
{
//Construction
public:
voidOnabout(),
voidBuildList(),
CDialogGLDlg(CWnd*pParent等于NULL),//standardconstructor
BOOLSetWindowPixelFormat(HDChDC),
BOOLCreateViewGLContext(HDChDC),
voidRenderScene(),
voidRotate(),
BOOLm_Rotate,
HGLRCm_hGLContext,
intm_GLPixelIndex,
doublem_transY,
doublem_transX,
doublem_angle1,
doublem_angle2,
floatm_ScaleX,
floatm_ScaleY,
floatm_ScaleZ,
GLdoublem_xRotate,
GLdoublem_yRotate,
intm_width,
intm_height,
intm_exp,
floatm_size,
CPointm_RightDownPos,
CPointm_LeftDownPos,
BOOLm_RightButtonDown,
BOOLm_LeftButtonDown,
//DialogData
//{{AFX_DATA(CDialogGLDlg)
enum{IDD等于IDD_DIALOGGL_DIALOG},
//NOTE:theClassWizardwilladddatamembershere
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CDialogGLDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX),//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
afx_msoidOnContextMenu(CWnd*,CPointpoint),
HICONm_hIcon,
//Generatedmessagemapfunctions
//{{AFX_MSG(CDialogGLDlg)
virtualBOOLOnInitDialog(),
afx_msoidOnSysCommand(UINTnID,LPARAMlParam),
afx_msoidOnPaint(),
afx_msgHCURSOROnQueryDragIcon(),
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct),
afx_msoidOnDestroy(),
afx_msoidOnSize(UINTnType,intcx,intcy),
afx_msoidOnLButtonDown(UINTnFlags,CPointpoint),
afx_msoidOnLButtonUp(UINTnFlags,CPointpoint),
afx_msoidOnMouseMove(UINTnFlags,CPointpoint),
afx_msoidOnTimer(UINTnIDEvent),
afx_msoidOnPopupRotate(),
afx_msoidOnPopupSizeDecrease(),
afx_msoidOnPopupSizeIncrease(),
afx_msoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags),
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
},
//{{AFX_INSERT_LOCATION}}
//MicrosoftDeveloperStudiowillinsertadditionaldeclarationsimmediatelybeforethepreviousline.
DialogGLDlg.cpp
BOOLCDialogGLDlg::SetWindowPixelFormat(HDChDC)
{
PIXELFORMATDESCRIPTORpixelDesc,//结构体,用于构造画图面
pixelDesc.nSize等于sizeof(PIXELFORMATDESCRIPTOR),//大小
pixelDesc.nVersion等于1,
//Specifiestheversionofthisdatastructure.Thisvalueshouldbesetto1.
pixelDesc.dwFlags等于PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER|
PFD_STEREO_DONTCARE,
pixelDesc.iPixelType等于PFD_TYPE_RGBA,
pixelDesc.cColorBits等于32,
pixelDesc.cRedBits等于8,
pixelDesc.cRedShift等于16,
pixelDesc.cGreenBits等于8,
pixelDesc.cGreenShift等于8,
pixelDesc.cBlueBits等于8,
pixelDesc.cBlueShift等于0,
pixelDesc.cAlphaBits等于0,
pixelDesc.cAlphaShift等于0,
pixelDesc.cAccumBits等于64,
pixelDesc.cAccumRedBits等于16,
pixelDesc.cAccumGreenBits等于16,
pixelDesc.cAccumBlueBits等于16,
pixelDesc.cAccumAlphaBits等于0,
pixelDesc.cDepthBits等于32,
pixelDesc.cStencilBits等于8,
pixelDesc.cAuxBuffers等于0,
pixelDesc.iLayerType等于PFD_MAIN_PLANE,
pixelDesc.bReserved等于0,
pixelDesc.dwLayerMask等于0,
pixelDesc.dwVisibleMask等于0,
pixelDesc.dwDamageMask等于0,
m_GLPixelIndex等于ChoosePixelFormat(hDC,&,pixelDesc),
if(m_GLPixelIndex等于等于0)//Choosedefault
{m_GLPixelIndex等于1,
if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&,pixelDesc)等于等于0)
{
returnFALSE,
}
}
if(SetPixelFormat(hDC,m_GLPixelIndex,&,pixelDesc)等于等于FALSE)
{
returnFALSE,
}
returnTRUE,
}
BOOLCDialogGLDlg::CreateViewGLContext(HDChDC)
{
m_hGLContext等于wglCreateContext(hDC),
if(m_hGLContext等于等于NULL)
returnFALSE,
if(wglMakeCurrent(hDC,m_hGLContext)等于等于FALSE)
returnFALSE,
returnTRUE,
}
//窗体颜色
intCDialogGLDlg::OnCreate(LPCREATESTRUCTlpCreateStruct)
{if(CDialog::OnCreate(lpCreateStruct)等于等于-1)
return-1,
HWNDhWnd等于GetSafeHwnd(),
HDChDC等于::GetDC(hWnd),
if(SetWindowPixelFormat(hDC)等于等于FALSE)
return0,
if(CreateViewGLContext(hDC)等于等于FALSE)
return0,
COLORREFcolor等于::GetSysColor(COLOR_3DFACE),
glClearColor((float)GetRValue(color)/255.0f,
(float)Getalue(color)/255.0f,
(float)GetBValue(color)/255.0f,
1.0),
glPolygonMode(GL_FRONT,GL_FILL),
glPolygonMode(GL_BACK,GL_FILL),
//Gouraud
glShadeModel(GL_OOTH),
BuildList(),
SetTimer(0,5,NULL),
return0,
}
voidCDialogGLDlg::OnDestroy()
{CDialog::OnDestroy(),
if(wglGetCurrentContext()!等于NULL)
wglMakeCurrent(NULL,NULL),
if(m_hGLContext!等于NULL)
{wglDeleteContext(m_hGLContext),
m_hGLContext等于NULL,
}
}
voidCDialogGLDlg::OnSize(UINTnType,intcx,intcy)
{CDialog::OnSize(nType,cx,cy),
GLsizeiwidth,height,
GLdoubleaspect,
width等于cx,
height等于cy,
if(cy等于等于0)
aspect等于(GLdouble)width,
else
aspect等于(GLdouble)width/(GLdouble)height,
glViewport(0,0,width,height),
glMatrixMode(GL_PROJECTION),
glLoadIdentity(),
gluPerspective(45,aspect,1,10.0),
glMatrixMode(GL_MODELVIEW),
glLoadIdentity(),
glDrawBuffer(GL_BACK),
glEnable(GL_DEPTH_TEST),
}
voidCDialogGLDlg::RenderScene()//着色
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT),//刷新窗口背景
glPushMatrix(),
//Position/translation
glTranslated(0.0,0.0,-8.0),
glRotated(m_xRotate,1.0,0.0,0.0),
glRotated(m_yRotate,0.0,1.0,0.0),
glScalef(m_ScaleX,m_ScaleY,m_ScaleZ),
::glCallList(1),
glPopMatrix(),
}
voidCDialogGLDlg::OnLButtonDown(UINTnFlags,CPointpoint)
{m_LeftButtonDown等于TRUE,
m_LeftDownPos等于point,
KillTimer(0),
CDialog::OnLButtonDown(nFlags,point),
}
voidCDialogGLDlg::OnLButtonUp(UINTnFlags,CPointpoint)
{m_LeftButtonDown等于FALSE,
CDialog::OnLButtonUp(nFlags,point),
}
voidCDialogGLDlg::OnMouseMove(UINTnFlags,CPointpoint)
{if(m_LeftButtonDown)
{CSizerotate等于m_LeftDownPos-point,
m_LeftDownPos等于point,
m_yRotate-等于rotate.cx,
m_xRotate-等于rotate.cy,
InvalidateRect(NULL,FALSE),
}
CDialog::OnMouseMove(nFlags,point),
}
voidCDialogGLDlg::OnContextMenu(CWnd*,CPointpoint)
{//CG:ThisblockwasaddedbythePop-upMenuponent
{if(point.x等于等于-1&,&,point.y等于等于-1){
//keystrokeinvocation
CRectrect,
GetClientRect(rect),
ClientToScreen(rect),
point等于rect.TopLeft(),
point.Offset(5,5),
CMenumenu,
VERIFY(menu.LoadMenu(CG_IDR_POPUP_DIALOG_GLDLG)),
CMenu*pPopup等于menu.GetSubMenu(0),
ASSERT(pPopup!等于NULL),
CWnd*pWndPopupOwner等于this,
while(pWndPopupOwner->,GetStyle()&,WS_CHILD)
pWndPopupOwner等于pWndPopupOwner->,GetParent(),
pPopup->,TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,
pWndPopupOwner),
}
}
voidCDialogGLDlg::Rotate()
{m_yRotate-等于2,
InvalidateRect(NULL,FALSE),
}
voidCDialogGLDlg::OnTimer(UINTnIDEvent)
{m_yRotate-等于3,
m_xRotate-等于2,
InvalidateRect(NULL,FALSE),
CDialog::OnTimer(nIDEvent),
}
voidCDialogGLDlg::OnPopupRotate()
{SetTimer(0,5,NULL),
}
voidCDialogGLDlg::OnPopupSizeDecrease()
{m_ScaleX/等于1.1f,
m_ScaleY/等于1.1f,
m_ScaleZ/等于1.1f,
InvalidateRect(NULL,FALSE),
}
voidCDialogGLDlg::OnPopupSizeIncrease()
{m_ScaleX*等于1.1f,
m_ScaleY*等于1.1f,
m_ScaleZ*等于1.1f,
InvalidateRect(NULL,FALSE),
}
voidCDialogGLDlg::BuildList()
{::glNewList(1,GL_COMPILE_AND_EXECUTE),
glShadeModel(GL_OOTH),
floatx等于m_size,
floatxt等于5.0f,
glBegin(GL_POLYGON),//分别绕xyz轴旋转
glNormal3d(0.0,0.0,1.0),
glColor3ub(255,0,0),
glVertex3d(x,x,x),
glColor3ub(0,255,0),
glVertex3d(x,-x,x),
glColor3ub(0,0,255),
glVertex3d(-x,-x,x),
glColor3ub(255,255,0),
glVertex3d(-x,x,x),
glEnd(),
glBegin(GL_POLYGON),
glNormal3d(0.0,0.0,-1.0),
glColor3ub(255,0,0),
glVertex3d(-x,x,-x),
glColor3ub(0,255,0),
glVertex3d(-x,-x,-x),
glColor3ub(0,0,255),
glVertex3d(x,-x,-x),
glColor3ub(255,255,0),
glVertex3d(x,x,-x),
glEnd(),
glBegin(GL_POLYGON),
glNormal3d(1.0,0.0,0.0),
glColor3ub(255,0,0),
glVertex3d(x,x,x),
glColor3ub(0,255,0),
glVertex3d(x,x,-x),
glColor3ub(0,0,255),
glVertex3d(x,-x,-x),
glColor3ub(255,255,0),
glVertex3d(x,-x,x),
glEnd(),
glBegin(GL_POLYGON),
glNormal3d(-1.0,0.0,0.0),
glColor3ub(255,0,0),
glVertex3d(-x,x,x),
glColor3ub(0,255,0),
glVertex3d(-x,x,-x),
glColor3ub(0,0,255),
glVertex3d(-x,-x,-x),
glColor3ub(255,255,0),
glVertex3d(-x,-x,x),
glEnd()
glBegin(GL_POLYGON),
glNormal3d(0.0,-1.0,0.0),
glColor3ub(255,0,0),
glVertex3d(-x,-x,x),
glColor3ub(0,255,0),
glVertex3d(x,-x,x),
glColor3ub(0,0,255),
glVertex3d(x,-x,-x),
glVertex3d(-x,-x,-x),
glEnd(),
glBegin(GL_POLYGON),
glNormal3d(0.0,1.0,0.0),
glColor3ub(255,0,0),
glVertex3d(-x,x,x),
glColor3ub(0,255,0),
glVertex3d(x,x,x),
glColor3ub(0,0,255),
glVertex3d(x,x,-x),
glColor3ub(255,255,0),
glVertex3d(-x,x,-x),
glEnd(),
::glEndList(),
}
voidCDialogGLDlg::OnKeyDown(UINTnChar,
UINTnRepCnt,
UINTnFlags)
{
switch(nChar)
{
caseVK_ADD:
m_ScaleX*等于1.1f,
m_ScaleY*等于1.1f,
m_ScaleZ*等于1.1f,
InvalidateRect(NULL,FALSE),
break,
caseVK_SUBTRACT:
m_ScaleX/等于1.1f,
m_ScaleY/等于1.1f,
m_ScaleZ/等于1.1f,
InvalidateRect(NULL,FALSE),
break,
default:
{}
}
CDialog::OnKeyDown(nChar,nRepCnt,nFlags),
}
voidCDialogGLDlg::Onabout()
{
CAboutDlgdlg,
dlg.DoModal(),
}
CView
CGLView
等等
m_pDC
COpenGLDC
Object
等等
m_Camera
Gcamera
object
OnCreate()
CreateCOpenGLDC
OnDraw()
M_pGLDC->,Ready()
RenderScene()
M_pGLDC->,Finish()
OnDestroy()
Deletem_pGLDC
CGLView
WindowsMessage
Loop
OnSize()
M_pGLDC->,GLResize()