转自OGRE官方手册:https://ogrecave.github.io/ogre/api/latest/setup.html
Setting up an OGRE project
Note
see Guide to building OGRE for instructions how to build OGRE itself
CMake Configuration
Ogre uses CMake as its build system. It is recommended that you use it in your project as well. Then all you need is to add the following lines to your project
# specify which version and components you need
find_package(OGRE 1.11 REQUIRED COMPONENTS Bites RTShaderSystem)
# copy resource.cfg next to our binaries where OGRE looks for it
file(COPY ${OGRE_CONFIG_DIR}/resources.cfg DESTINATION ${CMAKE_BINARY_DIR})
These settings include all available components and third party libraries OGRE depends on (e.g. boost) - nothing more to do.
If you installed OGRE in a non-standard path, you will have to set OGRE_DIR
to the location of OGREConfig.cmake
so find_package
can figure out the rest.
For inspecting the detected OGRE installation, the following CMake variables are available
OGRE_STATIC
- whether ogre was build as static libOGRE_${COMPONENT}_FOUND
- ${COMPONENT} is availableOGRE_PLUGIN_DIR
- The directory where the OGRE plugins are locatedOGRE_MEDIA_DIR
- The directory where the OGRE sample media is locatedOGRE_CONFIG_DIR
- The directory where the OGRE config files are located
Application skeleton
The easiest way to get started is the OgreBites Component. It handles Ogre startup/ tear down (including Ogre::Overlay, RTSS), input using SDL2 and even includes a Simple GUI System.
This is useful if all you want is to get a Scene with a FPS counter up and running (rapid prototyping). If available it also uses SDL2 for input - you now just have to implement the callbacks.
To use it, simply derive from OgreBites::ApplicationContext and if you want to get input events from OgreBites::InputListener
class MyTestApp : public OgreBites::ApplicationContext, public OgreBites::InputListener
{
...
}
in the constructor we set our application name. The ogre configuration files will be stored in a system dependant location specific to our app.
MyTestApp::MyTestApp() : OgreBites::ApplicationContext("OgreTutorialApp")
{
}
to handle input events, we then override the according method
bool MyTestApp::keyPressed(const OgreBites::KeyboardEvent& evt)
{
if (evt.keysym.sym == OgreBites::SDLK_ESCAPE)
{
getRoot()->queueEndRendering();
}
return true;
}
the interesting part however is the setup method
void MyTestApp::setup(void)
{
// do not forget to call the base first
OgreBites::ApplicationContext::setup();
// register for input events
addInputListener(this);
// get a pointer to the already created root
Ogre::Root* root = getRoot();
Ogre::SceneManager* scnMgr = root->createSceneManager();
// register our scene with the RTSS
Ogre::RTShader::ShaderGenerator* shadergen = Ogre::RTShader::ShaderGenerator::getSingletonPtr();
shadergen->addSceneManager(scnMgr);
// without light we would just get a black screen
Ogre::Light* light = scnMgr->createLight("MainLight");
Ogre::SceneNode* lightNode = scnMgr->getRootSceneNode()->createChildSceneNode();
lightNode->setPosition(0, 10, 15);
lightNode->attachObject(light);
// also need to tell where we are
Ogre::SceneNode* camNode = scnMgr->getRootSceneNode()->createChildSceneNode();
camNode->setPosition(0, 0, 15);
camNode->lookAt(Ogre::Vector3(0, 0, -1), Ogre::Node::TS_PARENT);
// create the camera
Ogre::Camera* cam = scnMgr->createCamera("myCam");
cam->setNearClipDistance(5); // specific to this sample
cam->setAutoAspectRatio(true);
camNode->attachObject(cam);
// and tell it to render into the main window
getRenderWindow()->addViewport(cam);
// finally something to render
Ogre::Entity* ent = scnMgr->createEntity("Sinbad.mesh");
Ogre::SceneNode* node = scnMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(ent);
}
Note
The above code is explained in detail in Your First Scene.
finally we start everything as
int main(int argc, char *argv[])
{
MyTestApp app;
app.initApp();
app.getRoot()->startRendering();
app.closeApp();
return 0;
}
Note
You can find the full code of the above example at
Samples/Tutorials/Bootstrap.cpp
for C++Samples/Python/bites_sample.py
for PythonSamples/AndroidJNI/MainActivity.java
for Java (Android)
OgreBites itself is also a good starting point if you need more control over the Camera or the Window creation. For instance to render into an existing Qt Window.