Cover王銳大大 最長的一幀(第一日)

2021-07-15 08:48:04 字數 1880 閱讀 3823

解讀list

osgviewer::viewer::viewerinit(呼叫了view::init函式)

osgviewer::view::init(初始化視景器)

osgga::eventqueue::createevent(在view::init呼叫,並建立了乙個frame型別的事件)

osgga::matrixmanipulator::init(在view::init呼叫,將新建立的frame事件和viewer物件本身為視景器例項進行相應的初始化,通過重寫並使用此方法,就能靈活的初始化自定義漫遊器的功能--此處應寫乙個漫遊器看看)

openscenegraph3.4.0版本原始碼解讀。(僅對單視景器情況)

跟隨王銳大大的最長的一幀之路,慢慢來看看這一幀中發生了什麼。

while(!viewer.done())

viewer.frame();

用乙個迴圈結構反覆的執行frame( )直到done( )函式的返回值為true為止,每執行一次frame()相當於完成了osg場景渲染的一幀。

所以首先就來看看這個frame()函式是做了什麼

當前類:

osgviewer/viewerbase.cpp

當前位置:

osgviewer::viewerbase::frame()  第666行, osgviewer::viewerbase::frame()

void viewerbase::frame(double simulationtime)

這裡就是呼叫了init()函式,再來找這個init()

這裡一開始有一點疑惑,沒有在viewer類中找到這個init()方法。實際上這裡是呼叫的父類view類裡的init()方法。

這裡我明白了,如果子類公有繼承父類,可以在子類的成員函式中直接呼叫父類的公有成員函式。像下面一

#includeusing namespace std;

class a

};class b :public a

};int _tmain(int argc, _tchar* argv)

繼續看view::init()

這裡是分割線,到王銳大大的了。

當前位置:osgviewer/view.cpp 第257行  osgviewer::view::init()

完成視景器的初始化工作。

void view::init()

}

兩個重要的類成員變數_eventqueue和_cameramanipulator。

_eventqueue:儲存該視景器的事件佇列。osgga::guieventadapter是osg中的事件的類。

_eventqueue中儲存了乙個guieventadapter的鍊錶,提供了一系列對鍊錶元素的操作函式。如createvent(),seteventtype()等

createvent():   分配和返回乙個新的guieventadapter事件的指標(ref_ptr),

seteventtype():   設定這個事件的型別為frame,即每幀都會觸發這個事件。

_cameralmanipulator視景器中所用的場景漫遊器的例項, 通常使用setcameramanipulator來設定這個變數的內容。

_cameramanipulator->init(*initevent, *this);

這個**,將新建立的frame事件,和viewer物件本身傳給_cameralmanipulator的init函式,不同的漫遊器會重寫各自的init函式,實現自己所需的初始化工作。(使用者也可以這麼做,從而得到自定義的場景漫遊器)

從檔案中取出一幀一幀的東西來

p read frame read frame yuv 函式指標賦值 得到幀的總數 這兒傳的引數,就是上面open file yuv結束前傳出的那個檔案指標 這兒通過檔案的總長度 每幀尺寸來計算得到總幀數,可以看到,檔案必須是yuv420的,如果是其它格式或者包含音訊的,是不能用此函式計算的 int...

osg自學筆記5 《最長的一幀》第12日

osg自學筆記4 最長的一幀 第12日 當前位置 osgdb databasepager.cpp osgdb databasepager databasethread run 函式 那麼,我們就得到了乙個也許可行的資料流圖,如下所示 當前位置 osgdb databasepager.cpp 第 45...

H 264學習(一) 幀和場的概念

一 何謂場?每個電視幀都是通過掃瞄螢幕兩次而產生的,第二個掃瞄的線條剛好填滿第一次掃瞄所留下的縫隙。每個掃瞄即稱為乙個場。因此 25 幀 秒的電視畫面實際上為 50 場 秒 若為 ntsc 則分別為 30 60 因為我是中國人,因此我採用 pal 的數值 若要取得包含最大細節的幀,您需要合併兩個場內...