登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [IrrLicht/中文/例子]IrrLicht 例子的中文讲解 - Tutorial 2: Quake 3 Map     [回主站]     [分站链接]
标题
[IrrLicht/中文/例子]IrrLicht 例子的中文讲解 - Tutorial 2: Quake 3 Map
clq
浏览(0) + 2009-01-15 15:24:03 发表 编辑

关键字:

[IrrLicht/中文/例子]IrrLicht 例子的中文讲解 - Tutorial 2: Quake 3 Map

from http://www.cppblog.com/irrwowview/articles/55310.html
--------------------------------------------------
Tutorial 2: Quake 3 Map
这个教程演示如何在引擎中加载一个Quake3地图,创建场景节点(SceneNode)来优化渲染速度和如何创建一个受用户控制的摄像机。请注意,在开始这个教程前你应该有本引擎的基础。如果没有,请大概看一下第一个教程, 1. HelloWorld。
本例子的效果图如下:






Lets start!(教程开始)

根据HelloWorld设置好IDE,并在代码中包含引擎的头文件。
还加上控制器程序要使用的头文件比较。

#include
#include


正如引擎中的HelloWorld例子那样,引擎中的所有东西都包含在命名空间“irr“中。我们可以告诉编译器,从现在开始使用irr作为命名空间,则可以在类的前面省去irr::。
还有5个子命名空间'core', 'scene', 'video', 'io' 和 'gui'。我们不像HelloWorld那样使用'using namespace'把5个命名空间添加到代码,因此会在代码的类前加上相应的命名空间前缀。你还是可以像以前的例子那样在代码中包含那命名空间。代码正如你想的那样。

using namespace irr;


再说一次,我们要链接IrrLicht.lib才可以使用IrrLicht.dll。可以在项目中设置,但为了简单也可如下设置:

#pragma comment(lib, "Irrlicht.lib")


很好。我们还是使用main函数作为程序的开始,而不使用WinMain,因为代码能更短。

int main()
{


好像HelloWorld例子那样,我们使用createDevice()函数创建一个IrrlichtDevice。有所不同的是要求用户选择一种硬件加速驱动(hardware accelerated driver)。软件驱动(Software driver)实在太慢以至不能用于绘制Quake3的大地图,但作为消遣,还是加上这个选项。

// ask user for driver

video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;

printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");





char i;
std::cin >> i;

switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_SOFTWARE2;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 1;
}

// create device and exit if creation failed

IrrlichtDevice *device =
createDevice(driverType, core::dimension2d(640, 480));

if (device == 0)
return 1;


获取视频驱动(video driver)和场景管理器(SceneManager)的指针,则不必经常调用device->getVideoDriver()和device->getSceneManager()。

video::IVideoDriver* driver = device->getVideoDriver();



scene::ISceneManager* smgr = device->getSceneManager();


要显示Quake3的地图,我们首先要加载它。Quake3的地图被打包成一种等同于*.zip格式的*.pk3文件里。则我们加载*.pk3文件到引擎的文件系统。添加进文件系统后,我们能够读取存放在硬盘中的文件。

device->getFileSystem()->addZipFileArchive("../../media/map-20kdm2.pk3");


现在我们可以调用getMesh()函数加载网格(mesh)文件,并返回一个IAnimatedMesh类型的指针。正如你所知道的,Quake3地图不能活动的,它们只是一个附上材质的具大静态几何型。因此IAnimatedMesh只包含一帧,而获得这个“动画(animation)”的“第一帧(first frame)”是我们的quake level(地震级数?)和根据它调用addOctTreeSceneNode()函数创建一个八叉数(OctTree)场景节点。
八叉数尝试只绘制当前看到的几何型来有一点优化场景。另一种代替八叉树(OctTree)的是活动网格场景节点(AnimatedMeshSceneNode),它会没优化,只会把整个网格几何型绘制出来。试试这样:用addAnimatedMeshSceneNode()函数代替addAnimatedMeshSceneNode()函数并作一下比较(IVideoDriver类里有一个getPrimitiveCountDrawed()函数)。注意八叉树(OctTree)优化只在大型网格地图时有效。

scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");
scene::ISceneNode* node = 0;







if (mesh)
node = smgr->addOctTreeSceneNode(mesh->getMesh(0));


因为原点(0,0,0)周围无模型,我们改变了一下坐标。

if (node)
node->setPosition(core::vector3df(-1300,-144,-1249));


现在我们只需要一个摄像机就可以观察Quake3的地图。而又想创建一个可以控制的摄像机。在IrrLicht引擎中有几种摄像机。For example the Maya Camera which can be controlled compareable to the camera in Maya: Rotate with left mouse button pressed, Zoom with both buttons pressed,
translate with right mouse button pressed. This could be created with addCameraSceneNodeMaya(). 但在这个例子中,我们创建了一个类似第一人称射击(first person shooter (FPS))游戏的摄像机:

smgr->addCameraSceneNodeFPS();


要使鼠标的光标不显示,我们隐藏了鼠标。

device->getCursorControl()->setVisible(false);


我们已经准备好一切,开始绘制它。我们在窗口的标题栏加上当前的FPS(frames per second)。'if (device->isWindowActive())' 这一行是一个判断, 防止其它程序激活时,引擎渲染鼠标光标(锁定鼠标)。

int lastFPS = -1;

while(device->run())



{



driver->beginScene(true, true, video::SColor(0,200,200,200));



smgr->drawAll();



driver->endScene();

int fps = driver->getFPS();

if (lastFPS != fps)



{



core::stringw str = L"Irrlicht Engine - Quake 3 Map example [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;



}



}


最后,删除IrrLicht设备。

device->drop();
return 0;
}


就这样,编译和演示一下这程序吧。


clq
2009-1-15 15:39:43 发表 编辑

http://www.3dmax8.cn/html/soft/

总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1