解讀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 的數值 若要取得包含最大細節的幀,您需要合併兩個場內...