irrlicht引擎:实现天龙八部的RPG换装

简介:

又是夜深人静时


看了看时间,已经3点过了,突然想写点什么,却又不知从何说起。

那就从今天这个用irrlicht做天龙八部的模型换装说起吧。

 

也不知道是为什么,最近又捣鼓起了OGRE和irrlicht. 并且,总想用irrlicht实现一些OGRE中的东西。

当然,这不是商业项目,也没有商业目的,纯属蛋疼而已。

 

一切行动的由来,都来自于vczh那天晚上的举动。

记得有一天晚上在群里聊天,大伙就称赞各位菊苣是多么的厉害。

最后vc发了一个自己的桌面截图说:让你们看看菊苣是如何练成的(这不是原话,和话的字眼有出入,在此不想负任何责任,如果真有想看的,去翻群的聊天记录)

那天晚上,我想了很久。想想自己自从转做页游以后,是如何虚渡光阴的。

终于忍不住了,翻开了自己的移动硬盘,看看自己曾经做过的小东西。90%是建好工程就没理了。

这才明白,我花在思考上的时间远远大于了行动。 于是,我决定改变自己,找回那个真的我。

 

3D游戏是我的真爱, 真爱到就算画面差一点,只要是3D,我也会很喜欢。

于是,我觉得自己还是应该接着先前的路走下去。 什么服务器,什么 AS3. 都是浮云, 不喜欢就是不喜欢。

私下又开始研究irrlicht了。

猛地一发现,自己是多么的搞笑, 从09年到11年,一直在做引擎开发, 也翻过irrlicht和ogre无数遍。 却从来就没有写完过一个完整的DEMO。

连功能测试用例都没有写过。突然觉得之前的一些设计似乎有些脱离了实际。没有真正使用过,又怎知如何是好,如何是坏呢?

 

这一次是真的玩irrlicht了, 中间也纠结过是不是OGRE更适合。 但在目前这个时间有限的空间下,我更愿意玩irrlicht.小巧,轻便。 当然,意味着更多东西要自己实现。 不过对于一个代码控来说,也反而更自得其乐。 正好可以在短路的时候,去参考一下其它引擎,用来扩充irrlicht.

我要做的不是把irrlicht整得牛B,而是想自己弄弄,加上移动平台的崛起,我觉得irrlicht更加适合吧。 据说gameloft也有使用(仅是据说)。

 

可能很多兄弟会说我这讲的东西,其实就是一坨屎了。 不过,我觉得再坏的评论,也表示一种关注。 批评好过于无视啊~~~~

 

我是多么多么的纠结


纠结1:换装需要场景节点配合

  在irrlicht中,并没有提供普通引擎中的submesh或者bodypart这种东西,用于直接支持换装。 在irrlicht中,如果想要换装,最直接的方法就是依赖于场景结点

比如,在我的示例中,可以更换头发,帽子,衣服,护腕,靴子,面容。 那就需要7个场景节点,1个作为根节点,用于控制整个角色的世界坐标,平移,缩放,旋转等属性。另外6个场景节点则分别绑有各个部件的模型

贴一下我的角色类的代码,行数不多

复制代码
class CCharactor 
{ 
    IrrlichtDevice* m_pDevice; 
    IAnimatedMeshSceneNode* m_pBodyParts[eCBPT_Num]; 
    ISceneNode* m_pRoot; 
public: 
    CCharactor(IrrlichtDevice* pDevice) 
        :m_pDevice(pDevice) 
    { 
        memset(m_pBodyParts,0,sizeof(m_pBodyParts)); 
        m_pRoot = pDevice->getSceneManager()->addEmptySceneNode(NULL,12345); 
    } 
    void changeBodyPart(ECharactorBodyPartType ePartType,stringw& meshPath,stringw& metrialPath) 
    { 
        ISceneManager* smgr = m_pDevice->getSceneManager(); 

        IAnimatedMeshSceneNode* pBpNode = m_pBodyParts[ePartType]; 
        IAnimatedMesh* pMesh = smgr->getMesh(meshPath.c_str()); 
        if(pMesh==NULL) 
            return; 

        if(pBpNode==NULL) 
        { 
            pBpNode = smgr->addAnimatedMeshSceneNode(pMesh,m_pRoot); 
            m_pBodyParts[ePartType] = pBpNode; 
        } 
        else 
        { 
            pBpNode->setMesh(pMesh); 
        } 
        ITexture* pTexture = m_pDevice->getVideoDriver()->getTexture(metrialPath.c_str()); 
        if(pTexture) 
            pBpNode->setMaterialTexture(0,pTexture); 
    } 
};

 

//然后,我用了一个结构体来构建部件信息

struct SBodyPartInfo 
{ 
    stringw Desc; 
    ECharactorBodyPartType Type; 
    stringw MeshPath; 
    stringw MeterialPath; 
};
复制代码

 

 

纠结2:共享骨骼

首先,irrlicht 1.8中对OGRE模型的格式支持在代码中,最高只看到了1.40版本的解析,更高的就会被无视。 天龙八部的模型有几个是1.30的,而用于换装和主角的,都是1.40的。 可能是解析不全的原因,导致1.40的骨骼动画无法正常播放。 这个问题整了几个小时,没有解决,明天继续

其次,多个模型共享骨骼只能通过场景节点的useAnimationFrom来完成,并且传入的是一个Mesh参数。这点让人蛋疼, 天龙八部的角色动作是分开了的,不同的攻击动作是一个skeleton文件。 想要实现共享,有点麻烦。

 

纠结3:模型文件格式

irrlicht不像OGRE那样有一个强大且成熟的模型文件格式,虽然提供了.irr格式,但仅是用于irrEdit的场景信息输出。先看一张图

image

这张图是irrlicht samples中的MeshViewer的提示框内容。 上面列出了可以支持的模型文件类型。 大家可以看看,又有多少模型格式是可以直接拿来放到项目上用的呢? mdl和ms3d可以考虑,dae的话,我在开源游戏0 A.D. 中见到使用过。 其它的话,就完全不熟悉了。 OGRE的 .mesh支持也不完全。 难道真要自己整一个。

我能想到的,就是选一个插件完整和模型和动画格式都比较好的作为与美术工具交互的格式。 自己再写一个工具,转换成自己的格式。

 

纠结4:硬件蒙皮

我以为像NIKO那样的技术狂,怎么会放掉这一个特性。 很高兴地在场景节点上发现了硬件蒙皮的函数接口。但一看注释,把我咽着了。

//! (This feature is not implemented in irrlicht yet) 
virtual bool setHardwareSkinning(bool on);

 

成果展示


其它地方,还没有去整,就先不发表言论了。 继续着这个很傻B,很天真的捣鼓之路。

上个图,纪念一下我的irrlicht产物。

 

布衣

image

 

换了身盔甲

image

 

换了帽子和靴子

image

 

PS:头发没有纹理,所以是白的。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2013/03/24/2978006.html

目录
相关文章
|
8月前
|
监控 数据可视化 测试技术
16_LLM交互式调试:用Streamlit构建可视化工具
在大语言模型(LLM)的应用开发过程中,调试一直是一个复杂且具有挑战性的任务。传统的调试方法往往依赖于静态日志、断点调试和反复的命令行交互,这种方式在处理LLM这类黑盒模型时显得尤为低效。随着2025年LLM技术的普及和应用场景的多样化,开发人员迫切需要一种更加直观、高效的调试方式。
784 0
|
传感器 自然语言处理 监控
快速部署实现Bolt.diy
Bolt.diy 是 Bolt.new 的开源版本,提供灵活的自然语言交互与全栈开发支持。基于阿里云函数计算 FC 和百炼模型服务,最快5分钟完成部署。新手注册阿里云账号后可领取免费额度,按指引开通相关服务并授权。通过项目模板一键部署,配置 API-KEY 后即可使用。Bolt.diy 支持多种场景,如物联网原型开发、久坐提醒、语音控制灯光等,助力快速实现创意应用。
2654 22
|
JavaScript C++ Windows
VS code运行vue项目
VS code运行vue项目
1717 0
|
弹性计算 Serverless 数据安全/隐私保护
针对【图像生成 - ComfyUI】使用的深度评测
ComfyUI 是一款支持自定义工作流的图像生成工具,适用于创意设计、游戏开发和电商等多个行业。它能根据项目需求灵活调整图像生成流程,提高创意实现效率,同时具备成本效益和弹性伸缩能力,适应业务量变化。尽管如此,ComfyUI 在技术门槛和数据安全方面仍存在挑战,需注意非专业用户的学习曲线和敏感数据保护。
|
存储 安全 程序员
47.9K star!全平台开源笔记神器,隐私安全首选!
Joplin 是一款开源的笔记记录和待办事项应用,拥有 47.9K star,支持 Windows、macOS、Linux、iOS 和 Android 全平台同步。它采用端到端加密,确保数据隐私安全,支持 Markdown 编辑、数学公式、流程图等丰富功能,并可通过插件扩展实现更多定制化需求。Joplin 完美替代商业笔记软件,适用于程序员知识库、个人事务管理及团队协作等多种场景。
1820 1
|
Rust 安全 Linux
如何使用 rust 写内核模块
近年来,Rust 语言以内存安全、高可靠性、零抽象等能力获得大量开发者关注,而这些特性恰好是内核编程中所需要的,所以我们看下如何用rust来写Linux内核模块。
697 99
如何使用 rust 写内核模块
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
|
存储 缓存 JavaScript
提升Blazor应用性能的探索之旅:深入解析关键技巧与最佳实践
【8月更文挑战第31天】在开发现代Web应用时,性能与用户体验至关重要。Blazor作为一款使用.NET构建交互式Web UI的框架,提供了诸多便利。为了充分发挥其潜力并优化体验,掌握一些性能提升技巧十分必要。本文将分享几个实用的Blazor性能优化方法,包括减少不必要的服务器端调用、使用懒加载以及优化DOM操作。通过这些技巧,可以显著提升应用性能,为用户提供更流畅的体验。以下是具体方法及示例代码。
414 0
|
人工智能 开发工具 计算机视觉
AI计算机视觉笔记十:结印动作识别
该项目基于恩培大佬的《火影结印识别》小项目,使用yolov5实现手势识别功能。项目包含数据集准备、模型训练和代码实现,可在无GPU环境下运行。代码利用状态机检测手势序列,完成特定结印后触发音效播放。[GitHub地址](https://github.com/enpeizhao/CVprojects)提供了详细步骤和示例代码。
|
移动开发 前端开发 JavaScript
高级前端工程师必备的技能
【7月更文挑战第8天】 **高级前端工程师**精通HTML5/CSS3/JavaScript,擅长React、Vue等框架,掌握性能优化、代码质量保证,能设计可扩展架构,处理前端安全,熟悉跨平台开发,持续学习新技术并领导团队,是技术与管理的结合体。他们对提升用户体验和推动技术创新起关键作用。
1637 12