StupidBeauty
Read times:1713Posted at:Fri Nov 18 19:03:09 2011

Irrlicht教程翻译:教程1:世界妳好,Tutorial 1: HelloWorld

这個教程说明的是如何使用Irrlicht来写一個简单的世界妳好(HelloWorld)程序。这个程序会演示如何使用VideoDriver、GUIEnvironment和SceneManager 的基本功能。

妳需要包含头文件<irrlicht.h>,这样才能使用这個引擎。头文件可在Irrlicht 引擎开发包的include 目录下找到。要让编译器能够找到这個头文件的话,就需要指明它所在的目录。这個过程在不同的集成开发环境中是不同的。

开始吧!

在我们设置好咯集成开发环境之后,编译器就会知道到哪里去找Irrlicht 引擎的头文件,∴我们可以在我们的代码中包含它咯。

#include <irrlicht.h>

在Irrlicht 引擎中,所有东西都是位于'irr'命名空间下的。∴,如果妳想要使用这個引擎中的一個类的话,妳需要在类的名字前面写上irr::。比如说,要使用IrrlichtDevice,就写irr::IrrlichtDevice。为咯免掉在每个类的前面都写上irr::,我们告诉编译器我们要用那个命名空间,然后我们就不用再写irr::咯。

using namespace irr;

在Irrlicht 引擎中有5个子命名空间。可以看看它们,可在文档中点击顶部菜单的‘命名空间列表’('Namespace List')条目来看到关于它们的详细描述,或者可以直接访问这個网页:http://irrlicht.sourceforge.net/docu/namespaces.html。就像irr 命名空间一样,我们不想要(每次都写上)那5個命名空间,以让这個示例保持简单。∴,我们再次告诉编译器,我们不想要每次都写它们的名字。

using namespace core;

using namespace scene;

using namespace video;

using namespace io;

using namespace gui;

以下是主函数。

int main()

{

引擎中最重要的函数是createDevice()函数。IrrlichtDevice 就是由它来创建的,而那個东西是这個引擎中的根对象,做任何事情都用得着它。createDevice()有7個参数:

  • •.deviceType:设备的类型。可选择:Null-device、两种软件渲染器中的一种、D3D8、D3D9或OpenGL。在这個示例中我们使用EDT_SOFTWARE,但是妳也可以试试EDT_BURNINGSVIDEO、EDT_NULL、EDT_DIRECT3D8、EDT_DIRECT3D9或EDT_OPENGL。

  • •.windowSize:窗口(Window)或者是在全屏模式(FullScreenMode)下的屏幕的尺寸。在这個示例中我们使用640x480。

  • •.bits:每個像素的颜色位数。应当是16 或32。在窗口模式下,这個参数通常会被忽略。

  • •.fullscreen:指明是否要让这個设备在全屏模式下运行。

  • •.stencilbuffer:指明我们是否想要使用模板缓存(stencil buffer)(用来绘制阴影)。

  • •.vsync:指明我们是否想要启用垂直同步(vsync),这個只在全屏模式有用。

  • •.eventReceiver:一個用来接收事件的对象。我们不想用这個参数,∴设置成0.

永远记住要检查返回值,以防出现不支持的驱动程序、分辨率……。

IrrlichtDevice *device =

createDevice( video::EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,

false, false, false, 0);

if (!device)

return 1;

将窗口的标题设置成一段漂亮的文字。注意,在字符串的前面有一個'L'。Irrlicht 引擎在显示文字的时候使用的是宽字符的字符串。

device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");

获取VideoDriver、SceneManager和图形用户界面环境的指针,这样我们就不需要每次都写device->getVideoDriver()、device->getSceneManager()和device->getGUIEnvironment()咯。

IVideoDriver* driver = device->getVideoDriver();

ISceneManager* smgr = device->getSceneManager();

IGUIEnvironment* guienv = device->getGUIEnvironment();

我们使用图形用户界面环境来向窗口中添加一個世界妳好的文字标签。文字被放置的区域的左上角是(10,10),右下角是(260,22)。

guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!",

rect<s32>(10,10,260,22), true);

为咯显示出某些有意思的东西,我们载入一個Quake 2 的模型并且显示出来。我们只需要使用getMesh()来从场景管理器(Scene Manager)中获取网孔(Mesh),再使用addAnimatedMeshSceneNode()来添加一個场景节点(SceneNode)以显示那個网孔。我们检查getMesh()的返回值,以了解是否出现咯载入错误或其它的错误。

除咯载入sydney.md2 之外,还可以载入一個Maya 对象文件(.obj)、一個完整的Quake3 地图(.bsp)或者任何其它被支持的文件格式。顺便说一下,那個诱人的叫做sydney 的Quake 2 模型是Brian Collins 制作的。

IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");

if (!mesh)

{

device->drop();

return 1;

}

IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );

为咯让这個网孔看起来漂亮一点,我们改变它的材质。我们禁用光照,∵我们没有使用动态光照,否则的话网孔会整个都是黑的。然后我们设置帧循环,这样的话就会使用预设的STAND 动画。最后,我们给网孔安上一個纹理(texture)。不安上这個的话,网孔就从头到尾是一個颜色的。

if (node)

{

node->setMaterialFlag(EMF_LIGHTING, false);

node->setMD2Animation(scene::EMAT_STAND);

node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );

}

为咯观看这個网孔,我们在三维空间的(0, 30, -40)处放置一個摄像机。摄像机从那儿望向(0,5,0),也就是我们的md2 模型大概的位置。

smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

好咯,现在我们把场景做好咯,让我们来把它们画出来:我们将这個设备放到一個while()循环中运行,直到这個设备不想再运行咯为止。而这种情况会在用户关闭窗口或者按ALT+F4(或者任何其它能够关掉窗口的按键)的时候发生。

while(device->run())

{

任何东西都可以在一对beginScene()和endScene()调用之间绘制。beginScene()调用会清空整个屏幕,并且如果指明的话,会使用指定的颜色和深度的缓存来填充。然后我们让场景管理器和图形用户界面环境绘制它们的内容。接下来调用endScene(),所有东西都显示在屏幕上咯。

driver->beginScene(true, true, SColor(255,100,101,140));

smgr->drawAll();

guienv->drawAll();

driver->endScene();

}

在渲染循环结束之后,我们需要将原来用createDevice()创建的Irrlicht 设备(Device)删除。在Irrlicht 引擎中,所有用'create'开头的方法或函数创建的对象都需要删除。简单地调用->drop()就可删除对象。参考irr::IReferenceCounted::drop()的文档,以了解更多东西。

device->drop();

return 0;

}

好咯。编译,运行吧。

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4