本系列文章部分內容來源于http://ogre3d.cn
的Ogre系列教程的中文翻譯版,加上一些我自己學習時的筆記。Ogre三基石
SceneManager 場景管理器
屏幕上顯示的所有東西都有場景管理器來管理。當往場景中添加物體時,場景管理器會記錄物體的位置,當添加攝像機來觀察某個場景時,場景管理器會記錄攝像機的位置。Ogre里有多種場景管理器
Entity 實體
一個實體是可以在場景中渲染的物體之一。可以把實體理解為任何一個3D模型。一個機器人可以使一個實體,一條魚可以是一個實體,大地草原可以是一個非常大的實體。
燈光,攝像機,粒子,廣告牌等不能成為實體。 Ogre中你不能直接將一個實體放入場景中,而是將實體與場景節點綁在一起,這個場景節點則包括了實體的方位信息。
SceneNode 場景節點
場景節點將持續跟蹤與它綁在一起的實體的方位。當你創建了一個實體時,它直到與一個場景節點綁定后才會被渲染。同樣,一個場景節點也不能單獨的在屏幕上顯示出來,只有與一個實體綁定后才能在屏幕上顯示。
一個場景節點可以綁定多個實體,場景節點同樣可以和其他場景節點綁定,但是一個實體不能被多個場景節點綁定。 每個場景管理器都有一個根節點,而場景節點都是在根節點的基礎上建立,其位置總是相對于根節點的。
實踐
要創建一個實體,可以調用SceneManager的createEntity方法:
// 創建一個實體, 加載Athena網格。
Entity* entity1 = mSceneMgr->createEntity("athene1", "athene.mesh");
createEntity的第一個參數為實體指定了一個唯一的標識符,第二個參數表示要加載的資源名稱,在這里是一個名為athene的網格模型。
我們可以為這個實體代表的網格模式指定一個材質:
// 設置網格材質。
entity1->setMaterialName("Examples/Athene/NormalMapped");
創建了一個實體后,還要創建一個場景節點與它綁定起來:
// 創建一個子場景節點。
SceneNode* node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode("athene1");
與實體一樣,場景節點的名字也是唯一的,在這里是athene1。
然后將實體和場景節點綁定:
// 將實體綁定到場景節點上。
node1->attachObject(entity1);
綁定之后實體就會被渲染出來,默認情況下實體會被渲染到世界坐標的原點(0, 0, 0)處。
要改變實體在場景中的位置,可以使用與之綁定的場景節點的setPosition方法:
node1->setPosition(30, 0, 0);
這樣場景節點就相對于根節點往X軸正方向移動了10個單位。
同樣,還可以使用場景節點的translate方法達到相同的目的:
node1->translate(Vector3(30, 0, 0));
setPosition位置的改變是相對于父節點的,translate則可以設置變換相對于哪個坐標系。
要得到場景節點的父節點,可以調用getParentNode:
SceneNode* parentNode = node1->getParentSceneNode();
要得到場景節點的名稱,可以調用getName:
String nodeName = nod1->getName();
因為場景節點的移動都是相對于父節點的,所以很容易實現兩個節點一起移動:
Entity *entity1 = mSceneMgr->createEntity( "Athene1", "Athene.mesh" );
SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "AtheneNode1" );
ode1->attachObject( entity1 );
Entity *entity2 = mSceneMgr->createEntity( "Athene2", "Athene.mesh" );
SceneNode *node2 = node1->createChildSceneNode( "AtheneNode2", Vector3( 50, 0, 0 ) );
node2->attachObject( entity2 );
這樣一來,node1就成了node2的父節點,移動node1會使node2跟著一起移動,而移動node2不會影響node1。
縮放
使用場景節點可以對網格模型進行縮放:
node1->scale(1.5, 1.5, 1.5);
scale的三個參數分別對應x, y, z方向上的縮放比例,上面的例子將網格模型放大到1.5倍。
旋轉
還可以對網格模型進行旋轉,其中yaw是Y軸的旋轉,pitch是X軸的旋轉,roll是Z軸的旋轉:
node1->yaw(Degree(-90));
node1->pitch(Degree(-90));
node1->roll(Degree(-90));