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

正文內(nèi)容

osg-osgearth學(xué)習(xí)技術(shù)總結(jié)報(bào)告-在線瀏覽

2025-07-17 18:07本頁(yè)面
  

【正文】 r::Base的run,通過(guò)代碼可以看出里面就是渲染的工作,包括的功能有:realize(),frame()等。 添加事件 上面的簡(jiǎn)單的三句話程序沒(méi)有事件響應(yīng),如響應(yīng)鍵盤(pán),按下S鍵顯示幀速率,W鍵顯示網(wǎng)格等等功能。在此我們加入處理模型的幾個(gè)基本按鍵操作。vieweraddEventHandler(newosgGA::StateSetManipulator(viewergetCamera()getOrCreateStateSet()) )。然后討論了基于OSG最簡(jiǎn)單的三句話程序,并對(duì)OSG內(nèi)核結(jié)構(gòu)的原理分析和闡述,了解OSG的執(zhí)行過(guò)程,為將來(lái)的開(kāi)發(fā)和OSG編程打下基礎(chǔ)。藍(lán)色框中的部分就是這個(gè)過(guò)程。 世界坐標(biāo)系與相機(jī)坐標(biāo)系上面的式子表示,參考系中向量v在基Q中的坐標(biāo)是,在基R中的坐標(biāo)是(注意這里的環(huán)境下基矩陣是用列向量表示的,這樣相乘之后的結(jié)果表示的是基向量的線性組合)。已知一個(gè)基Q和向量v在它之中的坐標(biāo),以及另外一個(gè)基R,我們可以通過(guò)公式來(lái)計(jì)算。特別地,如果Q是和參考系相同的坐標(biāo)系(3D編程中大多數(shù)情況下如此),比如世界坐標(biāo)系,則Q是一個(gè)單位矩陣I,則我們可以把它寫(xiě)成這個(gè)坐標(biāo)轉(zhuǎn)換公式可以解釋為:對(duì)于世界坐標(biāo)系中的向量v’,它在坐標(biāo)系R中的坐標(biāo)是v’’。UVN系統(tǒng)本身是一個(gè)基。使用UVN系統(tǒng)可以非常方便的設(shè)置相機(jī)朝向。最后將計(jì)算出的U,V和N進(jìn)行單位化,就得到了相機(jī)的UVN系統(tǒng)。OpenGL的gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz)方法就是使用的上面的步驟進(jìn)行相機(jī)矩陣的設(shè)置。對(duì)于一個(gè)相機(jī)來(lái)說(shuō),它在開(kāi)始的時(shí)候和世界坐標(biāo)系是重合的,用戶控制相機(jī)在世界空間中移動(dòng)之后,相機(jī)的狀態(tài)可以用兩個(gè)屬性來(lái)描述——朝向和位置。而這兩個(gè)屬性,我們用變換的理論來(lái)描述,就是旋轉(zhuǎn)和平移。 平移與變換示意圖圖中,紅色是相機(jī)的基,而黑色是世界的基,也就是參考系。相機(jī)在移動(dòng)之前,兩個(gè)基是重合的。圖中的Rotation和Translation兩步就是相機(jī)定位時(shí)所發(fā)生的變換。而當(dāng)進(jìn)行相機(jī)變換的時(shí)候,小人應(yīng)該從世界基變換到相機(jī)的基里面。這是由Inverse Translation和Inverse Rotation兩個(gè)步驟完成的,這兩個(gè)步驟就是相機(jī)變換。我們把關(guān)系寫(xiě)出來(lái),相機(jī)本身的變換C包括兩個(gè)元素:C=RT。而相機(jī)變換是相機(jī)本身變換的逆變換:其中利用UVW系統(tǒng),做逆旋轉(zhuǎn),其實(shí)逆旋轉(zhuǎn)的目的,就是要得到目前世界坐標(biāo)中經(jīng)過(guò)逆平移的小人在相機(jī)坐標(biāo)系中的坐標(biāo)。在算法中它是通過(guò)透視矩陣乘法和透視除法兩步完成的?!?3D向量的第4個(gè)代數(shù)分量是0,如(1,2,3,0)表示向量,而3D點(diǎn)的第4個(gè)代數(shù)分量是1,如(1,2,3,1)就是點(diǎn)。從齊次坐標(biāo)轉(zhuǎn)換成普通坐標(biāo)時(shí),如果是(x,y,z,1),則知道它是個(gè)點(diǎn),變成(x,y,z)。反之亦然。有一個(gè)x,就可以求得一個(gè)y。這個(gè)時(shí)候的多邊形也許會(huì)被視錐體裁剪,裁剪被安排到規(guī)則觀察體(Canonical View Volume, CVV)中進(jìn)行,CVV是一個(gè)正方體,x, y, z的范圍都是[1,1],多邊形裁剪就是用這個(gè)規(guī)則體完成的。2) CVV裁剪完成后進(jìn)行透視除法。設(shè)P(x,z)是經(jīng)過(guò)相機(jī)變換之后的點(diǎn),視錐體由eye——眼睛位置,np——近裁剪平面,fp——遠(yuǎn)裁剪平面組成。投影面可以選擇任何平行于近裁剪平面的平面,這里我們選擇近裁剪平面作為投影平面。通過(guò)相似三角形性質(zhì)得:這個(gè)形式最大化地使用了3個(gè)信息點(diǎn),達(dá)到了最原始的投影變換的目的,我們開(kāi)始結(jié)合CVV進(jìn)行思考,把它寫(xiě)得在數(shù)學(xué)上更優(yōu)雅一致,更易于程序處理的:通過(guò)齊次坐標(biāo)變換其中矩陣就是我們投影矩陣的第一個(gè)版本。2)后面的CVV是一個(gè)x,y,z的范圍都為[1,1]的規(guī)則體,便于進(jìn)行多邊形裁剪。當(dāng)z=N時(shí),=1,當(dāng)z=F時(shí),=1,可以解出:這樣我們就得到了透視投影矩陣的第一個(gè)版本:使用這個(gè)版本的透視投影矩陣可以從z方向上構(gòu)建CVV,但是x和y方向仍然沒(méi)有限制在[1,1]中。由我們知道Nx / z的有效范圍是投影平面的左邊界值(記為left)和右邊界值(記為right),即[left, right],Ny / z則為[bottom, top]。 則我們得到了最終的投影點(diǎn):P’只變化了x和y分量的形式,az+b和z是不變的,則我們做透視除法的逆處理——給P’每個(gè)分量乘上z,得到 則我們最終得到:M就是最終的透視變換矩陣。如果在視錐體外,變換后就在CVV外。OpenGL在構(gòu)建透視投影矩陣的時(shí)候就使用了M的形式。對(duì)于投影面來(lái)說(shuō),它的寬和高大多數(shù)情況下不同,即寬高比不為1,比如640/480。這就造成了多邊形的失真現(xiàn)象,比如一個(gè)投影面上的正方形在CVV的面上可能變成了一個(gè)長(zhǎng)方形。進(jìn)行校正前提就是要使投影平面的寬高比和視口的寬高比相同。這里o是相機(jī)位置。fp是遠(yuǎn)裁剪平面,F(xiàn)是它到相機(jī)的位置。根據(jù)相似三角形定理:得到p投影之后的點(diǎn)接下來(lái)我們求出a和b 從而我們得到左手坐標(biāo)系透視投影矩陣的第一個(gè)版本M= 其中 即 ——這個(gè)時(shí)候第三個(gè)分量變換到CVV情形了,CVV的z范圍是[0,1]。xcvv和ycvv是我們需要算出的在CVV情形中的x和y,也就是我們要計(jì)算出的結(jié)果。平面投影的分類(lèi)如下:平面投影分為平行投影和透視投影兩種類(lèi)型。平行投影可以分成側(cè)投影和正交投影兩種類(lèi)型。p和q是平面外兩點(diǎn),p’和q’分別是它們?cè)谄矫嫔系耐队包c(diǎn)。實(shí)際上上面對(duì)平面投影的分類(lèi)還可以繼續(xù)向下細(xì)分,比如透視投影可以分為一滅點(diǎn)、二滅點(diǎn)以及三滅點(diǎn)透視投影。而正交投影則可以分成軸側(cè)投影以及多視點(diǎn)正交投影等等。p是觀察體中的一個(gè)點(diǎn),p’是它投影之后的點(diǎn)。我們算出a和b 》 則接著把x和y建立成CVV情形(簡(jiǎn)單的線性插值) 反推正交投影矩陣則右邊的那個(gè)矩陣就是OpenGL的正交投影矩陣,它可以通過(guò)glOrtho創(chuàng)建出來(lái)。這三種基本的操作如果是一個(gè)物體可以反映在物體上,當(dāng)然也可以反映在視口上。A 物體平移如果說(shuō)當(dāng)前物體的位置為(X,Y,Z,1),那么用一個(gè)比如名叫transform(a, b,c) 的函數(shù)其實(shí)執(zhí)行了哪些操作達(dá)到移動(dòng)后的位置是(X+a, Y+b, Z+c, 1)的效果呢?平移矩陣為:注意到,當(dāng)向量(X,Y,Z,1)與矩陣T相乘后得到結(jié)果是(X+a,Y+b,Z+c,1),因此矩陣T移為平移矩陣移動(dòng)一個(gè)點(diǎn)從一個(gè)點(diǎn)到另一個(gè),其實(shí)就是該點(diǎn)的坐標(biāo)與T相乘后得到新結(jié)果。 通常來(lái)講縮放矩陣左上33部分是不允許為負(fù)的,如果為負(fù)則被稱(chēng)為反射矩陣,這樣將會(huì)產(chǎn)生順時(shí)針排放的頂點(diǎn)序列從而產(chǎn)生很多不正確的效果,比如光照,紋理和裁切等等。D 變換疊加一般來(lái)講變換不是單一的,比如需要繞X軸旋轉(zhuǎn)120度再縮小百分之二十最后向Y軸奔跑一百米,那么該怎么計(jì)算呢,最顯然的是首先R=P*TX(120),然后再拿給定的結(jié)果R2=R*TS()依次類(lèi)推,那么結(jié)果也就是P*TX(120)*TS(),從而得出可以先把各種變換相乘之后最后再與P相乘,這樣可以省去許多操作,很簡(jiǎn)單的例子,比如需要向前走一百米,再向后走一百米,計(jì)算之后就不需要走動(dòng),只需要向后轉(zhuǎn)一百八十度就可以了,再舉個(gè)例子,旋轉(zhuǎn)六十度后再對(duì)X進(jìn)行縮百分之五十,那么現(xiàn)在縮的對(duì)應(yīng)的點(diǎn)如果先縮再旋轉(zhuǎn),是相差六十度的。 在模擬有些東西時(shí)WIN32根本無(wú)能為力,比如發(fā)送特定消息,等等,這就是MFC與WINDOWS的強(qiáng)項(xiàng)。 因此馬上必須要引入一種框架來(lái)對(duì)其進(jìn)行管理,可以選擇WINDOWS程序框架,在開(kāi)始時(shí)說(shuō)過(guò)WINDOWS程序不具有清晰性,不易于入門(mén),因此我們?cè)诒菊麻_(kāi)頭定義了一個(gè)MFC程序,在MFC程序中,我們將主要通過(guò)菜單來(lái)控制OSG程序,鍵盤(pán)消息如果使用MFC進(jìn)行攔截不做處理還將傳遞到OSG中去,下面我們以圖示來(lái)看一下OSG與MFC的具體交互過(guò)程: OSG+MFC交互示意圖從圖中可以看出,由于MFC中沒(méi)有涉及OSG的變量,因而必須有一個(gè)類(lèi)來(lái)統(tǒng)領(lǐng)OSG的全局,負(fù)責(zé)從組織結(jié)點(diǎn)一直到渲染結(jié)束的全過(guò)程,這個(gè)類(lèi)就是如圖所示的OSGFrame,MFC中代碼過(guò)多之后,內(nèi)存就會(huì)發(fā)生莫明其妙的紊亂,對(duì)于OSG來(lái)講獨(dú)立于MFC之外是十分必要的,采用一個(gè)非常平凡的接口來(lái)與MFC進(jìn)行交互。圖中從CMainFrame到view到結(jié)束,這是應(yīng)用程序的主線,而osgFrame只是程序中的支線,主線負(fù)責(zé)控制整個(gè)應(yīng)用程序,而OSG只是其控制中的一部分。MFC程序通過(guò)人為控制可以分為二種,一為控制菜單,二來(lái)通過(guò)鍵盤(pán)或是鼠標(biāo)發(fā)送消息,或者通過(guò)菜單以定時(shí)器發(fā)送消息,消息處理過(guò)程總是先由視圖類(lèi)先行處理,而后再由應(yīng)用程序框架進(jìn)行處理,而菜單則可以控制現(xiàn)有的所有的類(lèi),在多個(gè)類(lèi)中同時(shí)響應(yīng)則也會(huì)按照先視圖后框架的順序,且有些消息框架根本接收不到。這時(shí)將會(huì)出現(xiàn)MFC應(yīng)用程序歡迎向?qū)?,在概述中大概描述了該程序的基本特征,默認(rèn)是多文檔|無(wú)數(shù)據(jù)庫(kù)支持|不支持復(fù)合文檔。點(diǎn)擊下一步 MFC建立2選擇文件擴(kuò)展名為ive,電腦中所有的*.ive文檔默認(rèn)的打開(kāi)方式為你所建立的這個(gè)應(yīng)用程序。MFC是非常自由的,應(yīng)用程序配置向?qū)е皇窍蛑蠖鄶?shù)人最常用的方式來(lái)進(jìn)行配置。 點(diǎn)擊下一步在生成的類(lèi)中保持默認(rèn)選擇,不同的類(lèi)決定不同的模版,如有滾動(dòng)條,具有文檔模版等等,在這里點(diǎn)擊完成。 MFC運(yùn)行結(jié)果圖加入OSG類(lèi),在項(xiàng)目的類(lèi)視圖中,點(diǎn)擊右鍵添加類(lèi),選擇一個(gè)C++的普通類(lèi),如圖類(lèi)名為osgFrame,點(diǎn)擊完成。}COSGObject::~COSGObject(void){}void COSGObject::InitOSG(){ InitSceneGraph()。}void COSGObject::InitSceneGraph(){ mRoot = new osg::Group。 //mRootaddChild(osgDB::readNodeFile(H:/168。三168。?法164。167。186。?常161。見(jiàn)?問(wèn)168。題172。|理164。170。}void COSGObject::InitCameraConfig(){ RECT rect。 ::GetWindowRect(m_hWnd, amp。 osg::ref_ptrosg::GraphicsContext::Traits traits = new osg::GraphicsContext::Traits。 traitsx = 0。 traitswidth = 。 traitswindowDecoration = false。 traitssharedContext = 0。 traitsinheritedWindowData = windata。 osg::ref_ptrosg::Camera camera = new osg::Camera。 camerasetViewport(new osg::Viewport(traitsx, traitsy, traitswidth, traitsheight))。 mViewersetCamera(camera)。 mViewersetSceneData(mRoot)。 mViewergetCamera()setComputeNearFarMode(osg::CullSettings::COMPUTE_NEAR_FAR_USING_PRIMITIVES)。}void COSGObject::PreFrameUpdate(){}void COSGObject::PostFrameUpdate(){}void COSGObject::Render(void * ptr){ COSGObject *osg = (COSGObject*)ptr。 while(!viewerdone()) { osgPreFrameUpdate()。 osgPostFrameUpdate()。}osgViewer::Viewer *COSGObject::getViewer(){ return mViewer。 mOSG = new COSGObject(m_hWnd)。}BOOL CDigitalEarthView::OnEraseBkgnd(CDC* pDC){ if(0 == mOSG) { return CView::OnEraseBkgnd(pDC)。 } return CView::OnEraseBkgnd(pDC)。 if(mOSG != 0) delete mOSG。}void CDigitalEarthView::OnInitialUpdate(){ CView::OnInitialUpdate()。 mThreadHandle = (HANDLE)_beginthread(amp。}設(shè)置程序的依賴(lài):在項(xiàng)目點(diǎn)擊右鍵屬性,出現(xiàn)下面的窗口 設(shè)置依賴(lài)的路徑分別設(shè)置“可執(zhí)行文件目錄”、“包含目錄”、“庫(kù)目錄”,這些目錄的路徑就是自己編譯好的osg目錄的bin、include和lib目錄。 最后,ctrl+F5,運(yùn)行程序,; MFC+OSG運(yùn)行效果第五章 NodeMatrix類(lèi)實(shí)現(xiàn)OSG中對(duì)于模型的操作就是矩陣的操作,其中包括平移、旋轉(zhuǎn)、縮放。在此設(shè)計(jì)一種節(jié)點(diǎn)操作類(lèi)NodeMatrix。類(lèi)繼承圖:NodeMatrix類(lèi)中方法:NodeMatrix(voi
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1