Üksikasjalik OGRE käivitamise protsess (OGRE HelloWorld programmi põhimõtte analüüs)
Detailed Ogre Startup Process
Selles artiklis kirjeldatakse programmi OGRE 3D 1.9 käivitamisprotsessi alates programmi käivitamisest kuni 3D-graafika renderdamiseni ja seda, milline OGRE-ga seotud kood selle taga käivitatakse. Käsitletavate OGRE-klasside hulka kuuluvad:
- Juur
- RenderSystem
- RenderWindow
- ResourceGroupManager
- LogManager
- Vaateaken
- SceneManager
- Kaamera
- SceneNode
- Üksus
- Valgus
Seda artiklit soovitatakse lugeda OGRE API viide OGRE ametlikul API-viitel pole klassi koostööskeemi, API-dokumentatsiooni loomiseks võite kasutada Doxygen-i, vt: Bullet õppematerjalid (API dokumentatsiooni loomine Doxygeniga) 。
Juhised OGRE installimise ja toimiva OGRE HelloWorld programmi konfigureerimise kohta: OGRE 1.9 esimene programm (OGRE HelloWorld programm) 。
Selles jaotises on kogu kood järgmine, saate kiiresti sirvida ja vaadata hiljem üksikasjalikku selgitust, mida hiljem kasutatakse. Käivitamiskood Sellele koodile viitamiseks toimige järgmiselt.

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 13 int main(int argc, char *argv[]) 14 { 15 Ogre::Root* mRoot 16 Ogre::RenderWindow* mWindow 17 Ogre::SceneManager* mSceneMgr 18 Ogre::Camera* mCamera 19 20 // Create Root, you must have created Root before calling any function of OGRE 21 mRoot = new Ogre::Root('plugins.cfg','ogre.cfg','Ogre.log') 22 23 // Set RenderSystem 24 Ogre::RenderSystem *rs = 25 mRoot->getRenderSystemByName('OpenGL Rendering Subsystem') 26 mRoot->setRenderSystem(rs) 27 rs->setConfigOption('Full Screen', 'No') 28 rs->setConfigOption('Video Mode', '800x600 @ 32-bit colour') 29 // Another way is: if(!mRoot->showConfigDialog()) return false 30 31 // Initialize RenderSystem 32 mRoot->initialise(false) 33 34 // Create RenderWindow 35 int hWnd = 0 36 Ogre::NameValuePairList misc 37 misc['externalWindowHandle'] = Ogre::StringConverter::toString((int)hWnd) 38 mWindow = mRoot->createRenderWindow('Win Ogre', 800, 600, false, &misc) 39 // Another implementation of the last 2 steps is: mWindow = mRoot->initialise(true, 'Win Ogre') 40 41 // Create a SceneManager to bind the render target to the RenderWindow 42 mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC) 43 // Create one camera 44 mCamera = mSceneMgr->createCamera('PlayerCam') 45 mCamera->setNearClipDistance(5) 46 // Create one viewport, entire window 47 Ogre::Viewport* vp = mWindow->addViewport(mCamera) 48 vp->setBackgroundColour(Ogre::ColourValue(0,0,0)) 49 // Alter the camera aspect ratio to match the viewport 50 mCamera->setAspectRatio( 51 Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight())) 52 53 // Load the resource, this can not be earlier than the initialization of RenderSystem and the creation of RenderWindow 54 // If you use OverlaySystem, this can't be created earlier than OverlaySystem 55 Ogre::ConfigFile cf cf.load('resources.cfg') 56 Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator() 57 Ogre::String secName, typeName, archName 58 while( seci.hasMoreElements() ){ 59 secName = seci.peekNextKey() 60 Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext() 61 Ogre::ConfigFile::SettingsMultiMap::iterator i 62 for( i=settings->begin() i!=settings->end() ++i ){ 63 typeName = i->first 64 archName = i->second 65 Ogre::ResourceGroupManager::getSingleton(). 66 addResourceLocation(archName, typeName, secName) 67 } 68 } 69 Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups() 70 71 // Construct and set the scene 72 mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE) 73 mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2f, 0.2f, 0.2f)) 74 75 Ogre::Entity* entNinja = mSceneMgr->createEntity('entNinja', 'ninja.mesh') 76 Ogre::SceneNode* nodeNinja = mSceneMgr->createSceneNode('nodeNinja') 77 mSceneMgr->getRootSceneNode()->addChild(nodeNinja) 78 nodeNinja->attachObject(entNinja) 79 Ogre::Entity* entSphere = mSceneMgr->createEntity('entSphere', 'sphere.mesh') 80 Ogre::SceneNode* nodeSphere = mSceneMgr->createSceneNode('nodeSphere') 81 mSceneMgr->getRootSceneNode()->addChild(nodeSphere) 82 nodeSphere->attachObject(entSphere) 83 nodeNinja->setPosition(-50,-100,0) 84 nodeSphere->translate(50,0,100) 85 Ogre::Light* pointLight1 = mSceneMgr->createLight('pointLight1') 86 pointLight1->setType(Ogre::Light::LT_POINT) 87 pointLight1->setDiffuseColour(Ogre::ColourValue::White) 88 pointLight1->setSpecularColour(Ogre::ColourValue::White) 89 pointLight1->setPosition(-400,200,-200) 90 91 mCamera->setPosition(Ogre::Vector3(0,0,-250)) 92 mCamera->lookAt(Ogre::Vector3(0,0,0)) 93 94 // rendering loop 95 Ogre::LogManager::getSingleton().logMessage('>>Rendering') 96 mRoot->startRendering() 97 98 // Release resources, currently only need to release Root 99 delete mRoot 100 101 return 0 102 }

Käivita tulemuse ekraanipilt:
1. Käivitamisprotsessi ülevaade
Vaatame lühidalt OGRE käivitamist. OGRE WIKI algõpetus 6: Ogre käivitusjärjestus Väljavõtke järgmine lõik. Pange tähele, et see erineb ülaltoodud koodist ('käivituskood'), sammude järjekord on erinev:
Ogre põhiline elutsükkel näeb välja selline:
- Looge juurobjekt.
- Määratlege ressursid, mida Ogre kasutab.
- Valige ja seadistage RenderSystem (see tähendab DirectX, OpenGL jne).
- Looge RenderWindow (aken, milles Ogre elab).
- Alustage ressursse, mida kavatsete kasutada.
- Nende ressursside abil saate luua stseeni.
- Seadistage mis tahes kolmanda osapoole teegid ja pistikprogrammid.
- Looge suvaline arv kaadrikuulajaid.
- Käivitage renderdamise silmus.
Üldiselt on esmane lähtestamine ja lõpuks alustatakse renderdamissilmus. Võtan kokku kõigi nende klasside seose, nagu allpool näidatud (mitte UML-diagramm, ma saan sellest aru):
Pärast järgnevate üksikasjalike selgituste lugemist võite minna tagasi ja seda lõiku vaadata, siis jääb üldmulje OGRE algusest.
kaks. Loo juur
Enne OGRE mis tahes funktsiooni kutsumist peate kõigepealt installeerima juurklassi, mis osutab otse või kaudselt kõigi teiste klasside eksemplaridele. OGRE-programmil on üks ja ainult üks juurobjekt, nii et juurklass kasutab Singleton Kujundusrežiim (üksikrežiim, päritud Singletonilt). Singletonist rääkides on paljud OGRE klassid Singleton, millest tuleb juttu hiljem.
Juurklassi konstruktori prototüüp on järgmine:
Root (const String &pluginFileName='plugins'OGRE_BUILD_SUFFIX'.cfg', const String &configFileName='ogre.cfg', const String &logFileName='Ogre.log')
Makro OGRE_BUILD_SUFFIX määratletakse tühjaks jaotises Tühi ja silumise all '_d'. Kolm parameetrit on kolm failinime.
pluginFileName on Pistikprogrammi konfiguratsioonifail , fail näitab, milliseid pluginaid OGRE laadib, plugins.cfg-faili näide on järgmine, kus # :

# Defines plugins to load # Define plugin folder PluginFolder=. # Define plugins # Plugin=RenderSystem_Direct3D9 Plugin=RenderSystem_GL Plugin=Plugin_ParticleFX Plugin=Plugin_BSPSceneManager Plugin=Plugin_CgProgramManager Plugin=Plugin_PCZSceneManager Plugin=Plugin_OctreeZone Plugin=Plugin_OctreeSceneManager

fail configFileName Seadistage renderdamissüsteem (OpenGL või Direct3D) ja selle parameetrid, näiteks Anti-Aliased Samples (FSAA), näide OpenGL-draiverite konfiguratsioonifailist ogre.cfg on järgmine:

Render System=OpenGL Rendering Subsystem [OpenGL Rendering Subsystem] Colour Depth=32 Display Frequency=N/A FSAA=8 Fixed Pipeline Enabled=Yes Full Screen=No RTT Preferred Mode=FBO VSync=No VSync Interval=1 Video Mode=1024 x 768 sRGB Gamma Conversion=No

Fail logFileName on programm OGRE. Logifail OGRE programmis saate logi kirjutamiseks sisestada koodi ja logifail on mugav OGRE programmi silumiseks. Logifaili teavet kirjutava koodi näide on järgmine:
Ogre::LogManager::getSingleton().logMessage('>>Rendering')
siin LogManager Kas teine klass kasutab Singletoni kujundusmustrit, mis kasutab globaalselt ainulaadse klassieksemplari saamiseks staatilist meetodit getSingleton.
Käivituskoodi juurobjekti loomiseks mõeldud kood on real 21:
mRoot = new Ogre::Root('plugins.cfg','ogre.cfg','Ogre.log')
3. Seaded RenderSystem, lähtestamine
Klass RenderSystem võtab kokku renderdamissüsteemi (aluseks oleva OpenGL või Direct3D), mis on samaväärne renderdava seadmega. Lihtsaim viis RenderSystemi eksemplari juurte lisamiseks on kutsuda meetod Ogre :: Root :: showConfigDialog. Käitusaeg ilmub dialoogiboks, mis võimaldab kasutajal valida, millist graafikadraiverit kasutada ja vastavad parameetrid:
if(!mRoot->showConfigDialog()) return false
Selles dialoogis tehtud seadistused salvestatakse failis ogre.cfg (vt ülalt osa 2.). Seda saab programmis seadistada ka ilma dialoogiboksi kasutamata, see tähendab, et dialoogiboksis valitud üksused määratakse programmis:
Ogre::RenderSystem *rs = mRoot->getRenderSystemByName('OpenGL Rendering Subsystem') mRoot->setRenderSystem(rs) rs->setConfigOption('Full Screen', 'No') rs->setConfigOption('Video Mode', '800x600 @ 32-bit colour')
Alglaadimiskood kasutab viimast ja kood on ridadel 24–27.
Kui te ei soovi renderdamissüsteemi valimiseks dialoogiboksi iga kord hüpata, võite kasutada järgmist koodi:
if( !(mRoot->restoreConfig() || mRoot->showConfigDialog()) ) return false
Meetod restoreConfig loeb dialoogisätete asemel faili ogre.cfg. Pidage meeles C / C ++ loogikaoperatsiooni avaldise hindamise lühis olemust. Kui mRoot-> restoreConfig () tagastab true (fail Theogre.cfg on olemas), ei käivitata mRoot-> showConfigDialog ().
RenderSystemi objekt tuleb pärast selle loomist lähtestada. Ogre :: Root :: initsialiseerimise (bool, const String, const String) meetod on root RenderSystem initsialiseerimine. Kui esimene bool-parameeter vastab tõele, luuakse aken automaatselt. Käivitamiskood pole saadaval. Selleks tehke rida 31:
mRoot->initialise(false)
Lisaks on OGRE kõrgetasemeline 3D-graafikakogu, mis on platvormidevaheline kõrgetasemeline abstraktsioon. See abstraktsioon võimaldab kasutajatel mitte hoolida aluseks olevast tehnoloogiast (näiteks OpenGL või Direct3D, Win32 või Xwindow), kuid programmi Execution kasutab paratamatult aluseks olevaid funktsioone (näiteks konkreetsed renderdamisülesanded peavad olema OpenGL või Direct3D käivitamine). OGRE (või paljud muud avatud lähtekoodiga teegid) teeb seda nii: kasutajad kasutavad OGRE-ga suhtlemiseks baasklassi (näiteks RenderSystem ja RenderWindow) liideseid. Koodi käivitamisel kutsub programm automaatselt vastava alamklassi juurutamist käsu täitmiseks vastavalt süsteemi konfiguratsioonile. (Selle põhjuseks on objektorienteeritud pärimine ja polümorfism). RenderSystemi klassi pärandskeem on järgmine:
Meie jaoks kasutame OpenGL-i graafika draiverit, nii et kui programm on täidetud, kasutatakse GLRenderSystemi tegelikku juurutamist. Tegelikult on RenderSystem abstraktne klass, mida ei saa instantsida.
Neli. Loo RenderWindow
RenderWindow on renderdamistulemuste kuvamiseks kasutatava akna abstraktsioon (võrguühenduseta renderdamiseks või tekstuuriks renderdamiseks pole vaja akent). Lihtsaim viis akna loomiseks on esimese argumendina tõene, kui helistate meetodile Ogre :: Root :: initsialiseerimine:
mWindow = mRoot->initialise(true, 'Win Ogre')
Kuid käivituskood kasutab koodi selguse huvides meetodit RenderWindow käsitsi loomiseks:
int hWnd = 0 Ogre::NameValuePairList misc misc['externalWindowHandle'] = Ogre::StringConverter::toString((int)hWnd) mWindow = mRoot->createRenderWindow('Win Ogre', 800, 600, false, &misc)
Pange tähele, et eespool kasutatud klassi NameValuePairList kasutatakse parameetrite koostamiseks. Nagu olete märganud, kasutavad paljud OGRE parameetrid stringi andmetüüpi.
5. Looge SceneManager , seo renderdamise sihtmärk RenderWindow'iga
SceneManageri klass haldab OGRE stseenigraafikut. Ogre 3D 1.7 algajate juhendi 6. peatükk võtab SceneManageri funktsioonid kokku kahel viisil:
- Hallake objekte sellistes stseenides nagu Kaamera, SceneNode, Entity, Light jne. Tehase loomise meetodite loomiseks, näiteks createEntity (), createLight () (vastutab ka nende vabastamise eest)
- Stseenigraafikute haldamine, sealhulgas stseenipuu kättesaadavuse säilitamine, sõlmede informatsiooni Transform arvutamine ja Cullingu peitmine.
SceneManager pole Singleton. Rootist saate luua ühe (või mitu) SceneManagerit. Käivitamiskoodi 41. rida loob SceneManageri üldise tüübi:
mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC)
SceneManageri abil saate sellest tehasest luua stseenobjekte, peamiselt Camera, SceneNode, Entity, Light, ehitada stseen (ehitada stseenipuu) ja jätta see tagaküljele, siin kaamera ja RenderWindowi suhe.
Kaamera on meedium stseenist kuni akna väljundini. Ta vastutab 3D-stseeni 2D-akna kaardistamise eest. See kaardistamine hõlmab teist klassi vaateava. Vaade avab kaamera „pildistamise” tulemuse akna kõigi joonistatavate alade ristkülikule. jaotises. Juuril võib olla mitu SceneManagerit ja SceneManageril võib olla mitu kaamerat, kuid iga kaamera jaoks on vaja akna ristkülikukujulisele alale vastavat vaateava. Nüüd peaksite teadma, kuidas juhtida stseeni erinevaid vaatenurki või mitut stseeni akna erinevatesse aladesse.
Kaamera loomiseks käivituskoodis olev kood on real 43:
mCamera = mSceneMgr->createCamera('PlayerCam') mCamera->setNearClipDistance(5)
See määrab kaamera kaamera peaaegu kärpimistasandi. Vaade 'Startup Code' loomiseks kuvatav kood on real 46:

// Create one viewport, entire window Ogre::Viewport* vp = mWindow->addViewport(mCamera) vp->setBackgroundColour(Ogre::ColourValue(0,0,0)) // Alter the camera aspect ratio to match the viewport mCamera->setAspectRatio( Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()))

See määrab ka vaatepordi taustavärvi ja kaamera kuvasuhte. AddViewport on RenderWindow meetod ja see võtab parameetriks kaamera, ühendades seeläbi RenderWindow ja Camera, nagu me analüüsisime. Lisaks on meetodil addViewport muid parameetreid, et määrata, millises akna piirkonnas kuvavaade asub. Ülaltoodud kood kasutab vaikeparameetreid, mis tähendab, et vaateava vastab kogu aknale.
Nagu 4. jao lõpus öeldud, on RenderWindow abstraktne klass. Konkreetsed akendega seotud funktsioonid rakendatakse tegelikult alaklasside kaupa. Windowsis on see alaklass Win32Window.
6. Ressursside laadimine
OGRE ressursifailid on OGRE funktsioon. Levinumad ressursifailid on Mesh (.mesh) ja Material (.material). Pange tähele, et Mesh on renderdatav objekt, mitte ainult võrk. Materjali määratlust saab muuta. Kõik objekti omadused, välja arvatud geomeetriline teave, võivad olla piiranguteta värvid, tekstuurid, varjundid või midagi muud.
Ressursifailide üks eelis on see, et pärast objekti välimuse muutmist pole vaja programmi uuesti kompileerida. Kui kirjutate objekti tippandmed koodi, kompileerite muidugi uuesti. Ressursifailide puuduseks on see, et programm sõelub ressursifailid (analüüsiskriptid) käivitamisel, mis pikendab programmi käivitamise aega, mistõttu HelloWorldi programmil on graafika nägemiseks mõni sekund. Teine puudus algajatele võib algselt olla risttahuka joonistamine, kuid OGRE-s peate looma võrgusilma ressursid. Muidugi on OGRE 3D-mootor, mis ei piirdu 3D-mängudega. Võimas ressursside haldamise võime võib arendustegevuse tõhusust oluliselt parandada. Tuleb öelda, et programmikoodi lihtsuse toob ressursifailide keerukus.
Ressursifailide OGRE-töötlemise kohta leiate üksikasju: Ressursid ja ResourceManagers Ressursi kasutamiseks väljaspool programmi definitsiooni (st skripti definitsiooni) peate:
- Lisage kataloog ResourceGroupManager :: addResourceLocation, kasutades ressurssifaili asukohta.
- Deklareerige ressursid meetodiga ResourceGroupManager :: declareResource, valikuline
- Alustage ressurssifaili skript lisatud kataloogis meetodiga ResourceGroupManager :: initialiseResourceGroup või ResourceGroupManager :: initialiseAllResourceGroups
- Vaikimisi laaditakse ressursifaili andmed alles siis, kui ressurssi kasutatakse. Näiteks tekstuuripilti ei laadita tekstuuri määratlemisel, vaid see laaditakse mällu tekstuuri esmakordsel kasutamisel. Seda saab käsitsi kutsuda ka ResourceGroupManager :: loadResourceGroup. .
„Startup Code” ülaltoodud esimene samm vastab järgmisele koodile, mis asub ridadel 54–67:

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) } }

'Resources.cfg' on ressursifaili nimi ja faili sisu on järgmine (lühiduse huvides mõned kustutatakse):

# Resources required by the sample browser and most samples. [Essential] Zip=../../media/packs/SdkTrays.zip Zip=../../media/packs/profiler.zip FileSystem=../../media/thumbnails # Common sample resources needed by many of the samples. # Rarely used resources should be separately loaded by the # samples which require them. [Popular] FileSystem=../../media/fonts FileSystem=../../media/models Zip=../../media/packs/cubemap.zip Zip=../../media/packs/cubemapsJS.zip [General] FileSystem=../../media # Materials for visual tests [Tests] FileSystem=../../media/../../Tests/Media

Ogre :: ConfigFile on ressursside konfiguratsioonifailide sõelumise abiklass, sarnane XML-i sõelumisele ja koodide vastavusele. Olulised, populaarsed ja populaarsed on secName. Selle grupi jagab OGRE ressursside haldamise hõlbustamiseks. Iga sätte vorming. On: typeName = archName (parameetri tüüp = parameetri väärtus).
Pange tähele järgmist koodi:
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName)
OGRE-l on palju xxxManageri klasse, mis vastutavad konkreetsete asjade haldamise eest, näiteks ResourceGroupManager pakub ressursirühmadel toiminguid, LogManager kirjutab logifaile, SceneManager stseenigraafikuid ja palju muud. Paljud neist halduritest, näiteks LogManager ja ResourceGroupManager, kasutavad Singletoni kujundusmustrit ja võivad globaalselt ainulaadse eksemplari saamiseks staatilist meetodit kutsuda getSingleton. SceneManager ei ole siiski üksikrežiim, kuna juurel võib olla mitu stseenigraafikut (stseenipuud).
Käivitamiskoodis oleva deklareerimisressursi kood on real 68 järgmine:
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups()
Siin on lihtne ja ebaviisakas viis kõigi ressursikataloogi skriptide lahendamiseks. Pole ime, et programm peab pärast programmi käivitamist nii kaua ootama.
Pange tähele, et deklareerida ressurssi ei saa teha liiga vara. Näiteks ei saa see olla varasem kui RenderSystemi initsialiseerimine ja RenderWindowi loomine. Kui kasutate OverlaySystemi, ei saa te seda varem luua kui OverlaySystem. Põhjus on sama, mida analüüsiti 3. jaos, sest ressursi lahutamist rakendab spetsiaalselt alaklass. Enne RenderSystemi ja RenderWindowi kasutatava alamklassi kindlakstegemist on võimatu kindlaks teha, millist sõelumisressursi alamklassi kasutada. Näiteks RenderSystem GLRenderSystemi või D3D9RenderSystemi erinevates alaklassides kasutatakse erinevaid tekstuuri parsimise klasse, nagu allpool näidatud:
Siiani peaksite mõistma failide plugins.cfg, ogre.cfg, Ogre.log, resources.cfg rolli.
7. Stseenipuu ehitamine
Praegu kasutavad enamus 3D-graafika teeke Scene Graph tehnoloogiat, mis kasutab stseenipuu kõigi stseenide objektide korraldamiseks. Stseenipuu sõlmed võib jagada kahte tüüpi: oksa- ja lehesõlmed. Haru sõlm SceneNode (päritud Node'ilt) vastutab peamiselt ruumilise asukoha muutuste eest. Lehesõlmed võivad olla: Entiteet (joonistatav entiteet), valgus, kaamera jne. Stseenipuu puhul on kõige olulisem mõista seda, et lehesõlme objekti lõplik asukoht maailma koordinaatides määratakse vanema kaskaadiga sõlmed. Allpool on näidatud tüüpiline stseenipuu:
Entity3 maailmakoordinaadid määravad ühiselt Node5, Node4 ja Node2 (maailma koordinaatide arvutamise meetodit saab muuta). Igal sõlmel on mõned ruumilise muundamise meetodid: setPosition, setOrientation, setScale, translate, rotate, scale, kus esimesed kolm on ülekatte modifikatsioonid ja viimased kolm on inkrementaalsed modifikatsioonid. Kasuta Ogre :: sõlme :: addChild Meetod kahe sõlme ühendamiseks, kasutades Ogre :: SceneNode :: attachObject Meetod ühendab sõlme ja lehesõlmi. Ülaltoodud pildil on segane koht: kas Light1 tegutseb ainult Node4 alampuul? Vastus on eitav, Light1 mõjub kogu stseenipuule ja Camera1 on sarnane. Valgus ja kaamera mõjutavad alati kogu stseenipuud ning selle kõrgem sõlm mängib ainult oma maailmakoordinaatide muutmise rolli.
Pange tähele, et saadaoleval stseenipuul ei saa olla silmuse rada. Nagu allpool olevast stseenipuust nähtub, loob OGRE programm selle käivitamisel erandi:
Võite helistada Ogre :: SceneManager :: setShadowTechnique Varju määramise meetod, Ogre :: SceneManager :: setSkyBox Taeva seadmise meetod, Ogre :: SceneManager :: setFog Uduefekti määramise meetod.
„Käivitamiskood” loob lihtsa stsenaariumi koodiga ridadele 71–91:

mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE) mSceneMgr->setAmbientLight(Ogre::ColourValue(0.2f, 0.2f, 0.2f)) Ogre::Entity* entNinja = mSceneMgr->createEntity('entNinja', 'ninja.mesh') Ogre::SceneNode* nodeNinja = mSceneMgr->createSceneNode('nodeNinja') mSceneMgr->getRootSceneNode()->addChild(nodeNinja) nodeNinja->attachObject(entNinja) Ogre::Entity* entSphere = mSceneMgr->createEntity('entSphere', 'sphere.mesh') Ogre::SceneNode* nodeSphere = mSceneMgr->createSceneNode('nodeSphere') mSceneMgr->getRootSceneNode()->addChild(nodeSphere) nodeSphere->attachObject(entSphere) nodeNinja->setPosition(-50,-100,0) nodeSphere->translate(50,0,100) Ogre::Light* pointLight1 = mSceneMgr->createLight('pointLight1') pointLight1->setType(Ogre::Light::LT_POINT) pointLight1->setDiffuseColour(Ogre::ColourValue::White) pointLight1->setSpecularColour(Ogre::ColourValue::White) pointLight1->setPosition(-400,200,-200) mCamera->setPosition(Ogre::Vector3(0,0,-250)) mCamera->lookAt(Ogre::Vector3(0,0,0))

8. Esitusring
Esitage renderdussilmu sisestamiseks meetod :: RootRendering ja renderdamine lõpeb juurte vabastamiseks:
Ogre::LogManager::getSingleton().logMessage('>>Rendering') mRoot->startRendering() // Release the resource, currently only need to release Root delete mRoot
Klubi Singleton funktsioon LogManager kirjutab logifaili teavet.
Funktsioon startRendering on rakendatud järgmiselt:

void Root::startRendering(void) { assert(mActiveRenderer != 0) mActiveRenderer->_initRenderTargets() // Clear event times clearEventTimes() // Infinite loop, until broken out of by frame listeners // or break out by calling queueEndRendering() mQueuedEnd = false while( !mQueuedEnd ) { //Pump messages in all registered RenderWindow windows WindowEventUtilities::messagePump() if (!renderOneFrame()) break } }

Meetodi juur :: renderOneFrame kood on järgmine:

bool Root::renderOneFrame(void) { if(!_fireFrameStarted()) return false if(!_updateAllRenderTargets()) return false return _fireFrameEnded() }

Samuti saate renderdamisring ise konstrueerida, et saaksite lahendada probleemi, et alglaadimiskood klõpsab akna sulgemisprogrammi ja ei välju:

while(true) { // Pump window messages for nice behaviour Ogre::WindowEventUtilities::messagePump() if(mWindow->isClosed()) { return false } // Render a frame if(!mRoot->renderOneFrame()) return false }

9. Kokkuvõte
Selle dokumendi põhipunktid on kokku võetud allpool:
- OGRE-programm algab alati Root-eksemplari loomisega
- Paljud GNManageri xxxManageri klassid kasutavad Singletoni kujundusmustrit. Ülemaailmselt ainulaadsete klassieksemplaride hankimiseks võite helistada klassi staatilisele meetodile getSingleton, näiteks: ResourceGroupManager, LogManager, TextureManager, MeshManager jne, kuid SceneManager seda pole.
- OGRE abstraktselt graafikasüsteemi. Kasutajad kasutavad OGRE-ga suhtlemiseks baasklassi liidest. Kui programm on täidetud, kutsub see automaatselt süsteemi konfiguratsioonile vastavate konkreetsete alaklasside juurutamist, näiteks RenderSystem ja RenderWindow.
- OGRE stseeniandmeid korraldab Scene Graph, mis on sisuliselt puu, mida korraldab ja haldab SceneManager
- Iga kaamera kaardistatakse vaateava kaudu akna ristkülikukujulise osaga (loomulikult saab seda ka tekstuurile renderdada)
- OGRE ressursifailid on peamine funktsioon ja ressursid nõuavad täitmise ajal konkreetsete programmide laadimist programmi
- OGRE kasutab konfiguratsioonifaile. See artikkel käsitleb faile plugins.cfg, ogre.cfg, Ogre.log ja resources.cfg. Sa peaksid olema teadlik nende rollist
- Stseenipuu olemasolu eeldab, et stseenipuus ei tohi olla aasasid.
Noh, peaksite aru saama OGRE põhilisest käivitusprotsessist. See artikkel ei käsitle mõnede sündmuste, näiteks WindowEventListener, FrameListener jt töötlemist ega hõlma hiire ja klaviatuuri sisestamist. Isegi kui käivituskood on käivitatud, ei saa akna sulgemine programmi lõpetada. Räägime sellest hiljem.
Kordustrükk: https://www.cnblogs.com/zhaolizhe/p/6937996.html