freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于opengl的屏幕對象拾取_本科畢業(yè)論文(編輯修改稿)

2025-08-15 14:24 本頁面
 

【文章內(nèi)容簡介】 MFC 的基礎(chǔ)上進一步實現(xiàn)了皮膚、漸變風格、多頂層窗口程序、屬性列表等較受歡迎的功能;同時,在 C++在線社區(qū)中,很大一部分開放的源代碼也是基于 MFC 的。 VC++產(chǎn)品 版本 與 MFC 版本 如下: 表格 1 VC++產(chǎn)品版本與 MFC 版本 MFC 特點 封裝 構(gòu)成 MFC 框架的是 MFC 類庫。 MFC 類庫是 C++類庫。這些類或者封裝了 Win32 應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了 OLE 特 性,或者封裝了 ODBC和 DAO 數(shù)據(jù)訪問的功能,等等, 8 分述如下 : ( 1)對 Win32 應(yīng)用程序編程接口的封裝 ; ( 2)對應(yīng)用程序概念的封裝 ; ( 3)對 COM/OLE 特性的封裝 ; ( 4)對 ODBC 功能的封裝 。 繼承 首先, MFC 抽象出 眾多類的共同特性,設(shè)計出一些基類作為實現(xiàn)其他類的基礎(chǔ)。這些類中 , 最重要的類是 CObject 和 CCmdTarget。 CObject 是 MFC 的根類,絕大多數(shù) MFC 類是其派生的,包括CCmdTarget。 CObject 實現(xiàn)了一些重要的特性,包括動態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、 對程序調(diào)試的支持,等等。所有從 CObject 派生的類都將具備或者可以具備 CObject 所擁有的特性。CCmdTarget 通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。 MFC 中,任何可以處理消息的類都從 CCmdTarget 派生。 針對每種不同的對象, MFC 都設(shè)計了一組類對這些對象進行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是 CWnd;應(yīng)用程序?qū)ο?,基類?CwinThread;文檔對象,基類是 Cdocument,等等。 虛擬函數(shù)和動態(tài)約束 MFC 以“ C++”為基礎(chǔ),自然支持虛擬函數(shù)和動態(tài)約束。但是作為一個編程框架,有一個問題必須解決:如果僅僅通過虛擬函數(shù)來支持動態(tài)約束,必然導致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如, CWnd 封裝 Windows 窗口對象時,每一條 Windows 消息對應(yīng)一個成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計成虛擬函數(shù),由于數(shù)量太多,實現(xiàn)起來不現(xiàn)實。于是, MFC建立了消息映射機制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。 應(yīng)用程序的構(gòu)成 圖 2 解釋了該應(yīng)用程序的結(jié)構(gòu) 與對象 ,箭頭 表示信息流向。 圖 2 應(yīng)用程序的結(jié)構(gòu) 從 CWinApp、 CDocument、 CView、 CMDIFrameWnd、 CMDIChildWnd 類對應(yīng)地派生出 CTApp、 CTDoc、CTView、 CMainFrame、 CChildFrame 五個類,這五個類的實例分別是應(yīng)用程序?qū)ο?、文檔對象、視對象、主框架窗口對象和文檔邊框窗口對象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。對這些 9 類或者對象解釋如下 : ( 1)應(yīng)用程序 ( CWinApp) 應(yīng)用程序類派生于 CWinApp?;诳蚣艿膽?yīng)用程序必須有且只有一個應(yīng) 用程序?qū)ο?,它負責?yīng)用程序的初始化、運行和結(jié)束。 ( 2)邊框窗口 (CMDIFrameWnd) 如果是 SDI 應(yīng)用程序,從 CFrameWnd 類派生邊框窗口類,邊框窗口的客戶子窗口 (MDIClient)直接包含視窗口;如果是 MDI 應(yīng)用程序,從 CMDIFrameWnd 類派生邊框窗口類,邊框窗口的客戶子窗口 (MDIClient)直接包含文檔邊框窗口。如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加CToolBar 和 CStatusBar 類型的成員變量,以及在一個 OnCreate 消息處理函數(shù)中初始化這兩個控制窗口。 邊框窗口用來管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助 (SHIFT+F1 模式 )和打印預覽)。 ( 3)文檔邊框窗口 (CMDIChildWnd) 文檔邊框窗口類從 CMDIChildWnd 類派生, MDI 應(yīng)用程序使用文檔邊框窗口來包含視窗口。 ( 4)文檔 (CDocument) 文檔類從 CDocument 類派生,用來管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過文檔實現(xiàn)的。視窗口通過文檔對象來訪問和更新數(shù)據(jù)。 ( 5)視 (CView) 視類從 CView 或 它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作 用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對文檔的操作 。 用圖的形式可直觀地表示所涉及的 MFC 類的繼承或者派生關(guān)系 ,如下: 圖 3 MFC 的層次 基于 OpenGL+MFC 的三維模擬的編程環(huán)境配置 用 MFC 調(diào)用 OpenGL 函數(shù)來進行三維模擬的編程環(huán)境配置: (一)創(chuàng)建 MFC 項目 (1) 創(chuàng)建項目文件:選擇 File/New 菜單選項,建立一個名為 MyTest 的單文檔 (SDI) 應(yīng)用程序; (二)配置 OpenGL 開發(fā)環(huán)境 ( 1) 將 91. h, glu. h, glaux. h 和 glut. h 拷貝到 ???(即盤符 +路徑 )\ Microsoft Visual Studio\ VC98\ Include\ GL 目錄中; ( 2) 將 opengl32. 1ib, glu32. 1ib, glaux. 1ib 和 glut32. 1ib 拷貝到 ???(即盤符 +路徑 )\ Microsoft 10 Visual Studio\ Vc98\ Lib 目錄中; ( 3) 將 , , , , 文件拷貝到操作系統(tǒng)安裝目錄 C:\ WINDOWS\ system32 目錄下 ; ( 4)選擇 Project/Setting 菜單選項。在 Link 欄的 Lib 輸入域中添加 、 ,若需使用 OpenGL 的輔助庫函數(shù),則還需添加 。 到此,基于 OpenGL+ MFC 的開發(fā)環(huán)境就建立好。 (三)初始化 OpenGL 具體編程步驟 : 第一步:修改窗口風格設(shè)置。 需要在函數(shù) CGLView:: PreCreateWindow 中增加對 Windows 窗口風格的設(shè)置,以防止在窗口重疊時把圖形繪制到子窗口和兄弟窗口。實現(xiàn)代碼如下 : cs. style l=WS_CLIPCHILDREN WS CLIPSIBLINGS; 第二步:設(shè)置像素格式。 首先需要在視圖類 CGLView 中添加一個成員函數(shù),函數(shù)原型如下: BOOL CGLView::SetupPixelFormat(CDC*pDC);設(shè)置像素格式并向視圖類 CGLView 中添加兩個成員變量: CDC* m_pDC; OpenGL 設(shè)備場境 HGLRC m_hRC; OpenGL 渲染場境在 Windows 中,使用結(jié)構(gòu) PIXELFO 腿ATDEscRIPTOR 來設(shè)置像素格式,并提供 ChoosePixelFormat()函數(shù)來選擇最為匹配的像素格式以及SetPixelFormat()函數(shù)來為設(shè)備場境設(shè)置像素格式。 設(shè)置像素格式的步驟如下: PIXELFORMATDESCRIPTOR,像素格式是用這個結(jié)構(gòu)來描述的。 b. 調(diào)用函數(shù) ChoosePixelFormat() ,將 填 寫 好的 像 素 格 式結(jié) 構(gòu) 傳 遞給 該 函 數(shù) ,函 數(shù)ChoosePixelFormat()返回一個整型的序號。這個序號標識一個當前設(shè)備場境中所能提供的,且與所要求的像素格式最為匹配的像素格式。 c.將這個返回的像素格式序號傳遞給函數(shù) SetPixelFormat(),使之設(shè)置成為當前設(shè)備場境的像素格式。 第三步:創(chuàng)建渲染場境。 用 wglreatecontext()函數(shù)來創(chuàng)建 OpenGL 的一個渲染場境;用 wglMakeCurrent()函數(shù)使給定的渲染場境設(shè)置成為當前調(diào)用線程的渲染場境,而線程中隨后調(diào)用的 OpenGL 命令都將通過與該渲染場境相關(guān)聯(lián)的設(shè)備場境來實現(xiàn)窗口的場景繪制。具體實現(xiàn)代碼如下: HDC m hDC; HGLRC nl hglRC: m_hglRC=wglCreateContext(m_hDC);創(chuàng)建一個渲染場境 wglMakecurrent(m_hDC, m hglRC);使成為當前調(diào)用線程的渲染場境 第四步:添加消息處理函數(shù)。 利用 MFC ClassWizard 為 CGLView 類添加消息:帳 _CREATE、 wM_DESTROY、 m,t_SIZE 和刪 _TIMER 的響應(yīng)函數(shù),消息處理函數(shù)名依次為: OnCreate()、 onDestroy()、 OnSize()和 OnTimer()。 A. CGLView:: OnCreate()函數(shù) 該函數(shù)完成的功能是:在視圖窗口創(chuàng)建完成后,進行 OpenGLWindows 的初始化工作。 (四 )清理工作 CGLView:: OnDestroy()函數(shù) 該函數(shù)完成的功能是:在視圖窗口被釋放時,用于清除當前的渲染場境,并釋放設(shè)備場境。具體實現(xiàn)代碼如下: wglMakeCurrent(NULL, NULL); wglDeleteContext(m__hglRC);清除渲染場境: ReleaseDC(m_hWnd, m_hDC);釋放設(shè)備場境 11 C. CGLView:: OnSize()函數(shù) D. CGLView:: OnTimer()函數(shù) 該函數(shù)完成的功能是:通過定時器每隔一定時間的消息驅(qū)動,來實現(xiàn)動態(tài)的場景更新。 12 3 拾取技術(shù) 拾取算法的研究可大致分為兩類 :一類是基于三維空間的射線拾取算法 ,代表算法就是基于 CPU的射線求交拾取技術(shù); 另一類是基于圖像空間的拾取算法 ,例如 :基于 GPU 的重繪式拾取技術(shù)。 基于射線求交拾取技術(shù) 其基本原理是 : 獲取屏幕坐標并轉(zhuǎn)換成圖形系統(tǒng)的視口坐標,根據(jù)不同圖形 API(應(yīng)用程序編程接口 )的實現(xiàn)給該點加上適當?shù)纳疃戎?(如 OpenGL 標準的深度值介于 01),反算出該拾取點的世界空間坐標, 將相機焦點坐標轉(zhuǎn)換為屏幕坐標,過相機位置點向鼠標選中點作一條射線 在三維空間中對射線和物體進行求交 , 離相機位置點最近的 實體就是被選中的實體 。 算法的具體實現(xiàn)步驟如下 : (1)初始化 , 獲取鼠標點的屏幕坐標 ( x, y), 并將相機焦點坐標轉(zhuǎn)換為屏幕坐標 ; (2)相機焦點深度值 (z 值 )作為鼠標點的深度值 (z 值 ),并 將鼠標點坐標轉(zhuǎn)化為世界坐標 ( XW , YW ,ZW); (3)過相機位置點向點 ( XW, YW, ZW) 作一射線 m, 并分別求射線 m 和投影空間近截面和遠截面的交點 A, B, 得到線段 AB。 如果射線 m 垂直于視線 , 則射線 m 和投影空間不相交; (4)依次取出場景實體列表中的每個實體 ,獲取該實體的轉(zhuǎn)換矩陣 , 并利用該矩陣將 A、 B 點 的坐標轉(zhuǎn)換為局 部坐標; (5)計算實體的包圍盒 , 并判斷 AB 和包圍盒的相對位置。如果 AB 和包圍盒相交 , 則求該實體和 AB交點的參數(shù)值 , 并將該實體標記為選中對象。如不相交 , 則進行下一個實體的處理。 在上述算法中,判斷線段 AB 和實體包圍盒的相對位置及線段 AB 和實體的求交是算法實現(xiàn)的關(guān)鍵。為了提高拾取速度,對傳統(tǒng)的包圍盒算法和求交算法進行了改進。 判斷線段和包圍盒的相對位置 實體的最大包圍盒是一個各表面平行于坐標平面的六面體,其左下頂點的 x、 y、 z 坐標值為實體所有頂點相應(yīng)坐標值的最小值,其右上頂點的坐標值為實體所有頂點相 應(yīng)坐標值的最大值。 采用向量法來判斷線段和包圍盒相對位置,該算法的基本思想為:將線段看成一個由起點指向終點的向量,求向量各分量和離起點最近的三個包圍盒側(cè)面所在平面的交點 ,如果各分量與平面的交點都在包圍盒側(cè)面上或者在包圍盒內(nèi)且在各分量上,則該線段和包圍盒相交 (本文中我們把線段與包圍盒相交和線段在包圍盒內(nèi)這兩種情況統(tǒng)稱為相交 )。 判斷線段與包圍盒相對位置的具體步驟如下: (1)判斷起點 A 是否在包圍盒內(nèi),如果在盒內(nèi),則線段 AB 和包圍盒相交,判斷結(jié)束;如果不在盒內(nèi),則記下該包圍盒離起點 A 最近的三個側(cè)面,這三個側(cè)面必 定共點且相互垂直; (2)過起點 A 向各側(cè)面做垂線,得到三個垂足,連接點 A 和各垂足,得到三個向量 a a a3(如 圖4 所示 ),并求 a a a3 和向量 AB 各相應(yīng)分量的比值 ti=ai/AB(i=1, 2, 3)。如果 AB 的某個分量為零,則比值取 1。取 t t t3 中的最大值為 tmax,如果 tmax0 或 tmax1,則 AB 和包圍盒不相交 ,判斷結(jié)束; (3)根據(jù) tmax 值求出交點坐標,判斷交點是否在包圍盒上。(此處最好給出交點坐標的計算式 ,以及交點是否在包圍盒上的判斷算式。)如果交點在盒上,則 AB 和包圍盒相交 ,否則, AB 和包圍盒相離。 圖 4 線段 AB 和包圍盒的位置關(guān)系圖 13 判斷線段與包圍盒相對位置的算法流程如圖 5 所示。 圖 5 向量法判斷線段和包圍盒相對位置算法流程圖 根據(jù)拾取對象的不同 , 線段和相關(guān)對象求交的方法和過程存在差別。設(shè)要和拾取對象求交的線段為 AB, 針
點擊復制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1