Irrlicht学习笔记(1)--helloworld

声明:


想研究一下irrlicht引擎,所以先跟着手册和例子学习一下如何使用它.
本文为最基本的irrlicht程序.一个helloworld.
我的平台是win7,使用的是VS2013社区版




1. 因为官方示例给我们提供了很多例子,同时附带很多资源文件,我们用他们提供的资源会很方便学习.
比如我会在learn目录下建多个irrlicht引擎学习项目,于是我将irrlicht引擎文件夹下的media复制到learn目录下,以后如果我要在程序中用到某个文件:*.bmp,我只需要用:../media/*.bmp就可以了.




2.irrlicht引擎命名空间:

//irr包含irrlicht引擎的所有东西
namespace irr
{

//core包含很多核心容器:vectors,planes,arrays,lists,数学库
namespace core
{
}

//gui命名空间有许多有用的类,提供创建图形界面的接口
namespace gui
{
}
//io为输入输出提供接口:读写文件,访问zip压缩包,xml文件
namespace io
{
}
//场景管理都在scene命名空间,包括:场景节点,摄像机,例子系统,mesh 管理,特殊屏幕节点比如:八叉树和布告板,动画管理,
namespace scene
{
}
//video包括访问video driver的类,2d,3d渲染都在这里实现
namespace video
{
}
}




3.craateDevice()

//irr命名空间包含一个函数:createDevice(Ex),可以通过它返回一个IrrlichtDevice类,
这个类是使用这个引擎的根对象.这个函数是用来设置 SIrrlichtCreationParameters类的参数(声明为struct,参数默认public)

函数形式:
extern  "C"   IRRLICHT_API       IrrlichtDevice* /*返回值*/     createDevice(
video::E_DRIVER_TYPE deviceType = video::EDT_SOFTWARE,/*默认为EDT_SOFTWARE*/
/*还可以使:EDT_NULL,EDT_BURNINGSVIDEO,EDT_DIRECT3D8,EDT_DIRECT9,EDT_OPENG*/
const core::dimension2d<u32>& windowSize = (core::dimension2d<u32>(640,480),/*
顾名思义,设置窗口大小的*/
u32 bits = 16,/*颜色深度*/
bool fullscreen = false,/*是否全屏*/
bool vsync = false,/*垂直同步*/
IEventReceiver* receiver = 0/*事件接受对象的接口*/
);

1).可以通过上述函数创建一个 IrrlichtDevice对象
2)也可以先声明定义一个 SIrrlichtCreationParameters结构,再使用
createDeviceEx(const SIrrlichtCreationParameter& parameters);获得IrrlichtDevice对象
方法2会在下一个例子中使用.





4.写一个HelloWorld.

例子:
1)头部
#include <irrlicht.h>//要是用Irrlicht引擎只需要包含这一个头文件就行了
//要使用的命名空间
using namespace irr;
 
using namespace core;
using namespace video;
using namespace scene;
using namespace io;
using namespace gui;

//为了使用Irrlicht.DLL文件,需要连接Irrlicht.lib,
//可以通过settings设置,也可以通过下列方式设置
//第二个pragma 是为了隐藏控制台窗口的,但建议开启(也就是注释掉),可以看到许多提示信息
#ifdef _IRR_WINDOWS_
#pragma comment(lib,"Irrlicht.lib")
//#pragma comment(linker,"/subsystem:windows /ENTRY:mainCRTStartup")
#endif

//这里为了可移植性通过main开始,
int main(int argc,char** argv)
{
	//首先需要做的就是通过irr命名空间中的createDevice获得一个设备,通过他才能开始之后的编程
	IrrlichtDevice* device = createDevcie(video::EDT_SOFTWARE,
			dimension2d<u32>(720,455),16,
			false,false,false,0);
	//错误处理
	if(!device)
	return 1;
	//为窗口设置一个标题
	device->setWindowCaption(L"Hello World!");

	//通过获得的设备对象,可以创建IVideoDriver,ISceneManager,IGUIEnvironment,这三者分别负责
	//渲染设备,场景管理,GUI管理
	IVideoDriver* driver->device->getVideoDriver();
	ISceneManager* smgr=device->getSceneManager();
	IGUIEnvironment* guienv = device->getGUIEnvironment();

	//通过GUI管理对象在屏幕上写一个"Hello World!",
	guienv->addStaticText(L"Hello World!"/*文本内容,引号前加L*/,
			rect<s32>(300,100,450,120),true/*显示边框*/
	);

	//下面这一行在本例中用不到,因为我们只是操作gui部分,不用设置摄像机,
	//smgr->addCameraSceneNode(0,/*父节点,因为只用到一个所以没有*/
	// vector3df(0,20,-30),/*摄像机位置
	// vector3df(0,5,0)/*look at*/
	//);
	//好了,可以调用循环部分了,结束条件是关闭程序,
	while(device->run())
	{
	//场景管理器负责管理更显示有关的缓存:颜色缓存,深度缓存等,
	driver->beginScene(
						 true,/*是否清理颜色缓存
						 true,/*深度缓存*/
						 SColor(255,255,255,255)/*背景颜色:argb*/
	);
	//有两部分内容需要渲染,一个是我们的游戏世界,一个是GUI部分
	smgr->drawAll();
	guienv->drawAll();

	driver->endScene();//向屏幕传输
	}
	//结束渲染循环,再再次调用createDevice()之前需要删除IrrlichtDevice,释放对象
	device->drop();

	return 0;
}






5.一个人物模型和动画


官方提供的第一个例子还加载了一个人物模型以及为她开启了一个动画

1) 只需要在while循环前添加下列代码:
//为了添加一个网格模型,诸如:.obj(maya),.bsp(quake3),或者其他格式,只需要调用下列函数,它内部进行判断
IAnimatedMesh* mesh = smgr->getMesh("../media/sydney.md2");//场景管理器负责加载这部分资源
//防错
if(!mesh)
{
device->drop();//释放对象,安全退出
return 1;
}
//为了显示动画,添加一个场景节点
IAnimatedMeshSceneNode* node = smgr->AddAnimatedMeshSceneNode(mesh);



2) 但是现在不能看到完整的模型,因为我们没有为摄像机设置合适位置和朝向,
只需要使用之前注释掉的那一行就行了.也就是使用ISceneManager::addCameraSceneNode函数

不过现在看到的模型虽然有动画且看着是个人物,但她是漆黑的,这是因为我们没有为她的属性进行设置(特别是光照),在上述程序后面添加如下代码,为模型进行属性设置,以及为她添加皮肤.
if(node)
{
//从文件夹中加载纹理
ITexture *texture = driver->getTexture("../media/sydney.bmp");
node->setMaterialFlag(EMT_LIGHTING,false);/*通过这个函数以及参数可以设置材质的属性,这里设置光照为否,因为我们没有设置灯光,开启的话,看到的模型就变成白色的了
node->setMD2Animation(scene::EMAT_STAND);//通过这个函数设置刚才加载的模型动画所属EMD2_ANIMATION_TYPE 中的哪一个,这里设置为站立,之前没有设置动画也找出播放,是因为其默认为EMAT_STAND
node->setMaterialTexture(0,/*次参数为这个node的所有材质中的纹理编号,这里为0*/
texture); 
}




重要函数说明:
//为一个mesh模型创建一个场景节点,用来管理这个模型,
IAnimatedMeshSceneNode* addAnimatedMeshSceneNode(
IAnimatedMesh* mesh,
ISceneNode* parent= 0,/*这个节点可以是一个人物所有动画中的一个,所以通过父节点来管理*/
s32 id =-1,/*为节点唯一命名*/
const core::vector3df& postion = core::vector3df(0,0,0),/*相对于父节点的位置*/
const core::vector3df& rotation = core::vector3df(0,0,0),/*旋转*/
const core::vector3df& scale = core::vector3df(1.0f.1.0f,1.0f),/*缩放*/
bool alsoAddIfMeshPointerZero = false/*若为true,即使传入指针为空也差un关键一个场景节点*/
);

你可能感兴趣的:(例程,Irrlicht)