欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    开源3D游戏引擎irrlicht(鬼火)Example讲解——CustomSceneNode.doc

    • 资源ID:34460951       资源大小:242KB        全文页数:6页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    开源3D游戏引擎irrlicht(鬼火)Example讲解——CustomSceneNode.doc

    如有侵权,请联系网站删除,仅供学习与交流开源3D游戏引擎irrlicht(鬼火)Example讲解CustomSceneNode【精品文档】第 6 页开源3D游戏引擎Irrlicht(鬼火)Example讲解CustomSceneNode赵刚Irrlicht引擎自带的第3个Example叫做CustomSceneNode,她演示了用户如何自己创建新的场景节点,如果用户对irrlicht里面已有的SceneNode都不满意,希望自己创建一个有特定功能的SceneNode可以参照这个例子做,这个例子创建的SceneNode很简单,只不过是一个四棱锥,但方法是可以参考的,用户理解后完全可以创建出复杂的SceneNode。程序运行起来如下图:运行03.CustomSceneNode.exe的时候会先出来一个控制台窗口,按a,再按回车即可,表示选择OpenGL作为渲染API。进入bin目录下的examples目录可以看到03.CustomSceneNode目录,双击CustomSceneNode_vc9.vcproj文件打开工程文件,工程文件中只有一个main.cpp文件。内容如下(去除了英文注释):#include <irrlicht.h>#include "driverChoice.h"using namespace irr;#ifdef _MSC_VER#pragma comment(lib, "Irrlicht.lib")#endifclass CSampleSceneNode : public scene:ISceneNodecore:aabbox3d<f32> Box;video:S3DVertex Vertices4;video:SMaterial Material;public:CSampleSceneNode(scene:ISceneNode* parent, scene:ISceneManager* mgr, s32 id): scene:ISceneNode(parent, mgr, id)Material.Wireframe = false;Material.Lighting = false;Vertices0 = video:S3DVertex(0,0,10, 1,1,0,video:SColor(255,0,255,255), 0, 1);Vertices1 = video:S3DVertex(10,0,-10, 1,0,0,video:SColor(255,255,0,255), 1, 1);Vertices2 = video:S3DVertex(0,20,0, 0,1,1,video:SColor(255,255,255,0), 1, 0);Vertices3 = video:S3DVertex(-10,0,-10, 0,0,1,video:SColor(255,0,255,0), 0, 0);Box.reset(Vertices0.Pos);for (s32 i=1; i<4; +i)Box.addInternalPoint(Verticesi.Pos);virtual void OnRegisterSceneNode()if (IsVisible)SceneManager->registerNodeForRendering(this);ISceneNode:OnRegisterSceneNode();virtual void render()u16 indices = 0,2,3, 2,1,3, 1,0,3, 2,0,1;video:IVideoDriver* driver = SceneManager->getVideoDriver();driver->setMaterial(Material);driver->setTransform(video:ETS_WORLD, AbsoluteTransformation);driver->drawVertexPrimitiveList(&Vertices0, 4, &indices0, 4, video:EVT_STANDARD, scene:EPT_TRIANGLES, video:EIT_16BIT);virtual const core:aabbox3d<f32>& getBoundingBox() constreturn Box;virtual u32 getMaterialCount() constreturn 1;virtual video:SMaterial& getMaterial(u32 i)return Material;int main()video:E_DRIVER_TYPE driverType=driverChoiceConsole();if (driverType=video:EDT_COUNT)return 1;IrrlichtDevice *device = createDevice(driverType,core:dimension2d<u32>(640, 480), 16, false);if (device = 0)return 1; / could not create selected driver.device->setWindowCaption(L"Custom Scene Node - Irrlicht Engine Demo");video:IVideoDriver* driver = device->getVideoDriver();scene:ISceneManager* smgr = device->getSceneManager();smgr->addCameraSceneNode(0, core:vector3df(0,-40,0), core:vector3df(0,0,0);CSampleSceneNode *myNode =new CSampleSceneNode(smgr->getRootSceneNode(), smgr, 666);scene:ISceneNodeAnimator* anim =smgr->createRotationAnimator(core:vector3df(0.8f, 0, 0.8f);if(anim)myNode->addAnimator(anim);anim->drop();anim = 0;myNode->drop();myNode = 0;u32 frames=0;while(device->run()driver->beginScene(true, true, video:SColor(0,100,100,100);smgr->drawAll();driver->endScene();if (+frames=100)core:stringw str = L"Irrlicht Engine "str += driver->getName();str += L" FPS: "str += (s32)driver->getFPS();device->setWindowCaption(str.c_str();frames=0;device->drop();return 0;程序很简洁,条理也很清晰,下面开始讲解代码。首先每个使用irrlicht的程序都必须包含:#include <irrlicht.h>#pragma comment(lib, "Irrlicht.lib")表示要使用irrlicht SDK程序开头就定义了一个名为CSampleSceneNode的类,这个类从ISceneNode接口(抽象类)派生,在irrlicht中,用户创建的SceneNode类都必须从ISceneNode接口派生。CSampleSceneNode类包含下面3个成员变量:core:aabbox3d<f32> Box;video:S3DVertex Vertices4;video:SMaterial Material;其中Box和Material所有的SceneNode类都会包含,Vertices用于保存网格顶点,数量和格式和用户创建的网格复杂度有关,这个例子中的网格是4个顶点的四棱锥,而且是很基本的网格类型(没有多层纹理,凹凸纹理等复杂特性),所以使用S3DVertex这种简单类型。CSampleSceneNode在构造函数中建立了四棱锥。Material.Wireframe = false;Material.Lighting = false;Vertices0 = video:S3DVertex(0,0,10, 1,1,0,video:SColor(255,0,255,255), 0, 1);Vertices1 = video:S3DVertex(10,0,-10, 1,0,0,video:SColor(255,255,0,255), 1, 1);Vertices2 = video:S3DVertex(0,20,0, 0,1,1,video:SColor(255,255,255,0), 1, 0);Vertices3 = video:S3DVertex(-10,0,-10, 0,0,1,video:SColor(255,0,255,0), 0, 0);Box.reset(Vertices0.Pos);for (s32 i=1; i<4; +i)Box.addInternalPoint(Verticesi.Pos);这几行程序设置四棱锥的材质属性,4个顶点的位置,法线,颜色和纹理坐标,包围盒的尺寸。接着CSampleSceneNode类重载了virtual void OnRegisterSceneNode()函数,该函数每帧循环中均会被irrlicht SDK调用,该函数决定了SceneNode是否会被加入到渲染队列。CSampleSceneNode对该函数没有什么特别设计,只是简单的执行了SceneManager->registerNodeForRendering(this),表示将自己加入渲染队列。然后CSampleSceneNode类重载了virtual void render()函数,该函数在每帧循环的绘图阶段会被irrlicht SDK调用,顾名思义,这个函数是执行绘图功能的。在render()函数里,包含了一下代码:u16 indices = 0,2,3, 2,1,3, 1,0,3, 2,0,1;video:IVideoDriver* driver = SceneManager->getVideoDriver();driver->setMaterial(Material);driver->setTransform(video:ETS_WORLD, AbsoluteTransformation);driver->drawVertexPrimitiveList(&Vertices0, 4, &indices0, 4, video:EVT_STANDARD, scene:EPT_TRIANGLES, video:EIT_16BIT);indices是顶点索引表,表明了四棱锥的4个顶点按什么样顺序组成4个三角形,绘图时需要通过setMaterial函数告知irrlicht使用什么材质,通过setTransform函数告知irrlicht使用什么变换矩阵,然后可以调用driver对象中的绘图方法实现绘制,这里调用的是drawVertexPrimitiveList函数,表示以绘制三角形列表的方式绘制四棱锥。接下来的几个成员函数内容很简单,几乎所有的SceneNode都可以写成这样,这里不再详述。这样CSampleSceneNode就代表了用户创建的场景节点,用户创建自己的场景节点都可以参照这样的过程:1. 从ISceneNode派生一个新类2. 在构造函数里调用建立网格的函数(或者直接写)。3. 重载OnRegisterSceneNode(),告知irrlicht如何将场景节点加入到渲染队列中。4. 重载render(),实现绘制过程。5. 实现getBoundingBox(),getMaterialCount(),getMaterial()这几个函数。接下来就可以在主程序中声明CSampleSceneNode的对象,并且像使用irrlicht自己的SceneNode一样使用了。主程序的开头和02.Quake3Map差不多,这里不再重复解释,关键看下面几行代码:CSampleSceneNode *myNode =new CSampleSceneNode(smgr->getRootSceneNode(), smgr, 666);这行代码建立了CSampleSceneNode的实例对象,并且加到了场景中。scene:ISceneNodeAnimator* anim =smgr->createRotationAnimator(core:vector3df(0.8f, 0, 0.8f);这行代码建立了一个动画器,他能够使节点产生一些运动,这里是一个旋转动画器。if(anim)myNode->addAnimator(anim);anim->drop();anim = 0;这些代码将创建的动画器关联到节点中,由于irrlicht内部采用引用计数,anim对象在关联的过程中引用计数会加1,这里关联成功后,执行了anim->drop()将anim对象的引用计数减1,使anim的引用计数值为1(anim在建立的时候引用计数初值是1)。程序还执行了一次,myNode->drop();这是因为myNode采用new CSampleSceneNode这样的方式建立,irrlicht SDK中,以new方式建立场景节点初始计数值会是2,这样需要执行一次myNode->drop()将计数值减1.程序接下来的部分后02.Quake3Map没有差别了,这里不再解释,读者可以参考02.Quake3Map中的讲解。

    注意事项

    本文(开源3D游戏引擎irrlicht(鬼火)Example讲解——CustomSceneNode.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开