西北工業(yè)大學c大作業(yè)要點_第1頁
西北工業(yè)大學c大作業(yè)要點_第2頁
西北工業(yè)大學c大作業(yè)要點_第3頁
西北工業(yè)大學c大作業(yè)要點_第4頁
西北工業(yè)大學c大作業(yè)要點_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、XGRT11WK弓TFiRN POTnTOrZCAL TJKJVFMITT程序設計挑戰(zhàn)式課程設計極限挑戰(zhàn)挑戰(zhàn),不是為著征服自然,而是為著突破自我,超越自我 生命有極限,思想無 極限,高度有 極限,境界無 極限作業(yè)名稱:利用OpenGL實現(xiàn)有色立體茶壺旋轉(zhuǎn)圖形學 院:航海學院班級: 03021301學號: 2013300749姓 名:劉德柱劉德柱主要負責茶壺形態(tài)構建函數(shù)模塊、潘峰主要負責旋轉(zhuǎn)實現(xiàn)函數(shù),調(diào)試、完善、報告等 團隊組成:共同完成。西北工業(yè)大學2018年10月5日程序設計挑戰(zhàn)式課程設計報告請?zhí)顚懸韵率梼?nèi)容,將表格按頁對齊(插入空行),勿刪除任何部分。1、問題與背景(描述程序所要解決的問

2、題或應用背景)圖片,指的就是平面圖片,二維圖片。它所記錄的,就是當前平面的 內(nèi)容。至于其它面有什么它是不會記錄的,也是無法記錄的。如你在拍一 個人的正面圖像,它的側面或背后有什么,你知道?還是相機知道?是紅 的?黑的?沒人知道!現(xiàn)在你讓這張圖片進行立體旋轉(zhuǎn),旋轉(zhuǎn)到人的背后 之后,能看到什么?如果你要旋轉(zhuǎn),則就不能普通的平面圖片,而應該是 三維圖像! 這就是C+中opengl的用處了。它可以實現(xiàn)立體旋轉(zhuǎn),旋轉(zhuǎn) 360 地看這個物體,并且還能給三維物體添加顏色, 更具真實感和視覺效 果。2、開發(fā)工具(列出所使用的開發(fā)工具和第3方開發(fā)庫)VC+6. 0,MFC Windows API3、主要功能(詳

3、細說明程序的功能)本C+程序利用OpenGL實現(xiàn)旋轉(zhuǎn)圖形,可以使示例中有色立體茶壺實 現(xiàn)360旋轉(zhuǎn),使觀眾全方位立體感知茶壺形態(tài)。4、設計內(nèi)容(詳細描述解決問題的原理和方法、算法、數(shù)據(jù)結構等)Ope nGL的工作順序就是一個從定義幾何要素到把象素段寫入幀緩沖區(qū)的過程。在屏幕上顯示圖象的主要步驟是以下3步:1)構造幾何要素(點、線、多邊形、圖像、位圖),創(chuàng)建對象的數(shù)學描 述。在三維空間放置對象,選擇有利的觀察點。2)計算對象的顏色,這些顏色可能直接定義, 或由光照條件及紋理間 接給出。3)光柵化,把對象的數(shù)學描述和顏色信息轉(zhuǎn)換到屏幕的象素。在本程序中。首先使用相關的 WINDOWS AF創(chuàng)建窗口

4、,其次實現(xiàn)程序 的相應功能:1 .使用OPENG相應庫函數(shù)畫出正方體。2 .使之旋轉(zhuǎn)起來。3 .在窗體中響應鼠標事件,控制正方體的旋轉(zhuǎn)。程序流程如圖所示:- 13 -ETKMAIN主程序?qū)⒊绦蚣せ畈⑦M入消息循環(huán)程序完成由KiHGLindous 毀窗口!推岀消息循壞、結束程序至此,程序的大體內(nèi)容以及機構已經(jīng)構造成型OPENG的主體繪制工作:首先使用 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_B 清除屏幕和深度緩存,然后使用glLoadlde ntity();重置當前的模型觀察矩陣,確定繪制好圖形的位置glTranslatef(0.0f,0.0f,

5、z);移入屏幕z個單位。函數(shù)glTranslatef(x, y, z)作用為沿著X, Y和Z軸移動; 現(xiàn) 在是本程序中最重要的語句:glRotatef(a ngle,O.Of,O.Of,O.Of),其中angle為每次旋轉(zhuǎn)的角度,之后分別是XYZ三個軸的旋轉(zhuǎn)分量,這三個旋轉(zhuǎn)分量構成了三維坐標軸中的旋轉(zhuǎn)法向量。繪制:void COPENGLActView:O nDraw(CDC* pDC)COPENGLActDoc* pDoc = GetDocume nt(); ASSERT_VALID(pDoc);static GLfloat xangle = 10.0f;glClear(GL_COLOR_B

6、UFFER_BIT | GL_DEPTH_BUFFER_BIT); gIPushMatrix ();glTranslatef(0.0f, O.Of, -8.5);glRotatef(xangle, 1.0f, O.Of, O.Of);xan gle+= 10.0f;auxSolidTeapot(1.5);glPopMatrix ();glFlush();if(FALSE=:SwapBuffers(m_pCo ntextDC-GetSafeHdc()AfxMessageBox( ? ?o3? e u);重置模型觀察矩陣:glMatrixMode(GL_PROJECTION);/ 選擇投 影矩陣g

7、lLoadIde ntity();/重置投影矩陣 /設置視口的大小gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f)glMatrixMode(GL_MODELVIEW);/ 選擇模型觀察矩陣glLoadIde ntity();/重置模型觀察矩陣視圖框的輸出:BOOL COPENGLActView:O nPreparePri ntin g(CPri ntl nfo* plnfo) /默認的準備return DoPreparePri nti ng(pl nfo);voidCOPENGLActView:O nBegi nP

8、rintin g(CDC*/*pDC*/,CPri ntlnfo* /*pI nfo*/)/ TODO:添加額外的初始化之前打印void COPENGLActView:O nEn dPri ntin g(CDC* /*pDC*/, CPri ntlnfo*/*pIn fo*/)/ TODO:添加打印后進行清理void COPENGLActView:O nTimer(UINT nIDEve nt)/ TODO:在這里添加消息處理程序代碼和 /或調(diào)用默認旋轉(zhuǎn)的定時操作和動畫效果處理:this- On Draw(this-GetDC();CView:O nTimer( nIDEve nt);void

9、 COPENGLActView:O nAct()SetTimer(1,15,NULL);顯示場景的設置:Void Ren derSe ne(void)static float an gle = 0.0;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gIPushMatrix ();glTranslatef(0.0f, O.Of, -8.5);glRotatef(xangle, 1.0f, O.Of, O.Of);xan gle+= 10.0f;auxSolidTeapot(1.5);glPopMatrix ();glFlush();通過以

10、上步驟,實現(xiàn)圖形呈現(xiàn),再通過旋轉(zhuǎn)函數(shù)實現(xiàn)立體模型茶壺的 旋轉(zhuǎn)。5、程序文件與工程名稱(標出程序中所有文件名、工程名稱及其說明)OPENGLAct.dsw VC6T 作區(qū)文件OPENGLAct.dsp VC6工程文件OPENGLAct.cpp 主程序OPENGLAct.h主程序頭文件Ma in Frm.cpp框架類的實現(xiàn)文件OPENGLActDoc.cpp 文檔OPENGLActView.cpp視圖框應用程序OPENGLActView.h視圖框應用程序頭文件StdAfx.cpp VC6 預處理文件StdAfx.h VC6 預處理頭文件OPENGLAct.rc資源文件resource.h 資源定義

11、頭文件res圖標存放文件夾OPENGLAct.ico應用程序圖標6、函數(shù)模塊(程序中各個函數(shù)的原型聲明及其說明)class COPENGLActApp : public CWin App應用程序類class COPENGLActDlg : public CDialog應用程序?qū)υ捒騰oid COPENGLActView:OnDraw(CDC* pDC);立體模型繪制函數(shù) BOOLCOPENGLActView:PreCreateWi ndow(CREATESTRUCT& ;窗口 類或者樣式的修改BOOL COPENGLActView:O nPreparePri ntin g(CPri ntI n

12、fo* plnfo);函數(shù)的輸出,實現(xiàn)立體茶壺的呈現(xiàn)voidCOPENGLActView:O nBegi nPrintin g(CDC*/*pDC*/,CPrin tI nfo* /*pln fo*/);打印之前的初始化void COPENGLActView:O nEn dPri ntin g(CDC* /*pDC*/, CPri ntI nfo*/*pI nfo*/)打印之后的清理操作void COPENGLActView:O nSize(UINT nType, i nt ex, i nt cy)尺寸控制void COPENGLActView:O nTimer(UINT nIDEve nt)

13、定時器void COPENGLActView:O nAct()動畫7、使用說明(運行程序的小型說明書)運行程序OPENGLAct.cpp后,進行調(diào)試,茶壺界面自動打開。此時有 色茶壺呈靜態(tài)。點擊“查看”-“開始動畫”后,茶壺自動翻轉(zhuǎn)旋轉(zhuǎn),可 全方位感知茶壺形態(tài)。8程序開發(fā)總結(簡要敘述編寫本作業(yè)的收獲與思考)收獲:通過此次程序設計實驗,我對OpenGL圖形函數(shù)有了初步的了解,并且能夠根據(jù)書本上的現(xiàn)有函數(shù)整合、編寫出簡單的圖形處理函數(shù)??偨Y:C+語言作用范圍廣,如果能夠熟練掌握并且能夠靈活運用,將會在工程運用方面起到很大的作用。例如本題中,通過VC+6.0實現(xiàn)了立體茶壺模型的旋轉(zhuǎn),這個可以用于茶

14、壺生產(chǎn)制造前的產(chǎn)品預覽。的功能十分強大,需要我們學習的地方還有很多。9、運行截圖(附上程序運行的截圖畫面,至少有1幅,截圖越翔實得分越高)Windows中抓取當前活動窗口: Alt + Print Screen,抓取全屏:Print Screen?;蛘呤褂肏yperSnap等軟件(百度搜索)。10、源程序(附上程序源代碼,若是多個文件,標出文件名)/ 1.應用程序主窗框的源代碼/ Mai nFrm.cpp : CMai nFrame框架類的實現(xiàn)#i nclude stdafx.h#i nclude OPENGLAct.h#in clude Mai nFrm.h#ifdef DEBUG #def

15、i ne new DEBUG_NEW #un def THIS_FILEstatic char THIS_FILE = _FILE_;#en dif/ CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AFX_MSG_MAP(CMainFrame)/ 注意 ,ClassWizard 將添加和刪除映射宏。/ 不編輯你所看到的這些生成的代碼塊 !ON_WM_CREATE()/AFX_MSG_MAPEND_MESSAGE_MAP() static UINT indi

16、cators =狀態(tài)行指標ID_SEPARATOR, /ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;/程序設計挑戰(zhàn)式課程設計報告/ CMainFrame 建設/ 破壞 CMainFrame:CMainFrame()/ 待辦事項 : 添加成員初始化代碼CMainFrame:CMainFrame()int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if (!m_wndTo

17、olBar.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(Failed to create toolbarn); return -1; / 無法創(chuàng)建if (!m_wndStatusBar.Create(this) | !m_wndStatusBar.SetIndicators(indicators

18、, sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn); return -1; / 無法創(chuàng)建/ 待辦事項 : 刪除這三行如果你不想工具欄/ be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return 0;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:

19、PreCreateWindow(cs) ) return FALSE;/ 待辦事項 : 修改窗口類或樣式來修改/ the CREATESTRUCT csreturn TRUE;/ CMainFrame 診斷#ifdef _DEBUGvoid CMainFrame:AssertValid() constCFrameWnd:AssertValid();void CMainFrame:Dump(CDumpContext& dc) constCFrameWnd:Dump(dc);#endif /_DEBUG/ / CMainFrame 消息處理程序/ 2. 主程序源代碼/ OPENGLAct.cpp

20、: 為應用程序定義了類的行為 /#include stdafx.h#include OPENGLAct.h#include MainFrm.h#include OPENGLActDoc.h#include OPENGLActView.h#ifdef _DEBUG #define new DEBUG_NEW#undef THIS_FILE static char THIS_FILE = _FILE_;#endif/ COPENGLActAppBEGIN_MESSAGE_MAP(COPENGLActApp, CWinApp)/AFX_MSG_MAP(COPENGLActApp)ON_COMMAND

21、(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()/ COPENGLActApp constructionCO

22、PENGLActApp:COPENGLActApp()/ 待辦事項 : 建設代碼添加在這里/ 把所有 InitInstance 的重要初始化/ 唯一的 COPENGLActAp對象COPENGLActApp theApp;/ COPENGLActApp initializationBOOL COPENGLActApp:InitInstance()AfxEnableControlContainer();/ 標準的初始化/ 如果你不使用這些功能 , 希望減少規(guī)模/ 你的最終的可執(zhí)行文件 , 你應該從以下刪除/ 你不需要特定的初始化例程。#ifdef _AFXDLLEnable3dControls(

23、);/ 稱之為當使用 MFC DLL共享#elseEnable3dControlsStatic();/當鏈接到MFC靜態(tài)調(diào)用這個#endif/ 改變我們的注冊表鍵設置存儲。/ 待辦事項 : 你應該修改這個字符串是合適的/ 如您的公司或組織的名稱 .SetRegistryKey(_T(Local AppWizard-Generated Applications);LoadStdProfileSettings(); / 加載標準 INI 文件選項 ( 包括系統(tǒng) ) / 注冊應用程序的文檔模板。文檔模板/ 作為文件之間的連接 , 框架窗口和視圖。CSingleDocTemplate* pDocTem

24、plate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(COPENGLActDoc),RUNTIME_CLASS(CMainFrame), / 主要 SDI 框架窗口RUNTIME_CLASS(COPENGLActView);AddDocTemplate(pDocTemplate);/解析命令行標準shell命令,DDE,文件打開CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);/ 調(diào)度命令在命令行上指定if (!ProcessShellCommand(c

25、mdInfo)return FALSE;/ 唯一的窗口已經(jīng)初始化 , 所以顯示和更新 m_pMainWnd-ShowWindow(SW_SHOW); m_pMainWnd-UpdateWindow();m_pMainWnd-SetWindowText(?x OpenG?=-);return TRUE;/ CAboutDlg 對話框用于應用程序class CAboutDlg : public CDialogpublic:CAboutDlg();/ 對話框數(shù)據(jù)/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard 生成

26、的虛函數(shù)覆蓋/AFX_VIRTUAL(CAboutDlg)protected:/ DDX/DDVvirtual void DoDataExchange(CDataExchange* pDX); support/AFX_VIRTUAL/ 實現(xiàn) protected:/AFX_MSG(CAboutDlg)/ 沒有消息處理程序/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExch

27、ange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg) /AFX_DATA_MAP BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAP END_MESSAGE_MAP() / 應用程序命令運行對話框 void COPENGLActApp:OnAppAbout() CAboutDlg aboutDlg; aboutDlg.DoModal(); / COPENGLA

28、ctApp 消息處理程序/ 3. 文檔框源代碼/ OPENGLActDoc.cpp : OPENGLActDoc 類的實現(xiàn)#include stdafx.h#include OPENGLAct.h#include OPENGLActDoc.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ COPENGLActDocIMPLEMENT_DYNCREATE(COPENGLActDoc, CDocument)BEGIN_MESSAGE_MAP(COPENGLActDoc,

29、 CDocument)/AFX_MSG_MAP(COPENGLActDoc)/ 注意 ,ClassWizard 將添加和刪除映射宏。/ 不編輯在這些你看到的生成的代碼塊/AFX_MSG_MAPEND_MESSAGE_MAP()/ COPENGLActDoc 創(chuàng)建/ 破壞COPENGLActDoc:COPENGLActDoc()/ TODO: 添加一次性建設代碼在這里COPENGLActDoc:COPENGLActDoc()BOOL COPENGLActDoc:OnNewDocument()if (!CDocument:OnNewDocument()- 25 -程序設計挑戰(zhàn)式課程設計報告retu

30、rn FALSE;/ TODO: 僅代碼添加在這里/ (SDI 文檔可以重用該文檔 )return TRUE;/ COPENGLActDoc 序列化void COPENGLActDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ TODO:在這里添加存儲代碼else/ TODO: 加載代碼添加在這里/ COPENGLActDoc 診斷#ifdef _DEBUGvoid COPENGLActDoc:AssertValid() constCDocument:AssertValid();void COPENGLActDoc:Dump(CDumpContext

31、& dc) const CDocument:Dump(dc);#endif /_DEBUG/ COPENGLActDoc 命令/ 4. 視圖框源代碼/ OPENGLActView.cpp : COPENGLActView 類的實現(xiàn)#include stdafx.h#include OPENGLAct.h#include OPENGLActDoc.h#include OPENGLActView.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_; #endifGLfloat sgenp

32、arams = 1.0, 1.0, 1.0, 0.0; GLubyte stripeImage3*64;/- 27 -程序設計挑戰(zhàn)式課程設計報告/ COPENGLActViewIMPLEMENT_DYNCREATE(COPENGLActView, CView)BEGIN_MESSAGE_MAP(COPENGLActView, CView)/AFX_MSG_MAP(COPENGLActView)ON_WM_CREATE()ON_WM_SIZE()ON_WM_TIMER()ON_COMMAND(ID_ACT, OnAct)/AFX_MSG_MAP/ 標準的打印命令ON_COMMAND(ID_FIL

33、E_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ COPENGLActView construction/destruction- 29 -程序設計挑戰(zhàn)式課程設計報告COPENGLActView:COPENGLActView()/ TODO: 施工的代碼在這里COPENGLActView:COPENGLActView()BOOL COP

34、ENGLActView:PreCreateWindow(CREATESTRUCT& cs) / TODO: 在這里通過修改修改窗口類或樣式/ the CREATESTRUCT cscs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;return CView:PreCreateWindow(cs);/ COPENGLActView 繪制void COPENGLActView:OnDraw(CDC* pDC)/ COPENGLActView 輸出- 33 -COPENGLActDoc* pDoc = GetDocument();ASSERT_VALID(pD

35、oc);static GLfloat xangle = 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( ? ?c3

36、? e u);BOOL COPENGLActView:OnPreparePrinting(CPrintInfo* pInfo) / 默認的準備return DoPreparePrinting(pInfo);CPrintInfo*CPrintInfo*void COPENGLActView:OnBeginPrinting(CDC* /*pDC*/, /*pInfo*/)/ TODO: 添加額外的初始化之前打印void COPENGLActView:OnEndPrinting(CDC* /*pDC*/, /*pInfo*/)/ TODO: 添加打印后進行清理/ COPENGLActView 診斷#

37、ifdef _DEBUGvoid COPENGLActView:AssertValid() constCView:AssertValid();void COPENGLActView:Dump(CDumpContext& dc) constCView:Dump(dc);COPENGLActDoc* COPENGLActView:GetDocument() / 調(diào)試版本是內(nèi)聯(lián)ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(COPENGLActDoc);return (COPENGLActDoc*)m_pDocument;#endif /_DEBUG程序設計挑戰(zhàn)式課程設計報告int COPENGLActView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1)return -1;m_pContextDC=new CClientDC(this);ASSERT(m_pContextDC);static PIXELFO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論