Ogre學習筆記2 光源攝像機和陰影

2021-07-10 04:59:33 字數 3810 閱讀 5238

mcamera = mscenemgr->createcamera("playercam");
同樣你也可以通過名稱獲取攝像機的指標,通過呼叫getcamera()函式

下面**我們移動攝像機的位置並且規定攝像機往**看。

mcamera->setposition(ogre::vector3(0, 300, 500));

mcamera->lookat(ogre::vector3(0, 0, 0));

攝像機會根據你設定的向量來旋轉攝像頭。

下面我們設定攝像機的近裁剪距離,如果模型的麵比這個距離更近我們就會進入模型的內部。

mcamera->setnearclipdistance(5);
同樣也有乙個函式可以讓你設定攝像機的遠裁剪面,但是在這個例子中不需要。

我們通過ogrebites建立乙個攝像機的管理器

mcameraman =

new ogrebites::sdkcameraman(mcamera);

這是動態分配的記憶體不要忘記釋放他

ogre::viewport

* vp = mwindow->addviewport(mcamera);

建立完視口我們要通過viewport來設定背景顏色。

然後我們要做的事是確定相機的橫縱比。即使我們使用了預設的橫縱比但是還是示範一下函式的使用。我們通過攝像機類的函式來設定橫縱比

vp->setbackgroundcolour(ogre::colourvalue(0, 0, 0));

mcamera->setaspectratio(ogre::real(vp->getactualwidth())/ogre::real(vp->getactualheight()));

ogre::entity* ninjaentity = mscenemgr->createentity("ninja.mesh");

ninjaentity->setcastshadows(true);

mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(ninjaentity);

下面我們要建立乙個平面,我們需要通過meshmanager來從頭建立乙個mesh,我們將用它生成乙個紋理面來當地面。

我們首先要做的是建立乙個抽象的平面物體。

ogre

::plane

plane(ogre

::vector3

::unit_y, 0);

我們指定了它的法向量就是y軸

接下來我們要用meshmanager創造我們的平面網格,我們可以通過上面的物件建立乙個平面網格。

ogre::meshmanager

::getsingleton().createplane(

"ground",

ogre::resourcegroupmanager

::default_resource_group_name,

plane,

1500, 1500, 20, 20,

true,

1, 5, 5,

ogre::vector3

::unit_z);

引數有點多,我們先簡單理解成我們建立了乙個名字叫ground的新mesh

接下來我們建立乙個entity,用這個新的mesh-「ground」

ogre::entity* groundentity = mscenemgr->createentity("ground");

mscenemgr->getrootscenenode()->createchildscenenode()->attachobject(groundentity);

注意這裡我們不是在建立entity的時候傳入乙個名稱,而是乙個mesh的名字。

我們要把這個地面的陰影關閉,因為開啟它是一種浪費,但是關閉它,我們的物體仍然可以將陰影投射在它上面

groundentity->setcastshadows(false);
我們可以給地面設定乙個材質,最簡單的方法是設定乙個系統自帶的材質。

groundentity->setmaterialname("examples/rockwall");
mscenemgr->setambientlight(ogre::colourvalue(0, 0, 0));

mscenemgr->setshadowtechnique(ogre::shadowtype_stencil_additive);

ogre::light

* spotlight = mscenemgr->createlight("spotlight");

spotlight->setdiffusecolour(0, 0, 1.0);

spotlight->setspecularcolour(0, 0, 1.0);

spotlight->settype(ogre::light

::lt_spotlight);

spotlight->setdirection(-

1, -

1, 0);

spotlight->setposition(ogre::vector3(200, 200, 0));

spotlight->setspotlightrange(ogre::degree(35), ogre::degree(50));

ogre::light

* directionallight = mscenemgr->createlight("directionallight");

directionallight->settype(ogre::light

::lt_directional);

設定鏡面反射和漫反射顏色

directionallight->setdiffusecolour(ogre::colourvalue(.4, 0, 0));

directionallight->setspecularcolour(ogre::colourvalue(.4, 0, 0));

因為是方向光所以不具有位置,所以我們只需要設定乙個方向即可。

directionallight->setdirection(ogre::vector3(0, -1, 1));
ligth類還有乙個方法可以設定光線的衰減setattenuation

我們還有一種光源型別沒有學習那就是點光源,最後我們要把點光源新增到場景中

ogre::light

* pointlight = mscenemgr->createlight("pointlight");

pointlight->settype(ogre::light

::lt_point);

pointlight->setdiffusecolour(.3, .3, .3);

pointlight->setspecularcolour(.3, .3, .3);

點光源因為只有乙個位置所以我們不需要設定方向

pointlight->setposition(ogre::vector3(0, 150, 250));
關於陰影還有很多的知識這只是最基本的。

Ogre攝像機Camera類

對攝象機的抽象。成員函式說明如下 標準建構函式 camera string name,scenemanager sm 標準析構函式 virtual camera 返回渲染該攝像機的 scenemanager 的指標scenemanager getscenemanager void const 取得攝...

2D攝像機的設計

攝像機跟隨移動有多種方式,為了使攝像機更平滑的移動,這裡使用插值運算,很多人說使用它總會卡頓,只是因為同步更新問題,將移動方式放於lateupdate 中便可,在地圖允許的情況下,直接使用座標插值即可。插值運算移動 transform.position vector3.lerp vector3 or...

cocoa2d x 移動攝像機

cocoa2d x camera類中 seteyexyz 0,0,0.1 setcenterxyz 0,0,0 setupxyz 0,1,0 對應glulookat eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz 要移動相機,並不會發生錯亂 需要...