三、 在Irrlicht中的特殊效果
在本文的例子中,我將向你展示怎樣使用樣板緩衝區影子技術,還有粒子系統,告示板,動態光以及水表面情境結點等技術。參見圖3。
圖3.結合動態光和水進行的情境著色
Irrlicht引擎自動地檢查是否你的硬體支援模板緩衝;而如果不支援,則不啟動陰影。在這個示範程式中,在方法createDevice()中的’shadows’標誌被置位,以產生從一個動畫角色投下的動態影子。如果這個執行個體程式在你的PC上運行太慢,可以把這個標誌設定為false或者乾脆再買一塊更好些的圖形加速卡。
為能夠使用Irrlicht.DLL檔案,你需要連結到Irrlicht.lib庫檔案。你可以在工程設定對話方塊中設定這個選項;但是為了容易實現,你可以使用一個pragma先行編譯注釋命令。方法createDevice()負責執行個體化根對象-它使用引擎完成一切事情。參數如下:
·deviceType:裝置類型。當前你可選取Null裝置以及軟裝置,如DirectX8,DirectX9或OpenGL。
·windowSize:要建立的視窗的大小或全螢幕模式。這個例子中使用512x384。
·bits:每一像素位元數(當在全螢幕情況時)。僅允許值為16或者32。
·fullscreen:指定是否你想使裝置運行於全螢幕方式。
·stencilbuffer:指定是否你想使用樣板緩衝區以用於繪製陰影。
·vsync:指定是否你想啟動vsync(僅在全螢幕情況),可選。
·eventReceiver:一個接收事件的對象,可選。
為適合於本執行個體環境,你將裝載一個3D Studio Max檔案(一幢房子)。該房子看起來並沒有什麼特別的,但是Irrlicht引擎能為你建立一個相當酷的紋理貼圖。只需使用造型操縱器並為之建立一個planar紋理貼圖即可:
#include <irrlicht.h>
#include <iostream>
using namespace irr;
#pragma comment(lib, "Irrlicht.lib")
int main()
{
//讓我們假定使用者在本例中使用OpenGL
//當然,也可以指定DirectX 8, 9, 等等.
video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
//建立裝置,如果建立失敗立即退出。
IrrlichtDevice *device = createDevice(driverType,
core::dimension2d(640, 480), 16, false, true);
if (device == 0)
return 1;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
我對從這個匯入檔案產生的發射光線顏色的效果並不滿意。下列代碼顯示怎樣實現這些步驟:
scene::IAnimatedMesh* mesh = smgr->getMesh("room.3ds");
smgr->getMeshManipulator()->makePlanarTextureMapping(
mesh->getMesh(0), 0.008f);
scene::ISceneNode* node = 0;
node = smgr->addAnimatedMeshSceneNode(mesh);
node->setMaterialTexture(0, driver->getTexture("wall.jpg"));
node->getMaterial(0).EmissiveColor.set(0,0,0,0);
四、 水動畫
你將添加的第一個特殊的效果是水動畫。為此,WaterSurfaceSceneNode匯入一個造型檔案並使之象水表面一樣地波動。如果你讓這個情境結點使用一種相當好的材質如MT_REFLECTION_2_LAYER,那麼它看起來相當酷:
mesh = smgr->addHillPlaneMesh("myHill",
core::dimension2d(20,20),
core::dimension2d(40,40), 0, 0,
core::dimension2d(0,0),
core::dimension2d(10,10));
node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0),3,300,30);
node->setPosition(core::vector3df(0,7,0));
node->setMaterialTexture(0,driver->getTexture("water.jpg"));
node->setMaterialTexture(1,driver->getTexture("stones.jpg"));
node->setMaterialType(video::EMT_REFLECTION_2_LAYER);
作為輸入造型,你可以建立一個陡峭的平面造型,但是你也可以為此使用任何其它的造型。你甚至能重用room.3ds輸入檔案(它看上去確實很奇怪)。該執行個體還用一個普通的石頭紋理模型來繪製所有另外的表面。
五、透明的告示板和燈光
第二個特殊的效果是很基本的但是非常有用:一個透明的告示板,伴之有一個動態燈光。為產生這種效果,你只需要產生一個燈光情境結點,並讓它四處飛行;而且,為了讓它看起來更酷一些,可以把一個告示板情境結點依附到它上面:
//建立燈光
node = smgr->addLightSceneNode(0, core::vector3df(0,0,0),
video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 600.0f);
scene::ISceneNodeAnimator* anim = 0;
anim = smgr->createFlyCircleAnimator(core::vector3df(0,150,0),250.0f);
node->addAnimator(anim);
anim->drop();
// 把告示板依附到燈光
node = smgr->addBillboardSceneNode(node, core::dimension2d(50, 50));
node->setMaterialFlag(video::EMF_LIGHTING, false);
node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
node->setMaterialTexture(0,driver->getTexture("particlewhite.bmp"));
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/huangchonghai/archive/2007/09/02/1768847.aspx