先贴点代码
#include "http://www.cnblogs.com/include/ogre/ExampleApplication.h" class MyApplication :public ExampleApplication { public: void createScene() { Ogre::Entity* ent = mSceneMgr->createEntity("myentity", "Sinbad.mesh"); Ogre::SceneNode* node = mSceneMgr->createSceneNode("node"); node->setPosition(10, 10, 0); mSceneMgr->getRootSceneNode()->addChild(node); node->attachObject(ent); Ogre::Entity* ent2 = mSceneMgr->createEntity("myentity2", "Sinbad.mesh"); Ogre::SceneNode* node2 = mSceneMgr->createSceneNode("node2"); node->addChild(node2); node2->setPosition(10, 0, 0); node2->pitch(Ogre::Radian(Ogre::Math::HALF_PI)); node2->attachObject(ent2); Ogre::Entity* ent3 = mSceneMgr->createEntity("myentity3", "Sinbad.mesh"); Ogre::SceneNode* node3 = mSceneMgr->createSceneNode("node3"); node3->setPosition(20, 0, 0); node->addChild(node3); node3->yaw(Ogre::Degree(90.0f)); node3->attachObject(ent3); Ogre::Entity* ent4 = mSceneMgr->createEntity("myentity4", "Sinbad.mesh"); Ogre::SceneNode* node4 = mSceneMgr->createSceneNode("node4"); node4->setPosition(30, 0, 0); node->addChild(node4); node4->roll(Ogre::Radian(Ogre::Math::HALF_PI)); node4->attachObject(ent4); } private: }; int main() { MyApplication app; app.go(); return 0; }
ogre启动时需要载入3个.cfg文件:ogre.cfg, plugins.cfg, resources.cfg。其中ogre.cfg保存了启动ogre时弹出对话框时我们选择的配置信息;plugins.cfg保存了ogre需要载入的插件信息;resources.cfg保存了一些orge启动时需要载入的资源。
mSceneMgr->createEntity(const String& entityName, const String& meshName, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
第一个参数是实体的名字,不能重复。
创建的实体要渲染出来的话,必须将其挂接到场景节点上。
The Ogre Scene Graph
场景图类似于一个树,有一个根节点,然后这个根节点有很多子节点,子节点又可以有很多子节点。若要渲染实体,需将其挂载到根节点或者根节点的子节点上去。
Ogre用的是右手坐标系。
场景节点的操作有位置变换(triple(x,y,z)),旋转(四元数quaternion),缩放(triple(x,y,z))。
需要注意的是:场景节点的变换是相对其父节点的,在其父节点的坐标空间里进行变换的。如果我们对一个父节点进行了变换,那么其所有的子节点都要受这个变换的影响。如果我们把父节点在x轴上移动10个单位,那么其所有的子节点也在x轴上移动10个单位。子节点的最终位置是用其所有父节点的坐标计算出来的。