主要本科基础课程名单,主要本科基础课程

更新时间:2024-04-07 作者:用户投稿原创标记本站原创 点赞:16955 浏览:72315

计算机系统综合课程设计

简单的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()

相关论文范文