西北工业大学c++大作业.docx
《西北工业大学c++大作业.docx》由会员分享,可在线阅读,更多相关《西北工业大学c++大作业.docx(28页珍藏版)》请在冰豆网上搜索。
西北工业大学c++大作业
作业名称:
利用OpenGL实现有色立体茶壶旋转图形
学院:
航海学院
班级:
03021301
学号:
2013300749
姓名:
刘德柱
团队组成:
刘德柱主要负责茶壶形态构建函数模块、潘峰主要负责旋转实现函数,调试、完善、报告等共同完成。
西北工业大学
2015年6月29日
请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。
1、问题与背景(描述程序所要解决的问题或应用背景)
图片,指的就是平面图片,二维图片。
它所记录的,就是当前平面的内容。
至于其它面有什么它是不会记录的,也是无法记录的。
如你在拍一个人的正面图像,它的侧面或背后有什么,你知道?
还是相机知道?
是红的?
黑的?
没人知道!
现在你让这张图片进行立体旋转,旋转到人的背后之后,能看到什么?
如果你要旋转,则就不能普通的平面图片,而应该是三维图像!
这就是c++中opengl的用处了。
它可以实现立体旋转,旋转360°地看这个物体,并且还能给三维物体添加颜色,更具真实感和视觉效果。
2、开发工具(列出所使用的开发工具和第3方开发库)
VC++6.0,MFC,WindowsAPI
3、主要功能(详细说明程序的功能)
本c++程序利用OpenGL实现旋转图形,可以使示例中有色立体茶壶实现360°旋转,使观众全方位立体感知茶壶形态。
4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)
OpenGL:
的工作顺序就是一个从定义几何要素到把象素段写入帧缓冲区的过程。
在屏幕上显示图象的主要步骤是以下3步:
1)构造几何要素(点、线、多边形、图像、位图),创建对象的数学描述。
在三维空间放置对象,选择有利的观察点。
2)计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。
3)光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。
在本程序中。
首先使用相关的WINDOWSAPI创建窗口,其次实现程序的相应功能:
1.使用OPENGL相应库函数画出正方体。
2.使之旋转起来。
3.在窗体中响应鼠标事件,控制正方体的旋转。
程序流程如图所示:
至此,程序的大体内容以及机构已经构造成型
OPENGL的主体绘制工作:
首先使用glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);清除屏幕和深度缓存,然后使用glLoadIdentity();重置当前的模型观察矩阵,确定绘制好图形的位置glTranslatef(0.0f,0.0f,z);移入屏幕z个单位。
函数glTranslatef(x,y,z)作用为沿着X,Y和Z轴移动;现在是本程序中最重要的语句:
glRotatef(angle,0.0f,0.0f,0.0f),其中angle为每次旋转的角度,之后分别是XYZ三个轴的旋转分量,这三个旋转分量构成了三维坐标轴中的旋转法向量。
绘制:
voidCOPENGLActView:
:
OnDraw(CDC*pDC)
{
COPENGLActDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
staticGLfloatxangle=10.0f;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.0f,0.0f,-8.5);
glRotatef(xangle,1.0f,0.0f,0.0f);
xangle+=10.0f;
auxSolidTeapot(1.5);
glPopMatrix();
glFlush();
if(FALSE==:
:
SwapBuffers(m_pContextDC->GetSafeHdc()))
AfxMessageBox("½»»»»º³åÇøʧ°Ü");
}
重置模型观察矩阵:
glMatrixMode(GL_PROJECTION);//选择投影矩阵glLoadIdentity();//重置投影矩阵//设置视口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵glLoadIdentity();//重置模型观察矩阵
视图框的输出:
BOOLCOPENGLActView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{//默认的准备
returnDoPreparePrinting(pInfo);
}
voidCOPENGLActView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{//TODO:
添加额外的初始化之前打印
}
voidCOPENGLActView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{//TODO:
添加打印后进行清理
}
voidCOPENGLActView:
:
OnTimer(UINTnIDEvent)
{
//TODO:
在这里添加消息处理程序代码和/或调用默认
旋转的定时操作和动画效果处理:
this->OnDraw(this->GetDC());
CView:
:
OnTimer(nIDEvent);
}
voidCOPENGLActView:
:
OnAct()
{
SetTimer(1,15,NULL);
}
显示场景的设置:
VoidRenderSene(void)
{
staticfloatangle=0.0;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.0f,0.0f,-8.5);
glRotatef(xangle,1.0f,0.0f,0.0f);
xangle+=10.0f;
auxSolidTeapot(1.5);
glPopMatrix();
glFlush();
}
通过以上步骤,实现图形呈现,再通过旋转函数实现立体模型茶壶的旋转。
5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)
OPENGLAct.dswVC6工作区文件
OPENGLAct.dspVC6工程文件
OPENGLAct.cpp主程序
OPENGLAct.h主程序头文件
MainFrm.cpp框架类的实现文件
OPENGLActDoc.cpp文档
OPENGLActView.cpp视图框应用程序
OPENGLActView.h视图框应用程序头文件
StdAfx.cppVC6预处理文件
StdAfx.hVC6预处理头文件
OPENGLAct.rc资源文件
resource.h资源定义头文件
res图标存放文件夹
OPENGLAct.ico应用程序图标
6、函数模块(程序中各个函数的原型声明及其说明)
classCOPENGLActApp:
publicCWinApp应用程序类
classCOPENGLActDlg:
publicCDialog应用程序对话框
voidCOPENGLActView:
:
OnDraw(CDC*pDC);立体模型绘制函数
BOOLCOPENGLActView:
:
PreCreateWindow(CREATESTRUCT&cs);窗口类或者样式的修改
BOOLCOPENGLActView:
:
OnPreparePrinting(CPrintInfo*pInfo);函数的输出,实现立体茶壶的呈现
voidCOPENGLActView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/);打印之前的初始化
voidCOPENGLActView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)打印之后的清理操作
voidCOPENGLActView:
:
OnSize(UINTnType,intcx,intcy)尺寸控制
voidCOPENGLActView:
:
OnTimer(UINTnIDEvent)定时器
voidCOPENGLActView:
:
OnAct()动画
7、使用说明(运行程序的小型说明书)
运行程序OPENGLAct.cpp后,进行调试,茶壶界面自动打开。
此时有色茶壶呈静态。
点击“查看”--“开始动画”后,茶壶自动翻转旋转,可全方位感知茶壶形态。
8、程序开发总结(简要叙述编写本作业的收获与思考)
收获:
通过此次程序设计实验,我对OpenGL图形函数有了初步的了解,并且能够根据书本上的现有函数整合、编写出简单的图形处理函数。
总结:
C++语言作用范围广,如果能够熟练掌握并且能够灵活运用,将会在工程运用方面起到很大的作用。
例如本题中,通过VC++6.0实现了立体茶壶模型的旋转,这个可以用于茶壶生产制造前的产品预览。
的功能十分强大,需要我们学习的地方还有很多。
9、运行截图(附上程序运行的截图画面,至少有1幅,截图越翔实得分越高)
Windows中抓取当前活动窗口:
Alt+PrintScreen,抓取全屏:
PrintScreen。
或者使用HyperSnap等软件(XX搜索)。
10、源程序(附上程序源代码,若是多个文件,标出文件名)
//1.应用程序主窗框的源代码
//MainFrm.cpp:
CMainFrame框架类的实现
#include"stdafx.h"
#include"OPENGLAct.h"
#include"MainFrm.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
//注意,ClassWizard将添加和删除映射宏。
//不编辑你所看到的这些生成的代码块!
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
staticUINTindicators[]=
{
ID_SEPARATOR,//状态行指标
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
//CMainFrame建设/破坏
CMainFrame:
:
CMainFrame()
{
//待办事项:
添加成员初始化代码
}
CMainFrame:
:
~CMainFrame()
{
}
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//无法创建
}
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//无法创建
}
//待办事项:
删除这三行如果你不想工具栏
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return0;
}
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//待办事项:
修改窗口类或样式来修改
//theCREATESTRUCTcs
returnTRUE;
}
/////////////////////////////////////////////////////////////////////////////
//CMainFrame诊断
#ifdef_DEBUG
voidCMainFrame:
:
AssertValid()const
{
CFrameWnd:
:
AssertValid();
}
voidCMainFrame:
:
Dump(CDumpContext&dc)const
{
CFrameWnd:
:
Dump(dc);
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CMainFrame消息处理程序
//2.主程序源代码
//OPENGLAct.cpp:
为应用程序定义了类的行为。
//
#include"stdafx.h"
#include"OPENGLAct.h"
#include"MainFrm.h"
#include"OPENGLActDoc.h"
#include"OPENGLActView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//COPENGLActApp
BEGIN_MESSAGE_MAP(COPENGLActApp,CWinApp)
//{{AFX_MSG_MAP(COPENGLActApp)
ON_COMMAND(ID_APP_ABOUT,OnAppAbout)
//注意,ClassWizard将添加和删除映射宏。
//不编辑你所看到的这些生成的代码块
//}}AFX_MSG_MAP
//基于标准的文件文档的命令
ON_COMMAND(ID_FILE_NEW,CWinApp:
:
OnFileNew)
ON_COMMAND(ID_FILE_OPEN,CWinApp:
:
OnFileOpen)
//标准的打印设置命令
ON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp:
:
OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//COPENGLActAppconstruction
COPENGLActApp:
:
COPENGLActApp()
{
//待办事项:
建设代码添加在这里
//把所有InitInstance的重要初始化
}
/////////////////////////////////////////////////////////////////////////////
//唯一的COPENGLActApp对象
COPENGLActApptheApp;
/////////////////////////////////////////////////////////////////////////////
//COPENGLActAppinitialization
BOOLCOPENGLActApp:
:
InitInstance()
{
AfxEnableControlContainer();
//标准的初始化
//如果你不使用这些功能,希望减少规模
//你的最终的可执行文件,你应该从以下删除
//你不需要特定的初始化例程。
#ifdef_AFXDLL
Enable3dControls();//称之为当使用MFCDLL共享
#else
Enable3dControlsStatic();//当链接到MFC静态调用这个
#endif
//改变我们的注册表键设置存储。
//待办事项:
你应该修改这个字符串是合适的
//如您的公司或组织的名称.
SetRegistryKey(_T("LocalAppWizard-GeneratedApplications"));
LoadStdProfileSettings();//加载标准INI文件选项(包括系统)
//注册应用程序的文档模板。
文档模板
//作为文件之间的连接,框架窗口和视图。
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(COPENGLActDoc),
RUNTIME_CLASS(CMainFrame),//主要SDI框架窗口
RUNTIME_CLASS(COPENGLActView));
AddDocTemplate(pDocTemplate);
//解析命令行标准shell命令,DDE,文件打开
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//调度命令在命令行上指定
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
//唯一的窗口已经初始化,所以显示和更新
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
m_pMainWnd->SetWindowText("ÖÆ×÷OpenGL¶¯»");
returnTRUE;
}
/////////////////////////////////////////////////////////////////////////////
//CAboutDlg对话框用于应用程序
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//对话框数据
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizard生成的虚函数覆盖
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//实现
protected:
//{{AFX_MSG(CAboutDlg)
//没有消息处理程序
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//应用程序命令运行对话框
voidCOPENGLActApp:
:
OnAppAbout()
{
CAboutDlgaboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
//COPENGLActApp消息处理程序
//3.文档框源代码
//OPENGLActDoc.cpp:
OPENGLActDoc类的实现
#include"stdafx.h"
#include"OPENGLAct.h"
#include"OPENGLActDoc.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////