在上一個範例中,你只產生了一個黑摸摸的視窗,現在你可以先在上個範例中插入以下的內容
RenderWindow *render_win =
root->createRenderWindow( "Hello, Ogre!", 320, 240, false);//上個範例產生視窗的程式
//接下來是要插入的內容
SceneManager *scene_mgr = root->createSceneManager( ST_GENERIC );
Camera *camera = scene_mgr->createCamera( "MainCamera" );
Viewport *viewport = render_win->addViewport( camera );
viewport->setBackgroundColour( ColourValue::Black );
camera->setAspectRatio( Real( viewport->getActualWidth() ) / Real( viewport->getActualHeight() ) );
camera->setNearClipDistance( 1 );
camera->setFarClipDistance( 1000 );
camera->setFOVy( Degree( 45 ) );
camera->setPosition( 0, 0, 500 );
MaterialPtr mtl = MaterialManager::getSingleton().create( "ManualObjNoLighting", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
mtl->setLightingEnabled( false );
ManualObject* manual =scene_mgr->createManualObject( "triangular_face" );
manual->begin( "ManualObjNoLighting", RenderOperation::OT_TRIANGLE_LIST );
manual->position(-100.0, 100.0, 0.0);
manual->position(-100.0, -100.0, 0.0);
manual->position( 100.0, -100.0, 0.0);
manual->end();
scene_mgr->getRootSceneNode()->attachObject( manual );
//插入內容結束
root->startRendering();//上個範例開始渲染視窗的程式
插入程式後按下F5,你將會看到如下的白色三角形出現在視窗裡
恭喜!你已經能在OGRE場景中放置物件並渲染到視窗了~~~,接下來開始解說
/**** **** **** **** **** **** **** ****/
2TH:
SceneManager SceneManager掌控3D場景中所有的物件(的生殺大權),透過一個樹狀的結構管理物件的相對關係,Ogre支援多個SceneManager,可以同時管理不同類型的場景。
記得我們說過,SceneManager是OGRE的子系統,而Root則表示OGRE本身,所以創建一個自然是從Root要囉,剛才插入的第一行程式
SceneManager *scene_mgr = root->createSceneManager( ST_GENERIC );
即是做此動作,ST_GENERIC表示我們要創建的是一個"一般性"的SceneManager(其他類型的設定可以從OGRE Wiki上面找到),不過單有SceneManager是不夠的,接下來
/**** **** **** **** **** **** **** ****/
3TH:Camera以及Viewport
事實上,OGRE在生成畫面時首先需要一個Scene(也就是SceneManager結構中所有物件的集合),然後需要一個Camera,正如字面上的,Camera會"拍"Scene,而視窗顯示的內容其實就是Camera拍到的內容,下一行程式創造了一個Camera物件,名為"MainCamera"
Camera *camera = scene_mgr->createCamera( "MainCamera" );
另外,這個字串"MainCamera"是OGRE用來搜尋物件、資源時使用的標籤,由於使用Map結構提昇搜尋效能,這個字串是絕對不能重複的,否則OGRE會不爽給你看,所以命名要注意
然後,只是把Camera架起來是不夠的,你還需要指定Camera要看得方向、視角才行,ViewPort即是為一個Camera描述其真正顯示在視窗中的部份,所以接下來的
viewport *viewport = render_win->addViewport( camera );
viewport->setBackgroundColour( ColourValue::Black );
為render(即視窗)加入一個綁定在camera物件上的 viewport物件,並將其所視範圍的背景色設定成黑色,另外,viewport預設使用跟視窗大小相同的寬、高,然後再為camera設定其他屬性
camera->setAspectRatio( ...); #投影平面的縱橫比,通常等同viewport
camera->setNearClipDistance( 1 ); #近端截面的位置,設定成最近看到1單位距離
camera->setFarClipDistance( 1000 ); # 遠端截面的位置,設定成最遠看到1000單位距離
camera->setFOVy( Degree( 45 ) ); #相機的視角,使用弧度制
camera->setPosition( 0, 0, 500 ); #相機的位置,注意OGRE使用右手座標
場景已經搭好了,接下來輪到加入主角ManualObject了
/**** **** **** **** **** **** **** ****/
4TH:ManualObject
通常在OGRE我們會使用資源檔來建立模型,可是非常簡單的點線、面我們可以在程式中用ManualObject來產生,用法很像OpenGL
在建立ManualObject之前我們需要為他準備材質,材質表示物件反射光的方式,以下的程式建立了一個屬性是"不使用燈光"的材質
MaterialPtr mtl = MaterialManager::getSingleton().create( "ManualObjNoLighting", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
mtl->setLightingEnabled( false );
接著終於可以來建立ManualObject了,首先設定一個由scene_mgr管理,名為"triangular_face"的ManualObject物件
ManualObject* manual = scene_mgr->createManualObject( "triangular_face" );
在設定其材質,以及造型,由於是三角所以填入3個點 ,注意點的座標順序必須是逆時針(玩過OpenGL的人有福了),顏色預設是白色
manual->begin( "ManualObjNoLighting", RenderOperation::OT_TRIANGLE_LIST );
manual->position(-100.0, 100.0, 0.0);
manual->position(-100.0, -100.0, 0.0);
manual->position( 100.0, -100.0, 0.0);
manual->end();
OK...但是還差一步,我們剛才只設定manual是由scene_mgr管理,要讓manual能被顯示,還必須讓他加到scene_mgr的"場景"裡,以下
scene_mgr->getRootSceneNode()->attachObject( manual );
就是把manual綁進場景節點的函式,然後就結束囉~~~,到此就是剛才能讓你看到白色三角形的程式碼的基本解說,如果你覺得白色太單調的話,可以把建立manual的程式碼改成下面的
ManualObject* manual = scene_mgr->createManualObject( "triangular_face" );
manual->begin( "ManualObjNoLighting", RenderOperation::OT_TRIANGLE_LIST );
manual->position(-100.0, 100.0, 0.0);
manual->colour( ColourValue::Red ); // ColourValue( 1, 0, 0 );
manual->position(-100.0, -100.0, 0.0);
manual->colour( ColourValue::Green ); // ColourValue( 0, 1, 0 );
manual->position( 100.0, -100.0, 0.0);
manual->colour( ColourValue::Blue ); // ColourValue( 0, 0, 1 );
manual->end();
那麼你就可以看到彩色的三角形囉~~~
END:





































