Ogre中的基本元素
场景管理器(Ogre::SceneManager)
屏幕上出现的所有的可视化的内容都是是由Ogre::SceneManager管理,Ogre::SceneManager跟踪场景中的对象的位置和其他属性,同时,Ogre::SceneManager也管理用户添加到场景中的所有的相机,场景管理器又多种类型,目前开始一般是使用默认的Ogre::SceneManager管理,它适合绝大多数的场景中(这个之后深入学习了,再回头看)
场景节点( Ogre::SceneNode)
实体(Ogre::Entity)
Ogre::Entity是一种你可以在场景中渲染的一种对象,它是由3D mesh表示的任何东西,甚至地形对象也是非常大的Ogre::Entity,灯光、广告牌、粒子和摄像机都是场景元素的例子,它们都不是实体,Ogre使用了一种著名的设计模式,将可渲染的对象与其位置等信息分开。这意味着你不能直接在场景中放置实体。相反,您将一个SceneNode放置到您的场景中,然后将您的实体附加到该SceneNode。然后使用从SceneNode中获取的信息来呈现实体。
查看官方的原文说明:官方的tutorial
创建第一个场景
源代码
这里直接放源码之后再一一解释:
#include <OGRE/OgreRoot.h> #include <OGRE/OgreRenderSystem.h> #include <OGRE/OgreRenderWindow.h> #include <OGRE/OgreConfigFile.h> #include <OGRE/OgreResourceGroupManager.h> #include <OGRE/OgreLogManager.h> #include <OGRE/OgreViewport.h> #include <OGRE/OgreSceneManager.h> #include <OGRE/OgreMeshManager.h> #include <OGRE/OgreCamera.h> #include <OGRE/OgreLight.h> #include <OGRE/OgreEntity.h> int main(int argc, char *argv[]) {
//作为一个客户端应用程序的入口,在调用Ogre的操作时,必须先创建Root,初始化 "root" 对象是初始化 Ogre 系统的第一步 Ogre::Root *mOgreRoot = nullptr; mOgreRoot = new Ogre::Root("plugins.cfg"); //配置渲染系统的参数 Ogre::RenderSystem *mRenderSys = mOgreRoot->getRenderSystemByName("OpenGL Rendering Subsystem"); mOgreRoot->setRenderSystem(mRenderSys); mRenderSys->setConfigOption("Full Screen", "No"); mRenderSys->setConfigOption("Video Mode", "800x800 @ 32-bit colour"); //初始化整个Ogre系统(协调Ogre系统加载渲染插件以及连接到图形系统) mOgreRoot->showConfigDialog(); mOgreRoot->initialise(false); int mWindowID = 0; Ogre::NameValuePairList params; params["externalWindowHandle"] = Ogre::StringConverter::toString((int) mWindowID); Ogre::RenderWindow *mRenderWindow = nullptr; mRenderWindow = mOgreRoot->createRenderWindow("Win Ogre", 800, 800, false, ¶ms); 加载资源,该歩不能早于RenderSystem的初始化和RenderWindow的创建 Ogre::ConfigFile cf; cf.load("resources.cfg"); Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while (seci.hasMoreElements()) {
secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for (i = settings->begin(); i != settings->end(); ++i) {
typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton(). addResourceLocation(archName, typeName, secName); } } Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/programs/HLSL_Cg", "FileSystem", "Popular"); Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/programs/GLSL", "FileSystem", "Popular"); Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/textures", "FileSystem", "Popular"); Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/scripts", "FileSystem", "Popular"); Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); //创建场景管理器 Ogre::SceneManager *mSceneMgr = nullptr; mSceneMgr = mOgreRoot->createSceneManager(Ogre::ST_GENERIC); //创建灯光的场景元素s Ogre::Light *light = mSceneMgr->createLight("MainLight"); //创建场景节点(附加到根节点上) Ogre::SceneNode *lightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); //将灯光的元素附加在场景节点上 lightNode->attachObject(light); //设置灯光的位置 lightNode->setPosition(0, 300, 300); //创建一个相机元素 Ogre::Camera *mCamera = nullptr; mCamera = mSceneMgr->createCamera("myCam"); mCamera->setNearClipDistance(10); // 设置相机的近平面的距离 //创建一个场景节点 Ogre::SceneNode *mCamNode = nullptr; mCamNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); //将相机附加在场景节点上 mCamNode->attachObject(mCamera); //设置相机的位置 mCamera->setPosition(Ogre::Vector3(0, 300, 300)); //设置相机看向的方向 mCamera->lookAt(Ogre::Vector3(0, 0, 0)); //将相机加入到视口 Ogre::Viewport *mViewPort = mRenderWindow->addViewport(mCamera); //设置视口的背景颜色 mViewPort->setBackgroundColour(Ogre::ColourValue(0, 0, 0)); //设置比例(这个后期也得详细说明) mCamera->setAspectRatio( Ogre::Real(mViewPort->getActualWidth()) / Ogre::Real(mViewPort->getActualHeight())); // mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE); // mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2f, 0.2f, 0.2f)); //! [plane] Ogre::Plane plane(Ogre::Vector3::UNIT_Y, 0); //! [plane] //! [planedefine] Ogre::MeshManager::getSingleton().createPlane( "ground", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 350, 300, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_X); //! [planedefine] Ogre::Entity *groundEntity = mSceneMgr->createEntity("entGround","ground"); Ogre::SceneNode *nodeGround = mSceneMgr->createSceneNode("nodeGround"); mSceneMgr->getRootSceneNode()->addChild(nodeGround); nodeGround->attachObject(groundEntity); nodeGround->setPosition(0, -100, -100); groundEntity->setCastShadows(false); groundEntity->setMaterialName("Examples/Rockwall"); Ogre::Entity *entNinja = mSceneMgr->createEntity("entNinja", "ninja.mesh"); Ogre::SceneNode *nodeNinja = mSceneMgr->createSceneNode("nodeNinja"); mSceneMgr->getRootSceneNode()->addChild(nodeNinja); nodeNinja->attachObject(entNinja); nodeNinja->setPosition(50, -50, 0); // nodeNinja->roll(Ogre::Radian(M_PI / 20)); // nodeNinja->yaw(Ogre::Degree(180)); nodeNinja->yaw(Ogre::Radian(Ogre::Math::HALF_PI)); // nodeNinja->yaw(Ogre::Radian(M_PI / 2)); Ogre::Entity *entHead = mSceneMgr->createEntity("entHead", "ogrehead.mesh"); Ogre::SceneNode *nodeHead = mSceneMgr->createSceneNode("nodeHead"); mSceneMgr->getRootSceneNode()->addChild(nodeHead); nodeHead->attachObject(entHead); nodeHead->translate(-70, 50, -20); nodeHead->yaw(Ogre::Radian(M_PI / 4)); mOgreRoot->startRendering(); delete mOgreRoot; mOgreRoot = nullptr; }
讯享网
运行效果图
设置场景
Ogre的渲染入口:
讯享网 //作为一个客户端应用程序的入口,在调用Ogre的操作时, //必须先创建Root,初始化 "root" 对象是初始化 Ogre 系统的第一步 Ogre::Root *mOgreRoot = nullptr; mOgreRoot = new Ogre::Root("plugins.cfg");
第一个plugins.cfg我是在源码中找到并拷贝到我的编译的目录下,直接调用的,该文件的内容如下:
通过加载这个文件来加载Ogre中定义的相关插件.
设置渲染参数
//配置渲染系统的参数 Ogre::RenderSystem *mRenderSys = mOgreRoot->getRenderSystemByName("OpenGL Rendering Subsystem"); mOgreRoot->setRenderSystem(mRenderSys); mRenderSys->setConfigOption("Full Screen", "No"); mRenderSys->setConfigOption("Video Mode", "800x800 @ 32-bit colour");
这个是Ogr的配置界面,就是按照这里面的参数进行个人的配置,可以自己查看这里面的参数的含义,之后详细说.
使用Root的 initialize() 方法来初始化整个 Ogre 系统。该方法的一个重要参数是插件列表,它告诉 Ogre 系统如何加载渲染插件以及如何连接到图形系统。(重复提一下)
//初始化整个Ogre系统(协调Ogre系统加载渲染插件以及连接到图形系统)
讯享网mOgreRoot->initialise(false);
创建窗口

int mWindowID = 0; Ogre::NameValuePairList params; params["externalWindowHandle"] = Ogre::StringConverter::toString((int) mWindowID); Ogre::RenderWindow *mRenderWindow = nullptr; mRenderWindow = mOgreRoot->createRenderWindow("Win Ogre", 800, 800, false, ¶ms);
创建场景管理器
前面的准备工作做完,后面需要创建场景管理器来管理需要可视化的内容
讯享网 //创建场景管理器 Ogre::SceneManager *mSceneMgr = nullptr; mSceneMgr = mOgreRoot->createSceneManager(Ogre::ST_GENERIC);
创建灯光
灯光相机等不属于 Ogre::Entity,灯光与摄像机等场景元素跟实体的使用方法差不多,只是创建方式不同,整个代码如下(创建元素,将元素附加到场景节点上,即可生效),创建灯光中有个"MainLight"名称,这个里面肯定是以map的形式来存储的,之后只需要查询名称即可得到该灯光的相关信息以及进一步操作灯光
//创建灯光的场景元素 Ogre::Light *light = mSceneMgr->createLight("MainLight"); //创建场景节点(附加到根节点上) Ogre::SceneNode *lightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); //将灯光的元素附加在场景节点上 lightNode->attachObject(light); //设置灯光的位置 lightNode->setPosition(0, 300, 300);
创建相机
讯享网 //创建一个相机元素 Ogre::Camera *mCamera = nullptr; mCamera = mSceneMgr->createCamera("myCam"); mCamera->setNearClipDistance(10); // 设置相机的近平面的距离 //创建一个场景节点 Ogre::SceneNode *mCamNode = nullptr; mCamNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); //将相机附加在场景节点上 mCamNode->attachObject(mCamera); //设置相机的位置 mCamera->setPosition(Ogre::Vector3(0, 300, 300)); //设置相机看向的方向 mCamera->lookAt(Ogre::Vector3(0, 0, 0)); //将相机加入到视口 Ogre::Viewport *mViewPort = mRenderWindow->addViewport(mCamera); //设置视口的背景颜色 mViewPort->setBackgroundColour(Ogre::ColourValue(0, 0, 0)); //设置比例(这个后期也得详细说明) mCamera->setAspectRatio( Ogre::Real(mViewPort->getActualWidth()) / Ogre::Real(mViewPort->getActualHeight()));
创建实体
创建忍者实体
创建一个忍者,通过Ogre中已经给定的模型,进行显示,通过创建该模型的对象,附加到场景节点中可视化.这里就不详细说了
Ogre::Entity *entNinja = mSceneMgr->createEntity("entNinja", "fish.mesh"); Ogre::SceneNode *nodeNinja = mSceneMgr->createSceneNode("nodeNinja"); mSceneMgr->getRootSceneNode()->addChild(nodeNinja); nodeNinja->attachObject(entNinja);
这里通过场景点解来设置这个实体的位置,以及旋转角度,因为我把相机放在了Z轴的正方向上,所以我们看到的模型是背面,这个时候通过旋转yaw角90°,能使人看到侧面
讯享网 nodeNinja->setPosition(50, -50, 0); // nodeNinja->roll(Ogre::Radian(M_PI / 20)); // nodeNinja->yaw(Ogre::Degree(180)); nodeNinja->yaw(Ogre::Radian(Ogre::Math::HALF_PI)); // nodeNinja->yaw(Ogre::Radian(M_PI / 2));
创建恶魔头实体
创建一个ogre中的恶魔头进行显示
Ogre::Entity *entHead = mSceneMgr->createEntity("entHead", "ogrehead.mesh"); Ogre::SceneNode *nodeHead = mSceneMgr->createSceneNode("nodeHead"); mSceneMgr->getRootSceneNode()->addChild(nodeHead); nodeHead->attachObject(entHead); nodeHead->translate(-70, 50, -20); nodeHead->yaw(Ogre::Radian(M_PI / 4));
创建平面并加上纹理
讯享网//创建一个法向量为Y轴的平面 Ogre::Plane plane(Ogre::Vector3::UNIT_Y, 0); Ogre::MeshManager::getSingleton().createPlane( "ground", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane, 350, 300, 20, 20, true, 1, 5, 5, Ogre::Vector3::UNIT_X); Ogre::Entity *groundEntity = mSceneMgr->createEntity("entGround","ground"); Ogre::SceneNode *nodeGround = mSceneMgr->createSceneNode("nodeGround"); mSceneMgr->getRootSceneNode()->addChild(nodeGround); nodeGround->attachObject(groundEntity); nodeGround->setPosition(0, -100, -100); groundEntity->setCastShadows(false);
设置纹理
groundEntity->setMaterialName("Examples/Rockwall");
加载资源文件
这个是需要在相关初始化以及窗口创建之后,再进行资源的加载的
这里起先设置的时候发现没有文理,后面就查看了相关的文件,发现需要加载resource.cfg,加载这个文件之后,发现这个resource.cfg中没有相关的这些纹理的路径,所以就手动的添加了该路径
我用的是OGRE1.9,在官方的Ogre1.13貌似是已经在resource.cfg中,毕竟给的教程里面貌似没有提到这个

讯享网 //这里是加载resources.cfg中的相关资源文件的路径 /*这里貌似是从官方抄来的,也貌似是某个人的博客抄来的*/ Ogre::ConfigFile cf; cf.load("resources.cfg"); Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator(); Ogre::String secName, typeName, archName; while (seci.hasMoreElements()) {
secName = seci.peekNextKey(); Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext(); Ogre::ConfigFile::SettingsMultiMap::iterator i; for (i = settings->begin(); i != settings->end(); ++i) {
typeName = i->first; archName = i->second; Ogre::ResourceGroupManager::getSingleton(). addResourceLocation(archName, typeName, secName); } } // /这里是人为的添加了resource.cfg中没有的相关资源文件*/ Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/programs/HLSL_Cg", "FileSystem", "Popular"); Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/programs/GLSL", "FileSystem", "Popular"); Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/textures", "FileSystem", "Popular"); Ogre::ResourceGroupManager::getSingleton().addResourceLocation( "/usr/local/share/OGRE/Media/materials/scripts", "FileSystem", "Popular"); //上面加载完之后,一定要记得初始化,才能生效 Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
结束
最后附加一个官方的坐标,哈哈,方向是这样,原点感觉绘制有问题,觉得原点是在渲染窗口的正中心

刚学,后期慢慢完善,再详细说一下…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/60089.html