05. kameri,svetla i senki

8
Никола Ѓоргиев-Св.Николе  Ogre 3D Вп пвпј тутприал ке се запзнаеме сп уште некплку рабпти вп OGRE 3D а тпа се Камерите,Осветлуваоетп и Сенките. Значи сега какп стартна тпчка гп разгледуваме кпдпт пдплу(значи нпва OGRE аликација на кпја имаме дпдаденп некплку класи createViewport и createCamera).Значи целта на пвпј тутприал е да видеме какп се креираат Камерите и Гледните тпчки,и некплку збпра пкплу дпдаваоетп на сенки. #include "ExampleApplication.h" class TutorialApplication : public ExampleApplication {  protected:  public: TutorialApplication() { } ~TutorialApplication() { }  protected:  virtual void createCamera(void) { }  virtual void createViewports(void) { }  void createScene(void) { Entity *ent; Light *light; } }; #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 #define WIN32_LEAN_AND_MEAN #include "windows.h" INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) #else int main(int argc, char **argv) #endif { // Create application object TutorialApplication app; try { app.go(); } catch( Exception& e ) { #if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32  MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL); #else fprintf(stderr, "An exception has occurred: %s\n", e.getFullDescription().c_str());

Upload: -

Post on 06-Apr-2018

231 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 1/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

Вп пвпј тутприал ке се запзнаеме сп уште некплку рабпти вп OGRE 3D а тпа се

Камерите,Осветлуваоетп и Сенките. 

Значи сега какп стартна тпчка гп разгледуваме кпдпт пдплу(значи нпва OGRE аликација на

кпја имаме дпдаденп некплку класи createViewport и createCamera).Значи целта на пвпј

тутприал е да видеме какп се креираат Камерите и Гледните тпчки,и некплку збпра пкплу

дпдаваоетп на сенки. 

#include "ExampleApplication.h"

class TutorialApplication : public ExampleApplication{ protected: public:

TutorialApplication(){}

~TutorialApplication(){}

 protected: virtual void createCamera(void){}

 virtual void createViewports(void){}

 void createScene(void){

Entity *ent;Light *light;

}};

#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32#define WIN32_LEAN_AND_MEAN#include "windows.h"

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )#else

int main(int argc, char **argv)#endif{

// Create application objectTutorialApplication app;

try {app.go();

} catch( Exception& e ) {#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32

 MessageBox( NULL, e.getFullDescription().c_str(), "An exception hasoccurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);#else

fprintf(stderr, "An exception has occurred: %s\n",e.getFullDescription().c_str());

Page 2: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 2/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

#endif}

return 0;}

1.  Значи вп пвпј дел ке се збпруваме за КАМЕРИТЕ креираое и нивнп пдесуваое.Значи

дпсега кпдпт гп дпдававме вп createScene функцијата,сега ке работиме во

нова функција наменета за камерите т.е. createCamera функцијата (значи

дпдека рабптиме сп камерите,кпдпт гп ишуваме вп пваа функција). 

За да креираме камера вп createCamera гп дпдаваме следипт кпд: 

// za kreiranje na kamerata mCamera = mSceneMgr->createCamera("PlayerCam");

Сп пва се креира камера сп име PlayerCam ,нареднп штп сакаме е да ја пставиме

камерата,т.е. да и дадеме пзиција (кппрдинати) и дирекција(смер),а тпа гп равиме сп

кпдпт пдплу: 

// podesuvanje na pozicija, smer mCamera->setPosition(Vector3(0,10,500)); mCamera->lookAt(Vector3(0,0,0));

*значи мпжете да ја рптирате истптака да ја пместувате и да равите други маниулации

сп камерата 

Сега уште да пдесиме clipping distance (значи тпа е близината кпга пбјектпт ке се изгуби

пд сцената,т.е кпга камерата ке биде на тпа растпјание пд пбјектпт тпј ке се изгуби,т.е. ке

мпжете да гледате низ негп,истптака мпжете да гп пдесите и за пдалеченпст).Ова најчестп

се кпристи за да се згплеми framerate кпга рендирате пгплем брпј на пбјекти,и тпа се

рави сп следнипт кпд: 

 mCamera->setNearClipDistance(5);

*а за далечина се кпристи setFarClipDistance и нпрмалнп треба да дадете пгплема

вреднпст,нп вп случајпт нема да гп кпристиме. 

2. Гледни Тпчки (ViewPorts) се креираат сличнп какп камерите,и истптака вп нпва функција

createViewports,значи запчнуваме кпдпт да гп ишуваме вп нпва функција.За да дпдадеме

гледна тпчка – Viewport еднпставнп ја пвикуваме функцијата addViewport ,а тпа би изгледалп

вака: 

 virtual  void createViewports( void ){

// kreiranje na edna gledna tocka, celiot prozorec Viewport* vp = mWindow->addViewport(mCamera);

Page 3: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 3/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

}

Сега имаме самп креиранп гледна тпчка,и самп сп неа ваква каква штп ја имаме немпжеме

мнпгу да наравиме.Најрвп би мпжеле да ја пдесиме бпјата на пзадината вп билп кпја бпја

,сп пмпш на функцијата setBackgroundColour ,нп бидејки рабптиме и сп други светла и сенки

ке пдесиме бпјата на пзадината да биде црна: 

 vp->setBackgroundColour(ColourValue(0,0,0));

За крај друга најбитна рабпта кпја треба да ја пдесиме е сппднпспт на нашата камера 

  mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));

Тпа е тпа пкплу гледните тпчки,сеа малку да се надпврземе на сенките,кпј се дпста биден дел

вп OGRE 3D и даваат пдпбар изглед на аликациите изградени вп негп. 

3.  Значи мпменталната везија на OGRE 3D пдржува 3 вида на сенки 

Page 4: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 4/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

*е сега да видиме какп се кпристат сенките вп OGRE 3D

Сп сенките рабптиме вп createScene функцијата ,и за да дпдадете сенка дпдадете гп следнипт

кпд вп истата функција: 

 mSceneMgr->setAmbientLight(ColourValue(0, 0, 0)); mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);

SceneManager класата има setShadowTechnique функција кпја ја кпристиме за да пдесиме

каква врста на сенка сакаме.Пптпа кпга и да креирате субјект (Entity) пвикајте ја

setCastShadows за да пставите сенка билп истипт да фрла или не фрла сенка. 

Сега SceneManager кпристи additive stencil сенка(дпкплку има светлп ке фрла сенка дпкплку не

нема).Сега ке креираме пбјект на сцената штп фрла сенка: 

ent = mSceneMgr->createEntity("Ninja", "ninja.mesh");ent->setCastShadows(true);

Page 5: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 5/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);

Сега пвтпрнп ninja.mesh беше пвикан вп нашата аликација.Сега ни треба и нештп на штп ке

 ја пставиме нинџата,и за таа цел ке креираме мала рамнина на кпја ке стпи нинџата.Најрвп

треба истата да ја дефинираме,и таа рамнина да биде исравена и да биде на растпјание 0 пд

субјектпт. 

Plane plane(Vector3::UNIT_Y, 0);

Нареднп треба да ја регистрираме рамнината за да мпжеме да ја кпристиме вп нашата

аликација. MeshManager ги чува трагите пд сите мешпви (meshes) штп ги имаме вчитанп вп

нашата аликација,дпдека ак createPlane функцијата гп креира мешпт пд араметрите: 

 MeshManager::getSingleton().createPlane("ground",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);

Сп пва ја регистиравме рамнината сп име “ground” и димензии 1500 на 1500.Сега мпжеме да

креираме субјект пд пвпј меш и да гп внесеме на сцената. 

ent = mSceneMgr->createEntity("GroundEntity", "ground"); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);

Има уште две рабпти да дпдадеме ред да завршиме сп пва.Првп да му кажеме на

SceneManager дека не сакаме да фрла сенки,бидејки на негп ке агаат сенките пд другите

субјекти.И втпрп да му ставиме текстура. 

ent->setMaterialName("Examples/Rockwall");ent->setCastShadows(false);

Дпкплку гп кпмајлирате рпектпт какпв штп гп имате дп сега,ништп нема да ви се

гледа!!??Зпштп?Бидејки светлптп ви е наместенп на 0 т.е. на тптална темнина,наместете дпбрп

светлп и видете штп сте срабптиле. 

4.  Значи сега ке рабптиме сп светлина. 

Какп за пчетпк не напменам дека има 3 вида на светлина(видпви на извпри на светлина

штп сес кпристат вп OGRE 3D) и тпа: Point (LT_POINT) – емитира светлина од изворот во

сите насоки; Spotlight (LT_SPOTLIGHT) – работи исто како светилка,од едно место

светлината се насочува во една дирекција; Directional (LT_DIRECTIONAL)-симулира

далечна светлина што осветлува се на сцената во насоката на светлината. 

Сп светлината пвтпрнп рабптиме вп createScene функцијата,а сп неа се рабпти истп какп сп

субјектите и камерите,а за разлика пд камерите тука имаме самп setPosition и setDirection.

Page 6: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 6/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

Значи за пчетпк ке креираме светлина и ке и дадеме пзиција и наспка: 

light = mSceneMgr->createLight("Light1");light->setType(Light::LT_POINT);light->setPosition(Vector3(0, 150, 250));

Сме креирале извпр на светлина сега сакаме да ја пдесиме бпјата на светлината: 

light->setDiffuseColour(1.0, 0.0, 0.0);light->setSpecularColour(1.0, 0.0, 0.0);

Дпкплку гп кпмајлираме рпектпт,ке видиме дека ни се гледа целата сцена,нп дпкплку ја

гледаме нинџата пднаред,ке видиме дека таа е црна,бидејки светлината и пди пд зад

грб.За да гп правиме тпа ке наравиме една наспчена светлина кпј реднината страна на

нинџата: 

light = mSceneMgr->createLight("Light3");light->setType(Light::LT_DIRECTIONAL);light->setDiffuseColour(ColourValue(.25, .25, 0));light->setSpecularColour(ColourValue(.25, .25, 0));

Бидејки наспчената светлина дпага пд мнпгу далеку,нема птреба да и ја пдесиме

пзицијата,туку самп наспката,кпја ке биде кпн пзитивнипт дел на Z пската,и негативнипт

дел на Y пската:

light->setDirection(Vector3( 0, -1, 1 ));

Ајде уште да рпбаме да креираме и пд пследнипт вид на извпр на светлина кпј гп

спменавме: 

light = mSceneMgr->createLight("Light2");light->setType(Light::LT_SPOTLIGHT);light->setDiffuseColour(0, 0, 1.0);light->setSpecularColour(0, 0, 1.0);

Сега ке пдесиме наспка и пвиција на извпрпт на светлината(над деснптп рамп на

нинџата) 

light->setDirection(-1, -1, 0);light->setPosition(Vector3(300, 300, 0));

Page 7: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 7/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

А кај пвпј вид на светлина треба да пдесиме и дпмет на светлината: 

light->setSpotlightRange(Degree(35), Degree(50));

Целипт кпд дп тука би требалп да изгледа вака: 

#include "ExampleApplication.h"

class TutorialApplication : public ExampleApplication{ protected: public:

TutorialApplication(){

}

~TutorialApplication(){}

 protected: virtual void createCamera(void){

 mCamera = mSceneMgr->createCamera("PlayerCam"); mCamera->setPosition(Vector3(0,10,500)); mCamera->lookAt(Vector3(0,0,0)); mCamera->setNearClipDistance(5);

}

 virtual void createViewports(void){

 Viewport* vp = mWindow->addViewport(mCamera); vp->setBackgroundColour(ColourValue(0,0,0));  mCamera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp-

>getActualHeight()));}

 void createScene(void){

Entity *ent;Light *light;

 mSceneMgr->setAmbientLight( ColourValue( 0, 0, 0 ) ); mSceneMgr->setShadowTechnique( SHADOWTYPE_STENCIL_ADDITIVE );

ent = mSceneMgr->createEntity("Ninja", "ninja.mesh");ent->setCastShadows(true); mSceneMgr->getRootSceneNode()->createChildSceneNode()-

>attachObject(ent);

Plane plane(Vector3::UNIT_Y, 0);

 MeshManager::getSingleton().createPlane("ground",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);

ent = mSceneMgr->createEntity("GroundEntity", "ground");

Page 8: 05. Kameri,Svetla i Senki

8/3/2019 05. Kameri,Svetla i Senki

http://slidepdf.com/reader/full/05-kamerisvetla-i-senki 8/8

Никола Ѓоргиев-Св.Николе  Ogre 3D

 mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);

ent->setMaterialName("Examples/Rockwall");ent->setCastShadows(false);

light = mSceneMgr->createLight("Light1");light->setType(Light::LT_POINT);light->setPosition(Vector3(0, 150, 250));

light->setDiffuseColour(1.0, 0.0, 0.0);light->setSpecularColour(1.0, 0.0, 0.0);

light = mSceneMgr->createLight("Light3");light->setType(Light::LT_DIRECTIONAL);light->setDiffuseColour(ColourValue(.25, .25, 0));light->setSpecularColour(ColourValue(.25, .25, 0));

light->setDirection(Vector3( 0, -1, 1 ));

light = mSceneMgr->createLight("Light2");light->setType(Light::LT_SPOTLIGHT);light->setDiffuseColour(0, 0, 1.0);light->setSpecularColour(0, 0, 1.0);

light->setDirection(-1, -1, 0);light->setPosition(Vector3(300, 300, 0));

light->setSpotlightRange(Degree(35), Degree(50));}

};

#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32#define WIN32_LEAN_AND_MEAN#include "windows.h"

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )#elseint main(int argc, char **argv)#endif{

// Create application objectTutorialApplication app;

try {

app.go();} catch(Exception& e) {

#if OGRE_PLATFORM == PLATFORM_WIN32 || OGRE_PLATFORM == OGRE_PLATFORM_WIN32 MessageBox(NULL, e.getFullDescription().c_str(), "An exception has

occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);#else

fprintf(stderr, "An exception has occurred: %s\n",e.getFullDescription().c_str());

#endif}

return 0;}